diff --git a/BUILDING.md b/BUILDING.md
index 2d5a10119..d52ed0d94 100644
--- a/BUILDING.md
+++ b/BUILDING.md
@@ -71,9 +71,7 @@ commands, such as `go test`, should work per package (please see
 A `Makefile` has been provided as a convenience to support repeatable builds.
 Please install the following into `GOPATH` for it to work:
 
-    go get github.com/tools/godep github.com/golang/lint/golint
-
-**TODO(stevvooe):** Add a `make setup` command to Makefile to run this. Have to think about how to interact with Godeps properly.
+    go get github.com/golang/lint/golint
 
 Once these commands are available in the `GOPATH`, run `make` to get a full
 build:
@@ -105,8 +103,8 @@ build:
     + /Users/sday/go/src/github.com/docker/distribution/bin/registry-api-descriptor-template
     + binaries
 
-The above provides a repeatable build using the contents of the vendored
-Godeps directory. This includes formatting, vetting, linting, building,
+The above provides a repeatable build using the contents of the vendor
+directory. This includes formatting, vetting, linting, building,
 testing and generating tagged binaries. We can verify this worked by running
 the registry binary generated in the "./bin" directory:
 
diff --git a/Godeps/Godeps.json b/Godeps/Godeps.json
deleted file mode 100644
index 8985d1ffd..000000000
--- a/Godeps/Godeps.json
+++ /dev/null
@@ -1,458 +0,0 @@
-{
-	"ImportPath": "github.com/docker/distribution",
-	"GoVersion": "go1.6",
-	"GodepVersion": "v74",
-	"Packages": [
-		"./..."
-	],
-	"Deps": [
-		{
-			"ImportPath": "github.com/Azure/azure-sdk-for-go/storage",
-			"Comment": "v5.0.0-beta-6-g0b5fe2a",
-			"Rev": "0b5fe2abe0271ba07049eacaa65922d67c319543"
-		},
-		{
-			"ImportPath": "github.com/Sirupsen/logrus",
-			"Comment": "v0.7.3",
-			"Rev": "55eb11d21d2a31a3cc93838241d04800f52e823d"
-		},
-		{
-			"ImportPath": "github.com/Sirupsen/logrus/formatters/logstash",
-			"Comment": "v0.7.3",
-			"Rev": "55eb11d21d2a31a3cc93838241d04800f52e823d"
-		},
-		{
-			"ImportPath": "github.com/aws/aws-sdk-go/aws",
-			"Comment": "v1.2.4",
-			"Rev": "90dec2183a5f5458ee79cbaf4b8e9ab910bc81a6"
-		},
-		{
-			"ImportPath": "github.com/aws/aws-sdk-go/aws/awserr",
-			"Comment": "v1.2.4",
-			"Rev": "90dec2183a5f5458ee79cbaf4b8e9ab910bc81a6"
-		},
-		{
-			"ImportPath": "github.com/aws/aws-sdk-go/aws/awsutil",
-			"Comment": "v1.2.4",
-			"Rev": "90dec2183a5f5458ee79cbaf4b8e9ab910bc81a6"
-		},
-		{
-			"ImportPath": "github.com/aws/aws-sdk-go/aws/client",
-			"Comment": "v1.2.4",
-			"Rev": "90dec2183a5f5458ee79cbaf4b8e9ab910bc81a6"
-		},
-		{
-			"ImportPath": "github.com/aws/aws-sdk-go/aws/client/metadata",
-			"Comment": "v1.2.4",
-			"Rev": "90dec2183a5f5458ee79cbaf4b8e9ab910bc81a6"
-		},
-		{
-			"ImportPath": "github.com/aws/aws-sdk-go/aws/corehandlers",
-			"Comment": "v1.2.4",
-			"Rev": "90dec2183a5f5458ee79cbaf4b8e9ab910bc81a6"
-		},
-		{
-			"ImportPath": "github.com/aws/aws-sdk-go/aws/credentials",
-			"Comment": "v1.2.4",
-			"Rev": "90dec2183a5f5458ee79cbaf4b8e9ab910bc81a6"
-		},
-		{
-			"ImportPath": "github.com/aws/aws-sdk-go/aws/credentials/ec2rolecreds",
-			"Comment": "v1.2.4",
-			"Rev": "90dec2183a5f5458ee79cbaf4b8e9ab910bc81a6"
-		},
-		{
-			"ImportPath": "github.com/aws/aws-sdk-go/aws/defaults",
-			"Comment": "v1.2.4",
-			"Rev": "90dec2183a5f5458ee79cbaf4b8e9ab910bc81a6"
-		},
-		{
-			"ImportPath": "github.com/aws/aws-sdk-go/aws/ec2metadata",
-			"Comment": "v1.2.4",
-			"Rev": "90dec2183a5f5458ee79cbaf4b8e9ab910bc81a6"
-		},
-		{
-			"ImportPath": "github.com/aws/aws-sdk-go/aws/request",
-			"Comment": "v1.2.4",
-			"Rev": "90dec2183a5f5458ee79cbaf4b8e9ab910bc81a6"
-		},
-		{
-			"ImportPath": "github.com/aws/aws-sdk-go/aws/session",
-			"Comment": "v1.2.4",
-			"Rev": "90dec2183a5f5458ee79cbaf4b8e9ab910bc81a6"
-		},
-		{
-			"ImportPath": "github.com/aws/aws-sdk-go/aws/signer/v4",
-			"Comment": "v1.2.4",
-			"Rev": "90dec2183a5f5458ee79cbaf4b8e9ab910bc81a6"
-		},
-		{
-			"ImportPath": "github.com/aws/aws-sdk-go/private/endpoints",
-			"Comment": "v1.2.4",
-			"Rev": "90dec2183a5f5458ee79cbaf4b8e9ab910bc81a6"
-		},
-		{
-			"ImportPath": "github.com/aws/aws-sdk-go/private/protocol",
-			"Comment": "v1.2.4",
-			"Rev": "90dec2183a5f5458ee79cbaf4b8e9ab910bc81a6"
-		},
-		{
-			"ImportPath": "github.com/aws/aws-sdk-go/private/protocol/query",
-			"Comment": "v1.2.4",
-			"Rev": "90dec2183a5f5458ee79cbaf4b8e9ab910bc81a6"
-		},
-		{
-			"ImportPath": "github.com/aws/aws-sdk-go/private/protocol/query/queryutil",
-			"Comment": "v1.2.4",
-			"Rev": "90dec2183a5f5458ee79cbaf4b8e9ab910bc81a6"
-		},
-		{
-			"ImportPath": "github.com/aws/aws-sdk-go/private/protocol/rest",
-			"Comment": "v1.2.4",
-			"Rev": "90dec2183a5f5458ee79cbaf4b8e9ab910bc81a6"
-		},
-		{
-			"ImportPath": "github.com/aws/aws-sdk-go/private/protocol/restxml",
-			"Comment": "v1.2.4",
-			"Rev": "90dec2183a5f5458ee79cbaf4b8e9ab910bc81a6"
-		},
-		{
-			"ImportPath": "github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil",
-			"Comment": "v1.2.4",
-			"Rev": "90dec2183a5f5458ee79cbaf4b8e9ab910bc81a6"
-		},
-		{
-			"ImportPath": "github.com/aws/aws-sdk-go/private/waiter",
-			"Comment": "v1.2.4",
-			"Rev": "90dec2183a5f5458ee79cbaf4b8e9ab910bc81a6"
-		},
-		{
-			"ImportPath": "github.com/aws/aws-sdk-go/service/cloudfront/sign",
-			"Comment": "v1.2.4",
-			"Rev": "90dec2183a5f5458ee79cbaf4b8e9ab910bc81a6"
-		},
-		{
-			"ImportPath": "github.com/aws/aws-sdk-go/service/s3",
-			"Comment": "v1.2.4",
-			"Rev": "90dec2183a5f5458ee79cbaf4b8e9ab910bc81a6"
-		},
-		{
-			"ImportPath": "github.com/aws/aws-sdk-go/vendor/github.com/go-ini/ini",
-			"Comment": "v1.2.4",
-			"Rev": "90dec2183a5f5458ee79cbaf4b8e9ab910bc81a6"
-		},
-		{
-			"ImportPath": "github.com/aws/aws-sdk-go/vendor/github.com/jmespath/go-jmespath",
-			"Comment": "v1.2.4",
-			"Rev": "90dec2183a5f5458ee79cbaf4b8e9ab910bc81a6"
-		},
-		{
-			"ImportPath": "github.com/bugsnag/bugsnag-go",
-			"Comment": "v1.0.2-5-gb1d1530",
-			"Rev": "b1d153021fcd90ca3f080db36bec96dc690fb274"
-		},
-		{
-			"ImportPath": "github.com/bugsnag/bugsnag-go/errors",
-			"Comment": "v1.0.2-5-gb1d1530",
-			"Rev": "b1d153021fcd90ca3f080db36bec96dc690fb274"
-		},
-		{
-			"ImportPath": "github.com/bugsnag/osext",
-			"Rev": "0dd3f918b21bec95ace9dc86c7e70266cfc5c702"
-		},
-		{
-			"ImportPath": "github.com/bugsnag/panicwrap",
-			"Comment": "1.0.0-2-ge2c2850",
-			"Rev": "e2c28503fcd0675329da73bf48b33404db873782"
-		},
-		{
-			"ImportPath": "github.com/denverdino/aliyungo/common",
-			"Rev": "afedced274aa9a7fcdd47ac97018f0f8db4e5de2"
-		},
-		{
-			"ImportPath": "github.com/denverdino/aliyungo/oss",
-			"Rev": "afedced274aa9a7fcdd47ac97018f0f8db4e5de2"
-		},
-		{
-			"ImportPath": "github.com/denverdino/aliyungo/util",
-			"Rev": "afedced274aa9a7fcdd47ac97018f0f8db4e5de2"
-		},
-		{
-			"ImportPath": "github.com/docker/goamz/aws",
-			"Rev": "f0a21f5b2e12f83a505ecf79b633bb2035cf6f85"
-		},
-		{
-			"ImportPath": "github.com/docker/goamz/s3",
-			"Rev": "f0a21f5b2e12f83a505ecf79b633bb2035cf6f85"
-		},
-		{
-			"ImportPath": "github.com/docker/libtrust",
-			"Rev": "fa567046d9b14f6aa788882a950d69651d230b21"
-		},
-		{
-			"ImportPath": "github.com/garyburd/redigo/internal",
-			"Rev": "535138d7bcd717d6531c701ef5933d98b1866257"
-		},
-		{
-			"ImportPath": "github.com/garyburd/redigo/redis",
-			"Rev": "535138d7bcd717d6531c701ef5933d98b1866257"
-		},
-		{
-			"ImportPath": "github.com/golang/protobuf/proto",
-			"Rev": "8d92cf5fc15a4382f8964b08e1f42a75c0591aa3"
-		},
-		{
-			"ImportPath": "github.com/gorilla/context",
-			"Rev": "14f550f51af52180c2eefed15e5fd18d63c0a64a"
-		},
-		{
-			"ImportPath": "github.com/gorilla/handlers",
-			"Rev": "60c7bfde3e33c201519a200a4507a158cc03a17b"
-		},
-		{
-			"ImportPath": "github.com/gorilla/mux",
-			"Rev": "e444e69cbd2e2e3e0749a2f3c717cec491552bbf"
-		},
-		{
-			"ImportPath": "github.com/inconshreveable/mousetrap",
-			"Rev": "76626ae9c91c4f2a10f34cad8ce83ea42c93bb75"
-		},
-		{
-			"ImportPath": "github.com/mitchellh/mapstructure",
-			"Rev": "482a9fd5fa83e8c4e7817413b80f3eb8feec03ef"
-		},
-		{
-			"ImportPath": "github.com/ncw/swift",
-			"Rev": "b964f2ca856aac39885e258ad25aec08d5f64ee6"
-		},
-		{
-			"ImportPath": "github.com/ncw/swift/swifttest",
-			"Rev": "b964f2ca856aac39885e258ad25aec08d5f64ee6"
-		},
-		{
-			"ImportPath": "github.com/spf13/cobra",
-			"Rev": "312092086bed4968099259622145a0c9ae280064"
-		},
-		{
-			"ImportPath": "github.com/spf13/pflag",
-			"Rev": "5644820622454e71517561946e3d94b9f9db6842"
-		},
-		{
-			"ImportPath": "github.com/stevvooe/resumable",
-			"Rev": "51ad44105773cafcbe91927f70ac68e1bf78f8b4"
-		},
-		{
-			"ImportPath": "github.com/stevvooe/resumable/sha256",
-			"Rev": "51ad44105773cafcbe91927f70ac68e1bf78f8b4"
-		},
-		{
-			"ImportPath": "github.com/stevvooe/resumable/sha512",
-			"Rev": "51ad44105773cafcbe91927f70ac68e1bf78f8b4"
-		},
-		{
-			"ImportPath": "github.com/yvasiyarov/go-metrics",
-			"Rev": "57bccd1ccd43f94bb17fdd8bf3007059b802f85e"
-		},
-		{
-			"ImportPath": "github.com/yvasiyarov/gorelic",
-			"Comment": "v0.0.6-8-ga9bba5b",
-			"Rev": "a9bba5b9ab508a086f9a12b8c51fab68478e2128"
-		},
-		{
-			"ImportPath": "github.com/yvasiyarov/newrelic_platform_go",
-			"Rev": "b21fdbd4370f3717f3bbd2bf41c223bc273068e6"
-		},
-		{
-			"ImportPath": "golang.org/x/crypto/bcrypt",
-			"Rev": "c10c31b5e94b6f7a0283272dc2bb27163dcea24b"
-		},
-		{
-			"ImportPath": "golang.org/x/crypto/blowfish",
-			"Rev": "c10c31b5e94b6f7a0283272dc2bb27163dcea24b"
-		},
-		{
-			"ImportPath": "golang.org/x/crypto/ocsp",
-			"Rev": "c10c31b5e94b6f7a0283272dc2bb27163dcea24b"
-		},
-		{
-			"ImportPath": "golang.org/x/net/context",
-			"Rev": "4876518f9e71663000c348837735820161a42df7"
-		},
-		{
-			"ImportPath": "golang.org/x/net/context/ctxhttp",
-			"Rev": "4876518f9e71663000c348837735820161a42df7"
-		},
-		{
-			"ImportPath": "golang.org/x/net/http2",
-			"Rev": "4876518f9e71663000c348837735820161a42df7"
-		},
-		{
-			"ImportPath": "golang.org/x/net/http2/hpack",
-			"Rev": "4876518f9e71663000c348837735820161a42df7"
-		},
-		{
-			"ImportPath": "golang.org/x/net/internal/timeseries",
-			"Rev": "4876518f9e71663000c348837735820161a42df7"
-		},
-		{
-			"ImportPath": "golang.org/x/net/trace",
-			"Rev": "4876518f9e71663000c348837735820161a42df7"
-		},
-		{
-			"ImportPath": "golang.org/x/oauth2",
-			"Rev": "045497edb6234273d67dbc25da3f2ddbc4c4cacf"
-		},
-		{
-			"ImportPath": "golang.org/x/oauth2/google",
-			"Rev": "045497edb6234273d67dbc25da3f2ddbc4c4cacf"
-		},
-		{
-			"ImportPath": "golang.org/x/oauth2/internal",
-			"Rev": "045497edb6234273d67dbc25da3f2ddbc4c4cacf"
-		},
-		{
-			"ImportPath": "golang.org/x/oauth2/jws",
-			"Rev": "045497edb6234273d67dbc25da3f2ddbc4c4cacf"
-		},
-		{
-			"ImportPath": "golang.org/x/oauth2/jwt",
-			"Rev": "045497edb6234273d67dbc25da3f2ddbc4c4cacf"
-		},
-		{
-			"ImportPath": "golang.org/x/time/rate",
-			"Rev": "a4bde12657593d5e90d0533a3e4fd95e635124cb"
-		},
-		{
-			"ImportPath": "google.golang.org/api/gensupport",
-			"Rev": "9bf6e6e569ff057f75d9604a46c52928f17d2b54"
-		},
-		{
-			"ImportPath": "google.golang.org/api/googleapi",
-			"Rev": "9bf6e6e569ff057f75d9604a46c52928f17d2b54"
-		},
-		{
-			"ImportPath": "google.golang.org/api/googleapi/internal/uritemplates",
-			"Rev": "9bf6e6e569ff057f75d9604a46c52928f17d2b54"
-		},
-		{
-			"ImportPath": "google.golang.org/api/storage/v1",
-			"Rev": "9bf6e6e569ff057f75d9604a46c52928f17d2b54"
-		},
-		{
-			"ImportPath": "google.golang.org/appengine",
-			"Rev": "12d5545dc1cfa6047a286d5e853841b6471f4c19"
-		},
-		{
-			"ImportPath": "google.golang.org/appengine/internal",
-			"Rev": "12d5545dc1cfa6047a286d5e853841b6471f4c19"
-		},
-		{
-			"ImportPath": "google.golang.org/appengine/internal/app_identity",
-			"Rev": "12d5545dc1cfa6047a286d5e853841b6471f4c19"
-		},
-		{
-			"ImportPath": "google.golang.org/appengine/internal/base",
-			"Rev": "12d5545dc1cfa6047a286d5e853841b6471f4c19"
-		},
-		{
-			"ImportPath": "google.golang.org/appengine/internal/datastore",
-			"Rev": "12d5545dc1cfa6047a286d5e853841b6471f4c19"
-		},
-		{
-			"ImportPath": "google.golang.org/appengine/internal/log",
-			"Rev": "12d5545dc1cfa6047a286d5e853841b6471f4c19"
-		},
-		{
-			"ImportPath": "google.golang.org/appengine/internal/modules",
-			"Rev": "12d5545dc1cfa6047a286d5e853841b6471f4c19"
-		},
-		{
-			"ImportPath": "google.golang.org/appengine/internal/remote_api",
-			"Rev": "12d5545dc1cfa6047a286d5e853841b6471f4c19"
-		},
-		{
-			"ImportPath": "google.golang.org/cloud",
-			"Rev": "975617b05ea8a58727e6c1a06b6161ff4185a9f2"
-		},
-		{
-			"ImportPath": "google.golang.org/cloud/compute/metadata",
-			"Rev": "975617b05ea8a58727e6c1a06b6161ff4185a9f2"
-		},
-		{
-			"ImportPath": "google.golang.org/cloud/internal",
-			"Rev": "975617b05ea8a58727e6c1a06b6161ff4185a9f2"
-		},
-		{
-			"ImportPath": "google.golang.org/cloud/internal/opts",
-			"Rev": "975617b05ea8a58727e6c1a06b6161ff4185a9f2"
-		},
-		{
-			"ImportPath": "google.golang.org/cloud/storage",
-			"Rev": "975617b05ea8a58727e6c1a06b6161ff4185a9f2"
-		},
-		{
-			"ImportPath": "google.golang.org/grpc",
-			"Rev": "d3ddb4469d5a1b949fc7a7da7c1d6a0d1b6de994"
-		},
-		{
-			"ImportPath": "google.golang.org/grpc/codes",
-			"Rev": "d3ddb4469d5a1b949fc7a7da7c1d6a0d1b6de994"
-		},
-		{
-			"ImportPath": "google.golang.org/grpc/credentials",
-			"Rev": "d3ddb4469d5a1b949fc7a7da7c1d6a0d1b6de994"
-		},
-		{
-			"ImportPath": "google.golang.org/grpc/grpclog",
-			"Rev": "d3ddb4469d5a1b949fc7a7da7c1d6a0d1b6de994"
-		},
-		{
-			"ImportPath": "google.golang.org/grpc/internal",
-			"Rev": "d3ddb4469d5a1b949fc7a7da7c1d6a0d1b6de994"
-		},
-		{
-			"ImportPath": "google.golang.org/grpc/metadata",
-			"Rev": "d3ddb4469d5a1b949fc7a7da7c1d6a0d1b6de994"
-		},
-		{
-			"ImportPath": "google.golang.org/grpc/naming",
-			"Rev": "d3ddb4469d5a1b949fc7a7da7c1d6a0d1b6de994"
-		},
-		{
-			"ImportPath": "google.golang.org/grpc/peer",
-			"Rev": "d3ddb4469d5a1b949fc7a7da7c1d6a0d1b6de994"
-		},
-		{
-			"ImportPath": "google.golang.org/grpc/transport",
-			"Rev": "d3ddb4469d5a1b949fc7a7da7c1d6a0d1b6de994"
-		},
-		{
-			"ImportPath": "gopkg.in/check.v1",
-			"Rev": "64131543e7896d5bcc6bd5a76287eb75ea96c673"
-		},
-		{
-			"ImportPath": "gopkg.in/yaml.v2",
-			"Rev": "bef53efd0c76e49e6de55ead051f886bea7e9420"
-		},
-		{
-			"ImportPath": "rsc.io/letsencrypt",
-			"Rev": "a019c9e6fce0c7132679dea13bd8df7c86ffe26c"
-		},
-		{
-			"ImportPath": "rsc.io/letsencrypt/vendor/github.com/xenolf/lego/acme",
-			"Rev": "a019c9e6fce0c7132679dea13bd8df7c86ffe26c"
-		},
-		{
-			"ImportPath": "rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1",
-			"Rev": "a019c9e6fce0c7132679dea13bd8df7c86ffe26c"
-		},
-		{
-			"ImportPath": "rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/cipher",
-			"Rev": "a019c9e6fce0c7132679dea13bd8df7c86ffe26c"
-		},
-		{
-			"ImportPath": "rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/json",
-			"Rev": "a019c9e6fce0c7132679dea13bd8df7c86ffe26c"
-		}
-	]
-}
diff --git a/Godeps/Readme b/Godeps/Readme
deleted file mode 100644
index 4cdaa53d5..000000000
--- a/Godeps/Readme
+++ /dev/null
@@ -1,5 +0,0 @@
-This directory tree is generated automatically by godep.
-
-Please do not edit.
-
-See https://github.com/tools/godep for more information.
diff --git a/Makefile b/Makefile
index 47b8f1d0b..339bbc438 100644
--- a/Makefile
+++ b/Makefile
@@ -35,7 +35,7 @@ PKGS=$(shell go list -tags "${DOCKER_BUILDTAGS}" ./... | grep -v ^github.com/doc
 
 # Resolving binary dependencies for specific targets
 GOLINT=$(shell which golint || echo '')
-GODEP=$(shell which godep || echo '')
+VNDR=$(shell which vndr || echo '')
 
 ${PREFIX}/bin/registry: $(GOFILES)
 	@echo "+ $@"
@@ -86,24 +86,13 @@ clean:
 	@echo "+ $@"
 	@rm -rf "${PREFIX}/bin/registry" "${PREFIX}/bin/digest" "${PREFIX}/bin/registry-api-descriptor-template"
 
-dep-save:
-	@echo "+ $@"
-	$(if $(GODEP), , \
-		$(error Please install godep: go get github.com/tools/godep))
-	@$(GODEP) save $(PKGS)
-
-dep-restore:
-	@echo "+ $@"
-	$(if $(GODEP), , \
-		$(error Please install godep: go get github.com/tools/godep))
-	@$(GODEP) restore -v
-
-dep-validate: dep-restore
+dep-validate:
 	@echo "+ $@"
+	$(if $(VNDR), , \
+		$(error Please install vndr: go get github.com/lk4d4/vndr))
 	@rm -Rf .vendor.bak
 	@mv vendor .vendor.bak
-	@rm -Rf Godeps
-	@$(GODEP) save ./...
+	@$(VNDR)
 	@test -z "$$(diff -r vendor .vendor.bak 2>&1 | tee /dev/stderr)" || \
-		(echo >&2 "+ borked dependencies! what you have in Godeps/Godeps.json does not match with what you have in vendor" && false)
+		(echo >&2 "+ inconsistent dependencies! what you have in vendor.conf does not match with what you have in vendor" && false)
 	@rm -Rf .vendor.bak
diff --git a/circle.yml b/circle.yml
index 61f8be0cb..76276763a 100644
--- a/circle.yml
+++ b/circle.yml
@@ -34,7 +34,7 @@ dependencies:
 
   override:
   # Install dependencies for every copied clone/go version
-    - gvm use stable && go get github.com/tools/godep:
+    - gvm use stable && go get github.com/lk4d4/vndr:
         pwd: $BASE_STABLE
 
   post:
@@ -49,14 +49,13 @@ test:
     # - gvm use old && go version
     - gvm use stable && go version
 
-  # todo(richard): replace with a more robust vendoring solution. Removed due to a fundamental disagreement in godep philosophies.
   # Ensure validation of dependencies
-  #    - gvm use stable && if test -n "`git diff --stat=1000 master | grep -Ei \"vendor|godeps\"`"; then make dep-validate; fi:
-  #      pwd: $BASE_STABLE
+    - gvm use stable && if test -n "`git diff --stat=1000 master | grep -E \"^[[:space:]]*vendor\"`"; then make dep-validate; fi:
+        pwd: $BASE_STABLE
 
   # First thing: build everything. This will catch compile errors, and it's
   # also necessary for go vet to work properly (see #807).
-    - gvm use stable && godep go install $(go list ./... | grep -v "/vendor/"):
+    - gvm use stable && go install $(go list ./... | grep -v "/vendor/"):
         pwd: $BASE_STABLE
 
   # FMT
@@ -73,12 +72,12 @@ test:
 
   override:
   # Test stable, and report
-     - gvm use stable; export ROOT_PACKAGE=$(go list .); go list -tags "$DOCKER_BUILDTAGS" ./... | grep -v "/vendor/" | xargs -L 1 -I{} bash -c 'export PACKAGE={}; godep go test -tags "$DOCKER_BUILDTAGS" -test.short -coverprofile=$GOPATH/src/$PACKAGE/coverage.out -coverpkg=$(./coverpkg.sh $PACKAGE $ROOT_PACKAGE) $PACKAGE':
+     - gvm use stable; export ROOT_PACKAGE=$(go list .); go list -tags "$DOCKER_BUILDTAGS" ./... | grep -v "/vendor/" | xargs -L 1 -I{} bash -c 'export PACKAGE={}; go test -tags "$DOCKER_BUILDTAGS" -test.short -coverprofile=$GOPATH/src/$PACKAGE/coverage.out -coverpkg=$(./coverpkg.sh $PACKAGE $ROOT_PACKAGE) $PACKAGE':
          timeout: 1000
          pwd: $BASE_STABLE
 
   # Test stable with race
-     - gvm use stable; export ROOT_PACKAGE=$(go list .); go list -tags "$DOCKER_BUILDTAGS" ./... | grep -v "/vendor/" | grep -v "registry/handlers" | grep -v "registry/storage/driver" | xargs -L 1 -I{} bash -c 'export PACKAGE={}; godep go test -race -tags "$DOCKER_BUILDTAGS" -test.short $PACKAGE':
+     - gvm use stable; export ROOT_PACKAGE=$(go list .); go list -tags "$DOCKER_BUILDTAGS" ./... | grep -v "/vendor/" | grep -v "registry/handlers" | grep -v "registry/storage/driver" | xargs -L 1 -I{} bash -c 'export PACKAGE={}; go test -race -tags "$DOCKER_BUILDTAGS" -test.short $PACKAGE':
          timeout: 1000
          pwd: $BASE_STABLE
   post:
diff --git a/vendor.conf b/vendor.conf
new file mode 100644
index 000000000..7ebddd06c
--- /dev/null
+++ b/vendor.conf
@@ -0,0 +1,39 @@
+github.com/Azure/azure-sdk-for-go/storage 0b5fe2abe0271ba07049eacaa65922d67c319543
+github.com/Sirupsen/logrus 55eb11d21d2a31a3cc93838241d04800f52e823d
+github.com/aws/aws-sdk-go 90dec2183a5f5458ee79cbaf4b8e9ab910bc81a6
+github.com/bugsnag/bugsnag-go b1d153021fcd90ca3f080db36bec96dc690fb274
+github.com/bugsnag/osext 0dd3f918b21bec95ace9dc86c7e70266cfc5c702
+github.com/bugsnag/panicwrap e2c28503fcd0675329da73bf48b33404db873782
+github.com/denverdino/aliyungo afedced274aa9a7fcdd47ac97018f0f8db4e5de2
+github.com/docker/goamz f0a21f5b2e12f83a505ecf79b633bb2035cf6f85
+github.com/docker/libtrust fa567046d9b14f6aa788882a950d69651d230b21
+github.com/garyburd/redigo 535138d7bcd717d6531c701ef5933d98b1866257
+github.com/go-ini/ini 2ba15ac2dc9cdf88c110ec2dc0ced7fa45f5678c
+github.com/golang/protobuf/proto 8d92cf5fc15a4382f8964b08e1f42a75c0591aa3
+github.com/gorilla/context 14f550f51af52180c2eefed15e5fd18d63c0a64a
+github.com/gorilla/handlers 60c7bfde3e33c201519a200a4507a158cc03a17b
+github.com/gorilla/mux e444e69cbd2e2e3e0749a2f3c717cec491552bbf
+github.com/inconshreveable/mousetrap 76626ae9c91c4f2a10f34cad8ce83ea42c93bb75
+github.com/jmespath/go-jmespath bd40a432e4c76585ef6b72d3fd96fb9b6dc7b68d
+github.com/miekg/dns 271c58e0c14f552178ea321a545ff9af38930f39
+github.com/mitchellh/mapstructure 482a9fd5fa83e8c4e7817413b80f3eb8feec03ef
+github.com/ncw/swift b964f2ca856aac39885e258ad25aec08d5f64ee6
+github.com/spf13/cobra 312092086bed4968099259622145a0c9ae280064
+github.com/spf13/pflag 5644820622454e71517561946e3d94b9f9db6842
+github.com/stevvooe/resumable 51ad44105773cafcbe91927f70ac68e1bf78f8b4
+github.com/xenolf/lego/acme a9d8cec0e6563575e5868a005359ac97911b5985
+github.com/yvasiyarov/go-metrics 57bccd1ccd43f94bb17fdd8bf3007059b802f85e
+github.com/yvasiyarov/gorelic a9bba5b9ab508a086f9a12b8c51fab68478e2128
+github.com/yvasiyarov/newrelic_platform_go b21fdbd4370f3717f3bbd2bf41c223bc273068e6
+golang.org/x/crypto c10c31b5e94b6f7a0283272dc2bb27163dcea24b
+golang.org/x/net 4876518f9e71663000c348837735820161a42df7
+golang.org/x/oauth2 045497edb6234273d67dbc25da3f2ddbc4c4cacf
+golang.org/x/time/rate a4bde12657593d5e90d0533a3e4fd95e635124cb
+google.golang.org/api 9bf6e6e569ff057f75d9604a46c52928f17d2b54
+google.golang.org/appengine 12d5545dc1cfa6047a286d5e853841b6471f4c19
+google.golang.org/cloud 975617b05ea8a58727e6c1a06b6161ff4185a9f2
+google.golang.org/grpc d3ddb4469d5a1b949fc7a7da7c1d6a0d1b6de994
+gopkg.in/check.v1 64131543e7896d5bcc6bd5a76287eb75ea96c673
+gopkg.in/square/go-jose.v1 40d457b439244b546f023d056628e5184136899b
+gopkg.in/yaml.v2 bef53efd0c76e49e6de55ead051f886bea7e9420
+rsc.io/letsencrypt e770c10b0f1a64775ae91d240407ce00d1a5bdeb https://github.com/dmcgowan/letsencrypt.git
diff --git a/vendor/github.com/Azure/azure-sdk-for-go/storage/README.md b/vendor/github.com/Azure/azure-sdk-for-go/storage/README.md
deleted file mode 100644
index 0ab099848..000000000
--- a/vendor/github.com/Azure/azure-sdk-for-go/storage/README.md
+++ /dev/null
@@ -1,5 +0,0 @@
-# Azure Storage SDK for Go
-
-The `github.com/Azure/azure-sdk-for-go/storage` package is used to perform operations in Azure Storage Service. To manage your storage accounts (Azure Resource Manager / ARM), use the [github.com/Azure/azure-sdk-for-go/arm/storage](../arm/storage) package. For your classic storage accounts (Azure Service Management / ASM), use [github.com/Azure/azure-sdk-for-go/management/storageservice](../management/storageservice) package.
-
-This package includes support for [Azure Storage Emulator](https://azure.microsoft.com/documentation/articles/storage-use-emulator/)
\ No newline at end of file
diff --git a/vendor/github.com/Sirupsen/logrus/.gitignore b/vendor/github.com/Sirupsen/logrus/.gitignore
deleted file mode 100644
index 66be63a00..000000000
--- a/vendor/github.com/Sirupsen/logrus/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-logrus
diff --git a/vendor/github.com/Sirupsen/logrus/.travis.yml b/vendor/github.com/Sirupsen/logrus/.travis.yml
deleted file mode 100644
index 2d8c08661..000000000
--- a/vendor/github.com/Sirupsen/logrus/.travis.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-language: go
-go:
-  - 1.2
-  - 1.3
-  - 1.4
-  - tip
-install:
-  - go get -t ./...
diff --git a/vendor/github.com/Sirupsen/logrus/CHANGELOG.md b/vendor/github.com/Sirupsen/logrus/CHANGELOG.md
deleted file mode 100644
index eb72bff93..000000000
--- a/vendor/github.com/Sirupsen/logrus/CHANGELOG.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# 0.7.3
-
-formatter/\*: allow configuration of timestamp layout
-
-# 0.7.2
-
-formatter/text: Add configuration option for time format (#158)
diff --git a/vendor/github.com/Sirupsen/logrus/README.md b/vendor/github.com/Sirupsen/logrus/README.md
deleted file mode 100644
index d55f90924..000000000
--- a/vendor/github.com/Sirupsen/logrus/README.md
+++ /dev/null
@@ -1,349 +0,0 @@
-# Logrus <img src="http://i.imgur.com/hTeVwmJ.png" width="40" height="40" alt=":walrus:" class="emoji" title=":walrus:"/>&nbsp;[![Build Status](https://travis-ci.org/Sirupsen/logrus.svg?branch=master)](https://travis-ci.org/Sirupsen/logrus)&nbsp;[![godoc reference](https://godoc.org/github.com/Sirupsen/logrus?status.png)][godoc]
-
-Logrus is a structured logger for Go (golang), completely API compatible with
-the standard library logger. [Godoc][godoc]. **Please note the Logrus API is not
-yet stable (pre 1.0). Logrus itself is completely stable and has been used in
-many large deployments. The core API is unlikely to change much but please
-version control your Logrus to make sure you aren't fetching latest `master` on
-every build.**
-
-Nicely color-coded in development (when a TTY is attached, otherwise just
-plain text):
-
-![Colored](http://i.imgur.com/PY7qMwd.png)
-
-With `log.Formatter = new(logrus.JSONFormatter)`, for easy parsing by logstash
-or Splunk:
-
-```json
-{"animal":"walrus","level":"info","msg":"A group of walrus emerges from the
-ocean","size":10,"time":"2014-03-10 19:57:38.562264131 -0400 EDT"}
-
-{"level":"warning","msg":"The group's number increased tremendously!",
-"number":122,"omg":true,"time":"2014-03-10 19:57:38.562471297 -0400 EDT"}
-
-{"animal":"walrus","level":"info","msg":"A giant walrus appears!",
-"size":10,"time":"2014-03-10 19:57:38.562500591 -0400 EDT"}
-
-{"animal":"walrus","level":"info","msg":"Tremendously sized cow enters the ocean.",
-"size":9,"time":"2014-03-10 19:57:38.562527896 -0400 EDT"}
-
-{"level":"fatal","msg":"The ice breaks!","number":100,"omg":true,
-"time":"2014-03-10 19:57:38.562543128 -0400 EDT"}
-```
-
-With the default `log.Formatter = new(logrus.TextFormatter)` when a TTY is not
-attached, the output is compatible with the
-[logfmt](http://godoc.org/github.com/kr/logfmt) format:
-
-```text
-time="2015-03-26T01:27:38-04:00" level=debug msg="Started observing beach" animal=walrus number=8
-time="2015-03-26T01:27:38-04:00" level=info msg="A group of walrus emerges from the ocean" animal=walrus size=10
-time="2015-03-26T01:27:38-04:00" level=warning msg="The group's number increased tremendously!" number=122 omg=true
-time="2015-03-26T01:27:38-04:00" level=debug msg="Temperature changes" temperature=-4
-time="2015-03-26T01:27:38-04:00" level=panic msg="It's over 9000!" animal=orca size=9009
-time="2015-03-26T01:27:38-04:00" level=fatal msg="The ice breaks!" err=&{0x2082280c0 map[animal:orca size:9009] 2015-03-26 01:27:38.441574009 -0400 EDT panic It's over 9000!} number=100 omg=true
-exit status 1
-```
-
-#### Example
-
-The simplest way to use Logrus is simply the package-level exported logger:
-
-```go
-package main
-
-import (
-  log "github.com/Sirupsen/logrus"
-)
-
-func main() {
-  log.WithFields(log.Fields{
-    "animal": "walrus",
-  }).Info("A walrus appears")
-}
-```
-
-Note that it's completely api-compatible with the stdlib logger, so you can
-replace your `log` imports everywhere with `log "github.com/Sirupsen/logrus"`
-and you'll now have the flexibility of Logrus. You can customize it all you
-want:
-
-```go
-package main
-
-import (
-  "os"
-  log "github.com/Sirupsen/logrus"
-  "github.com/Sirupsen/logrus/hooks/airbrake"
-)
-
-func init() {
-  // Log as JSON instead of the default ASCII formatter.
-  log.SetFormatter(&log.JSONFormatter{})
-
-  // Use the Airbrake hook to report errors that have Error severity or above to
-  // an exception tracker. You can create custom hooks, see the Hooks section.
-  log.AddHook(airbrake.NewHook("https://example.com", "xyz", "development"))
-
-  // Output to stderr instead of stdout, could also be a file.
-  log.SetOutput(os.Stderr)
-
-  // Only log the warning severity or above.
-  log.SetLevel(log.WarnLevel)
-}
-
-func main() {
-  log.WithFields(log.Fields{
-    "animal": "walrus",
-    "size":   10,
-  }).Info("A group of walrus emerges from the ocean")
-
-  log.WithFields(log.Fields{
-    "omg":    true,
-    "number": 122,
-  }).Warn("The group's number increased tremendously!")
-
-  log.WithFields(log.Fields{
-    "omg":    true,
-    "number": 100,
-  }).Fatal("The ice breaks!")
-
-  // A common pattern is to re-use fields between logging statements by re-using
-  // the logrus.Entry returned from WithFields()
-  contextLogger := log.WithFields(log.Fields{
-    "common": "this is a common field",
-    "other": "I also should be logged always",
-  })
-
-  contextLogger.Info("I'll be logged with common and other field")
-  contextLogger.Info("Me too")
-}
-```
-
-For more advanced usage such as logging to multiple locations from the same
-application, you can also create an instance of the `logrus` Logger:
-
-```go
-package main
-
-import (
-  "github.com/Sirupsen/logrus"
-)
-
-// Create a new instance of the logger. You can have any number of instances.
-var log = logrus.New()
-
-func main() {
-  // The API for setting attributes is a little different than the package level
-  // exported logger. See Godoc.
-  log.Out = os.Stderr
-
-  log.WithFields(logrus.Fields{
-    "animal": "walrus",
-    "size":   10,
-  }).Info("A group of walrus emerges from the ocean")
-}
-```
-
-#### Fields
-
-Logrus encourages careful, structured logging though logging fields instead of
-long, unparseable error messages. For example, instead of: `log.Fatalf("Failed
-to send event %s to topic %s with key %d")`, you should log the much more
-discoverable:
-
-```go
-log.WithFields(log.Fields{
-  "event": event,
-  "topic": topic,
-  "key": key,
-}).Fatal("Failed to send event")
-```
-
-We've found this API forces you to think about logging in a way that produces
-much more useful logging messages. We've been in countless situations where just
-a single added field to a log statement that was already there would've saved us
-hours. The `WithFields` call is optional.
-
-In general, with Logrus using any of the `printf`-family functions should be
-seen as a hint you should add a field, however, you can still use the
-`printf`-family functions with Logrus.
-
-#### Hooks
-
-You can add hooks for logging levels. For example to send errors to an exception
-tracking service on `Error`, `Fatal` and `Panic`, info to StatsD or log to
-multiple places simultaneously, e.g. syslog.
-
-Logrus comes with [built-in hooks](hooks/). Add those, or your custom hook, in
-`init`:
-
-```go
-import (
-  log "github.com/Sirupsen/logrus"
-  "github.com/Sirupsen/logrus/hooks/airbrake"
-  "github.com/Sirupsen/logrus/hooks/syslog"
-  "log/syslog"
-)
-
-func init() {
-  log.AddHook(airbrake.NewHook("https://example.com", "xyz", "development"))
-
-  hook, err := logrus_syslog.NewSyslogHook("udp", "localhost:514", syslog.LOG_INFO, "")
-  if err != nil {
-    log.Error("Unable to connect to local syslog daemon")
-  } else {
-    log.AddHook(hook)
-  }
-}
-```
-
-
-| Hook  | Description |
-| ----- | ----------- |
-| [Airbrake](https://github.com/Sirupsen/logrus/blob/master/hooks/airbrake/airbrake.go) | Send errors to an exception tracking service compatible with the Airbrake API. Uses [`airbrake-go`](https://github.com/tobi/airbrake-go) behind the scenes. |
-| [Papertrail](https://github.com/Sirupsen/logrus/blob/master/hooks/papertrail/papertrail.go) | Send errors to the Papertrail hosted logging service via UDP. |
-| [Syslog](https://github.com/Sirupsen/logrus/blob/master/hooks/syslog/syslog.go) | Send errors to remote syslog server. Uses standard library `log/syslog` behind the scenes. |
-| [BugSnag](https://github.com/Sirupsen/logrus/blob/master/hooks/bugsnag/bugsnag.go) | Send errors to the Bugsnag exception tracking service. |
-| [Hiprus](https://github.com/nubo/hiprus) | Send errors to a channel in hipchat. |
-| [Logrusly](https://github.com/sebest/logrusly) | Send logs to [Loggly](https://www.loggly.com/) |
-| [Slackrus](https://github.com/johntdyer/slackrus) | Hook for Slack chat. |
-| [Journalhook](https://github.com/wercker/journalhook) | Hook for logging to `systemd-journald` |
-| [Graylog](https://github.com/gemnasium/logrus-hooks/tree/master/graylog) | Hook for logging to [Graylog](http://graylog2.org/) |
-
-#### Level logging
-
-Logrus has six logging levels: Debug, Info, Warning, Error, Fatal and Panic.
-
-```go
-log.Debug("Useful debugging information.")
-log.Info("Something noteworthy happened!")
-log.Warn("You should probably take a look at this.")
-log.Error("Something failed but I'm not quitting.")
-// Calls os.Exit(1) after logging
-log.Fatal("Bye.")
-// Calls panic() after logging
-log.Panic("I'm bailing.")
-```
-
-You can set the logging level on a `Logger`, then it will only log entries with
-that severity or anything above it:
-
-```go
-// Will log anything that is info or above (warn, error, fatal, panic). Default.
-log.SetLevel(log.InfoLevel)
-```
-
-It may be useful to set `log.Level = logrus.DebugLevel` in a debug or verbose
-environment if your application has that.
-
-#### Entries
-
-Besides the fields added with `WithField` or `WithFields` some fields are
-automatically added to all logging events:
-
-1. `time`. The timestamp when the entry was created.
-2. `msg`. The logging message passed to `{Info,Warn,Error,Fatal,Panic}` after
-   the `AddFields` call. E.g. `Failed to send event.`
-3. `level`. The logging level. E.g. `info`.
-
-#### Environments
-
-Logrus has no notion of environment.
-
-If you wish for hooks and formatters to only be used in specific environments,
-you should handle that yourself. For example, if your application has a global
-variable `Environment`, which is a string representation of the environment you
-could do:
-
-```go
-import (
-  log "github.com/Sirupsen/logrus"
-)
-
-init() {
-  // do something here to set environment depending on an environment variable
-  // or command-line flag
-  if Environment == "production" {
-    log.SetFormatter(logrus.JSONFormatter)
-  } else {
-    // The TextFormatter is default, you don't actually have to do this.
-    log.SetFormatter(logrus.TextFormatter)
-  }
-}
-```
-
-This configuration is how `logrus` was intended to be used, but JSON in
-production is mostly only useful if you do log aggregation with tools like
-Splunk or Logstash.
-
-#### Formatters
-
-The built-in logging formatters are:
-
-* `logrus.TextFormatter`. Logs the event in colors if stdout is a tty, otherwise
-  without colors.
-  * *Note:* to force colored output when there is no TTY, set the `ForceColors`
-    field to `true`.  To force no colored output even if there is a TTY  set the
-    `DisableColors` field to `true`
-* `logrus.JSONFormatter`. Logs fields as JSON.
-* `logrus_logstash.LogstashFormatter`. Logs fields as Logstash Events (http://logstash.net).
-
-    ```go
-      logrus.SetFormatter(&logrus_logstash.LogstashFormatter{Type: “application_name"})
-    ```
-
-Third party logging formatters:
-
-* [`zalgo`](https://github.com/aybabtme/logzalgo): invoking the P͉̫o̳̼̊w̖͈̰͎e̬͔̭͂r͚̼̹̲ ̫͓͉̳͈ō̠͕͖̚f̝͍̠ ͕̲̞͖͑Z̖̫̤̫ͪa͉̬͈̗l͖͎g̳̥o̰̥̅!̣͔̲̻͊̄ ̙̘̦̹̦.
-
-You can define your formatter by implementing the `Formatter` interface,
-requiring a `Format` method. `Format` takes an `*Entry`. `entry.Data` is a
-`Fields` type (`map[string]interface{}`) with all your fields as well as the
-default ones (see Entries section above):
-
-```go
-type MyJSONFormatter struct {
-}
-
-log.SetFormatter(new(MyJSONFormatter))
-
-func (f *JSONFormatter) Format(entry *Entry) ([]byte, error) {
-  // Note this doesn't include Time, Level and Message which are available on
-  // the Entry. Consult `godoc` on information about those fields or read the
-  // source of the official loggers.
-  serialized, err := json.Marshal(entry.Data)
-    if err != nil {
-      return nil, fmt.Errorf("Failed to marshal fields to JSON, %v", err)
-    }
-  return append(serialized, '\n'), nil
-}
-```
-
-#### Logger as an `io.Writer`
-
-Logrus can be transormed into an `io.Writer`. That writer is the end of an `io.Pipe` and it is your responsibility to close it.
-
-```go
-w := logger.Writer()
-defer w.Close()
-
-srv := http.Server{
-    // create a stdlib log.Logger that writes to
-    // logrus.Logger.
-    ErrorLog: log.New(w, "", 0),
-}
-```
-
-Each line written to that writer will be printed the usual way, using formatters
-and hooks. The level for those entries is `info`.
-
-#### Rotation
-
-Log rotation is not provided with Logrus. Log rotation should be done by an
-external program (like `logrotate(8)`) that can compress and delete old log
-entries. It should not be a feature of the application-level logger.
-
-
-[godoc]: https://godoc.org/github.com/Sirupsen/logrus
diff --git a/vendor/github.com/aws/aws-sdk-go/LICENSE.txt b/vendor/github.com/aws/aws-sdk-go/LICENSE.txt
deleted file mode 100644
index d64569567..000000000
--- a/vendor/github.com/aws/aws-sdk-go/LICENSE.txt
+++ /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/github.com/aws/aws-sdk-go/NOTICE.txt b/vendor/github.com/aws/aws-sdk-go/NOTICE.txt
deleted file mode 100644
index 5f14d1162..000000000
--- a/vendor/github.com/aws/aws-sdk-go/NOTICE.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-AWS SDK for Go
-Copyright 2015 Amazon.com, Inc. or its affiliates. All Rights Reserved. 
-Copyright 2014-2015 Stripe, Inc.
diff --git a/vendor/github.com/aws/aws-sdk-go/aws/credentials/example.ini b/vendor/github.com/aws/aws-sdk-go/aws/credentials/example.ini
deleted file mode 100644
index 7fc91d9d2..000000000
--- a/vendor/github.com/aws/aws-sdk-go/aws/credentials/example.ini
+++ /dev/null
@@ -1,12 +0,0 @@
-[default]
-aws_access_key_id = accessKey
-aws_secret_access_key = secret
-aws_session_token = token
-
-[no_token]
-aws_access_key_id = accessKey
-aws_secret_access_key = secret
-
-[with_colon]
-aws_access_key_id: accessKey
-aws_secret_access_key: secret
diff --git a/vendor/github.com/aws/aws-sdk-go/private/endpoints/endpoints.json b/vendor/github.com/aws/aws-sdk-go/private/endpoints/endpoints.json
deleted file mode 100644
index 5f4991c2b..000000000
--- a/vendor/github.com/aws/aws-sdk-go/private/endpoints/endpoints.json
+++ /dev/null
@@ -1,75 +0,0 @@
-{
-  "version": 2,
-  "endpoints": {
-    "*/*": {
-      "endpoint": "{service}.{region}.amazonaws.com"
-    },
-    "cn-north-1/*": {
-      "endpoint": "{service}.{region}.amazonaws.com.cn",
-      "signatureVersion": "v4"
-    },
-    "cn-north-1/ec2metadata": {
-      "endpoint": "http://169.254.169.254/latest"
-    },
-    "us-gov-west-1/iam": {
-      "endpoint": "iam.us-gov.amazonaws.com"
-    },
-    "us-gov-west-1/sts": {
-      "endpoint": "sts.us-gov-west-1.amazonaws.com"
-    },
-    "us-gov-west-1/s3": {
-      "endpoint": "s3-{region}.amazonaws.com"
-    },
-    "us-gov-west-1/ec2metadata": {
-      "endpoint": "http://169.254.169.254/latest"
-    },
-    "*/cloudfront": {
-      "endpoint": "cloudfront.amazonaws.com",
-      "signingRegion": "us-east-1"
-    },
-    "*/cloudsearchdomain": {
-      "endpoint": "",
-      "signingRegion": "us-east-1"
-    },
-    "*/data.iot": {
-      "endpoint": "",
-      "signingRegion": "us-east-1"
-    },
-    "*/ec2metadata": {
-      "endpoint": "http://169.254.169.254/latest"
-    },
-    "*/iam": {
-      "endpoint": "iam.amazonaws.com",
-      "signingRegion": "us-east-1"
-    },
-    "*/importexport": {
-      "endpoint": "importexport.amazonaws.com",
-      "signingRegion": "us-east-1"
-    },
-    "*/route53": {
-      "endpoint": "route53.amazonaws.com",
-      "signingRegion": "us-east-1"
-    },
-    "*/sts": {
-      "endpoint": "sts.amazonaws.com",
-      "signingRegion": "us-east-1"
-    },
-    "*/waf": {
-      "endpoint": "waf.amazonaws.com",
-      "signingRegion": "us-east-1"
-    },
-    "us-east-1/sdb": {
-      "endpoint": "sdb.amazonaws.com",
-      "signingRegion": "us-east-1"
-    },
-    "*/s3": {
-      "endpoint": "s3-{region}.amazonaws.com"
-    },
-    "us-east-1/s3": {
-      "endpoint": "s3.amazonaws.com"
-    },
-    "eu-central-1/s3": {
-      "endpoint": "{service}.{region}.amazonaws.com"
-    }
-  }
-}
diff --git a/vendor/github.com/aws/aws-sdk-go/vendor/github.com/go-ini/ini/.gitignore b/vendor/github.com/aws/aws-sdk-go/vendor/github.com/go-ini/ini/.gitignore
deleted file mode 100644
index 7adca9439..000000000
--- a/vendor/github.com/aws/aws-sdk-go/vendor/github.com/go-ini/ini/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-testdata/conf_out.ini
-ini.sublime-project
-ini.sublime-workspace
-testdata/conf_reflect.ini
diff --git a/vendor/github.com/aws/aws-sdk-go/vendor/github.com/go-ini/ini/README.md b/vendor/github.com/aws/aws-sdk-go/vendor/github.com/go-ini/ini/README.md
deleted file mode 100644
index 1272038a9..000000000
--- a/vendor/github.com/aws/aws-sdk-go/vendor/github.com/go-ini/ini/README.md
+++ /dev/null
@@ -1,560 +0,0 @@
-ini [![Build Status](https://drone.io/github.com/go-ini/ini/status.png)](https://drone.io/github.com/go-ini/ini/latest) [![](http://gocover.io/_badge/github.com/go-ini/ini)](http://gocover.io/github.com/go-ini/ini)
-===
-
-![](https://avatars0.githubusercontent.com/u/10216035?v=3&s=200)
-
-Package ini provides INI file read and write functionality in Go.
-
-[简体中文](README_ZH.md)
-
-## Feature
-
-- Load multiple data sources(`[]byte` or file) with overwrites.
-- Read with recursion values.
-- Read with parent-child sections.
-- Read with auto-increment key names.
-- Read with multiple-line values.
-- Read with tons of helper methods.
-- Read and convert values to Go types.
-- Read and **WRITE** comments of sections and keys.
-- Manipulate sections, keys and comments with ease.
-- Keep sections and keys in order as you parse and save.
-
-## Installation
-
-	go get gopkg.in/ini.v1
-
-## Getting Started
-
-### Loading from data sources
-
-A **Data Source** is either raw data in type `[]byte` or a file name with type `string` and you can load **as many as** data sources you want. Passing other types will simply return an error.
-
-```go
-cfg, err := ini.Load([]byte("raw data"), "filename")
-```
-
-Or start with an empty object:
-
-```go
-cfg := ini.Empty()
-```
-
-When you cannot decide how many data sources to load at the beginning, you still able to **Append()** them later.
-
-```go
-err := cfg.Append("other file", []byte("other raw data"))
-```
-
-### Working with sections
-
-To get a section, you would need to:
-
-```go
-section, err := cfg.GetSection("section name")
-```
-
-For a shortcut for default section, just give an empty string as name:
-
-```go
-section, err := cfg.GetSection("")
-```
-
-When you're pretty sure the section exists, following code could make your life easier:
-
-```go
-section := cfg.Section("")
-```
-
-What happens when the section somehow does not exist? Don't panic, it automatically creates and returns a new section to you.
-
-To create a new section:
-
-```go
-err := cfg.NewSection("new section")
-```
-
-To get a list of sections or section names:
-
-```go
-sections := cfg.Sections()
-names := cfg.SectionStrings()
-```
-
-### Working with keys
-
-To get a key under a section:
-
-```go
-key, err := cfg.Section("").GetKey("key name")
-```
-
-Same rule applies to key operations:
-
-```go
-key := cfg.Section("").Key("key name")
-```
-
-To create a new key:
-
-```go
-err := cfg.Section("").NewKey("name", "value")
-```
-
-To get a list of keys or key names:
-
-```go
-keys := cfg.Section("").Keys()
-names := cfg.Section("").KeyStrings()
-```
-
-To get a clone hash of keys and corresponding values:
-
-```go
-hash := cfg.GetSection("").KeysHash()
-```
-
-### Working with values
-
-To get a string value:
-
-```go
-val := cfg.Section("").Key("key name").String()
-```
-
-To validate key value on the fly:
-
-```go
-val := cfg.Section("").Key("key name").Validate(func(in string) string {
-	if len(in) == 0 {
-		return "default"
-	}
-	return in
-})
-```
-
-To get value with types:
-
-```go
-// For boolean values:
-// true when value is: 1, t, T, TRUE, true, True, YES, yes, Yes, ON, on, On
-// false when value is: 0, f, F, FALSE, false, False, NO, no, No, OFF, off, Off
-v, err = cfg.Section("").Key("BOOL").Bool()
-v, err = cfg.Section("").Key("FLOAT64").Float64()
-v, err = cfg.Section("").Key("INT").Int()
-v, err = cfg.Section("").Key("INT64").Int64()
-v, err = cfg.Section("").Key("UINT").Uint()
-v, err = cfg.Section("").Key("UINT64").Uint64()
-v, err = cfg.Section("").Key("TIME").TimeFormat(time.RFC3339)
-v, err = cfg.Section("").Key("TIME").Time() // RFC3339
-
-v = cfg.Section("").Key("BOOL").MustBool()
-v = cfg.Section("").Key("FLOAT64").MustFloat64()
-v = cfg.Section("").Key("INT").MustInt()
-v = cfg.Section("").Key("INT64").MustInt64()
-v = cfg.Section("").Key("UINT").MustUint()
-v = cfg.Section("").Key("UINT64").MustUint64()
-v = cfg.Section("").Key("TIME").MustTimeFormat(time.RFC3339)
-v = cfg.Section("").Key("TIME").MustTime() // RFC3339
-
-// Methods start with Must also accept one argument for default value
-// when key not found or fail to parse value to given type.
-// Except method MustString, which you have to pass a default value.
-
-v = cfg.Section("").Key("String").MustString("default")
-v = cfg.Section("").Key("BOOL").MustBool(true)
-v = cfg.Section("").Key("FLOAT64").MustFloat64(1.25)
-v = cfg.Section("").Key("INT").MustInt(10)
-v = cfg.Section("").Key("INT64").MustInt64(99)
-v = cfg.Section("").Key("UINT").MustUint(3)
-v = cfg.Section("").Key("UINT64").MustUint64(6)
-v = cfg.Section("").Key("TIME").MustTimeFormat(time.RFC3339, time.Now())
-v = cfg.Section("").Key("TIME").MustTime(time.Now()) // RFC3339
-```
-
-What if my value is three-line long?
-
-```ini
-[advance]
-ADDRESS = """404 road,
-NotFound, State, 5000
-Earth"""
-```
-
-Not a problem!
-
-```go
-cfg.Section("advance").Key("ADDRESS").String()
-
-/* --- start ---
-404 road,
-NotFound, State, 5000
-Earth
-------  end  --- */
-```
-
-That's cool, how about continuation lines?
-
-```ini
-[advance]
-two_lines = how about \
-	continuation lines?
-lots_of_lines = 1 \
-	2 \
-	3 \
-	4
-```
-
-Piece of cake!
-
-```go
-cfg.Section("advance").Key("two_lines").String() // how about continuation lines?
-cfg.Section("advance").Key("lots_of_lines").String() // 1 2 3 4
-```
-
-Note that single quotes around values will be stripped:
-
-```ini
-foo = "some value" // foo: some value
-bar = 'some value' // bar: some value
-```
-
-That's all? Hmm, no.
-
-#### Helper methods of working with values
-
-To get value with given candidates:
-
-```go
-v = cfg.Section("").Key("STRING").In("default", []string{"str", "arr", "types"})
-v = cfg.Section("").Key("FLOAT64").InFloat64(1.1, []float64{1.25, 2.5, 3.75})
-v = cfg.Section("").Key("INT").InInt(5, []int{10, 20, 30})
-v = cfg.Section("").Key("INT64").InInt64(10, []int64{10, 20, 30})
-v = cfg.Section("").Key("UINT").InUint(4, []int{3, 6, 9})
-v = cfg.Section("").Key("UINT64").InUint64(8, []int64{3, 6, 9})
-v = cfg.Section("").Key("TIME").InTimeFormat(time.RFC3339, time.Now(), []time.Time{time1, time2, time3})
-v = cfg.Section("").Key("TIME").InTime(time.Now(), []time.Time{time1, time2, time3}) // RFC3339
-```
-
-Default value will be presented if value of key is not in candidates you given, and default value does not need be one of candidates.
-
-To validate value in a given range:
-
-```go
-vals = cfg.Section("").Key("FLOAT64").RangeFloat64(0.0, 1.1, 2.2)
-vals = cfg.Section("").Key("INT").RangeInt(0, 10, 20)
-vals = cfg.Section("").Key("INT64").RangeInt64(0, 10, 20)
-vals = cfg.Section("").Key("UINT").RangeUint(0, 3, 9)
-vals = cfg.Section("").Key("UINT64").RangeUint64(0, 3, 9)
-vals = cfg.Section("").Key("TIME").RangeTimeFormat(time.RFC3339, time.Now(), minTime, maxTime)
-vals = cfg.Section("").Key("TIME").RangeTime(time.Now(), minTime, maxTime) // RFC3339
-```
-
-To auto-split value into slice:
-
-```go
-vals = cfg.Section("").Key("STRINGS").Strings(",")
-vals = cfg.Section("").Key("FLOAT64S").Float64s(",")
-vals = cfg.Section("").Key("INTS").Ints(",")
-vals = cfg.Section("").Key("INT64S").Int64s(",")
-vals = cfg.Section("").Key("UINTS").Uints(",")
-vals = cfg.Section("").Key("UINT64S").Uint64s(",")
-vals = cfg.Section("").Key("TIMES").Times(",")
-```
-
-### Save your configuration
-
-Finally, it's time to save your configuration to somewhere.
-
-A typical way to save configuration is writing it to a file:
-
-```go
-// ...
-err = cfg.SaveTo("my.ini")
-err = cfg.SaveToIndent("my.ini", "\t")
-```
-
-Another way to save is writing to a `io.Writer` interface:
-
-```go
-// ...
-cfg.WriteTo(writer)
-cfg.WriteToIndent(writer, "\t")
-```
-
-## Advanced Usage
-
-### Recursive Values
-
-For all value of keys, there is a special syntax `%(<name>)s`, where `<name>` is the key name in same section or default section, and `%(<name>)s` will be replaced by corresponding value(empty string if key not found). You can use this syntax at most 99 level of recursions.
-
-```ini
-NAME = ini
-
-[author]
-NAME = Unknwon
-GITHUB = https://github.com/%(NAME)s
-
-[package]
-FULL_NAME = github.com/go-ini/%(NAME)s
-```
-
-```go
-cfg.Section("author").Key("GITHUB").String()		// https://github.com/Unknwon
-cfg.Section("package").Key("FULL_NAME").String()	// github.com/go-ini/ini
-```
-
-### Parent-child Sections
-
-You can use `.` in section name to indicate parent-child relationship between two or more sections. If the key not found in the child section, library will try again on its parent section until there is no parent section.
-
-```ini
-NAME = ini
-VERSION = v1
-IMPORT_PATH = gopkg.in/%(NAME)s.%(VERSION)s
-
-[package]
-CLONE_URL = https://%(IMPORT_PATH)s
-
-[package.sub]
-```
-
-```go
-cfg.Section("package.sub").Key("CLONE_URL").String()	// https://gopkg.in/ini.v1
-```
-
-### Auto-increment Key Names
-
-If key name is `-` in data source, then it would be seen as special syntax for auto-increment key name start from 1, and every section is independent on counter.
-
-```ini
-[features]
--: Support read/write comments of keys and sections
--: Support auto-increment of key names
--: Support load multiple files to overwrite key values
-```
-
-```go
-cfg.Section("features").KeyStrings()	// []{"#1", "#2", "#3"}
-```
-
-### Map To Struct
-
-Want more objective way to play with INI? Cool.
-
-```ini
-Name = Unknwon
-age = 21
-Male = true
-Born = 1993-01-01T20:17:05Z
-
-[Note]
-Content = Hi is a good man!
-Cities = HangZhou, Boston
-```
-
-```go
-type Note struct {
-	Content string
-	Cities  []string
-}
-
-type Person struct {
-	Name string
-	Age  int `ini:"age"`
-	Male bool
-	Born time.Time
-	Note
-	Created time.Time `ini:"-"`
-}
-
-func main() {
-	cfg, err := ini.Load("path/to/ini")
-	// ...
-	p := new(Person)
-	err = cfg.MapTo(p)
-	// ...
-
-	// Things can be simpler.
-	err = ini.MapTo(p, "path/to/ini")
-	// ...
-
-	// Just map a section? Fine.
-	n := new(Note)
-	err = cfg.Section("Note").MapTo(n)
-	// ...
-}
-```
-
-Can I have default value for field? Absolutely.
-
-Assign it before you map to struct. It will keep the value as it is if the key is not presented or got wrong type.
-
-```go
-// ...
-p := &Person{
-	Name: "Joe",
-}
-// ...
-```
-
-It's really cool, but what's the point if you can't give me my file back from struct?
-
-### Reflect From Struct
-
-Why not?
-
-```go
-type Embeded struct {
-	Dates  []time.Time `delim:"|"`
-	Places []string
-	None   []int
-}
-
-type Author struct {
-	Name      string `ini:"NAME"`
-	Male      bool
-	Age       int
-	GPA       float64
-	NeverMind string `ini:"-"`
-	*Embeded
-}
-
-func main() {
-	a := &Author{"Unknwon", true, 21, 2.8, "",
-		&Embeded{
-			[]time.Time{time.Now(), time.Now()},
-			[]string{"HangZhou", "Boston"},
-			[]int{},
-		}}
-	cfg := ini.Empty()
-	err = ini.ReflectFrom(cfg, a)
-	// ...
-}
-```
-
-So, what do I get?
-
-```ini
-NAME = Unknwon
-Male = true
-Age = 21
-GPA = 2.8
-
-[Embeded]
-Dates = 2015-08-07T22:14:22+08:00|2015-08-07T22:14:22+08:00
-Places = HangZhou,Boston
-None =
-```
-
-#### Name Mapper
-
-To save your time and make your code cleaner, this library supports [`NameMapper`](https://gowalker.org/gopkg.in/ini.v1#NameMapper) between struct field and actual section and key name.
-
-There are 2 built-in name mappers:
-
-- `AllCapsUnderscore`: it converts to format `ALL_CAPS_UNDERSCORE` then match section or key.
-- `TitleUnderscore`: it converts to format `title_underscore` then match section or key.
-
-To use them:
-
-```go
-type Info struct {
-	PackageName string
-}
-
-func main() {
-	err = ini.MapToWithMapper(&Info{}, ini.TitleUnderscore, []byte("packag_name=ini"))
-	// ...
-
-	cfg, err := ini.Load([]byte("PACKAGE_NAME=ini"))
-	// ...
-	info := new(Info)
-	cfg.NameMapper = ini.AllCapsUnderscore
-	err = cfg.MapTo(info)
-	// ...
-}
-```
-
-Same rules of name mapper apply to `ini.ReflectFromWithMapper` function.
-
-#### Other Notes On Map/Reflect
-
-Any embedded struct is treated as a section by default, and there is no automatic parent-child relations in map/reflect feature:
-
-```go
-type Child struct {
-	Age string
-}
-
-type Parent struct {
-	Name string
-	Child
-}
-
-type Config struct {
-	City string
-	Parent
-}
-```
-
-Example configuration:
-
-```ini
-City = Boston
-
-[Parent]
-Name = Unknwon
-
-[Child]
-Age = 21
-```
-
-What if, yes, I'm paranoid, I want embedded struct to be in the same section. Well, all roads lead to Rome.
-
-```go
-type Child struct {
-	Age string
-}
-
-type Parent struct {
-	Name string
-	Child `ini:"Parent"`
-}
-
-type Config struct {
-	City string
-	Parent
-}
-```
-
-Example configuration:
-
-```ini
-City = Boston
-
-[Parent]
-Name = Unknwon
-Age = 21
-```
-
-## Getting Help
-
-- [API Documentation](https://gowalker.org/gopkg.in/ini.v1)
-- [File An Issue](https://github.com/go-ini/ini/issues/new)
-
-## FAQs
-
-### What does `BlockMode` field do?
-
-By default, library lets you read and write values so we need a locker to make sure your data is safe. But in cases that you are very sure about only reading data through the library, you can set `cfg.BlockMode = false` to speed up read operations about **50-70%** faster.
-
-### Why another INI library?
-
-Many people are using my another INI library [goconfig](https://github.com/Unknwon/goconfig), so the reason for this one is I would like to make more Go style code. Also when you set `cfg.BlockMode = false`, this one is about **10-30%** faster.
-
-To make those changes I have to confirm API broken, so it's safer to keep it in another place and start using `gopkg.in` to version my package at this time.(PS: shorter import path)
-
-## License
-
-This project is under Apache v2 License. See the [LICENSE](LICENSE) file for the full license text.
diff --git a/vendor/github.com/aws/aws-sdk-go/vendor/github.com/go-ini/ini/README_ZH.md b/vendor/github.com/aws/aws-sdk-go/vendor/github.com/go-ini/ini/README_ZH.md
deleted file mode 100644
index 45e19eddd..000000000
--- a/vendor/github.com/aws/aws-sdk-go/vendor/github.com/go-ini/ini/README_ZH.md
+++ /dev/null
@@ -1,547 +0,0 @@
-本包提供了 Go 语言中读写 INI 文件的功能。
-
-## 功能特性
-
-- 支持覆盖加载多个数据源(`[]byte` 或文件)
-- 支持递归读取键值
-- 支持读取父子分区
-- 支持读取自增键名
-- 支持读取多行的键值
-- 支持大量辅助方法
-- 支持在读取时直接转换为 Go 语言类型
-- 支持读取和 **写入** 分区和键的注释
-- 轻松操作分区、键值和注释
-- 在保存文件时分区和键值会保持原有的顺序
-
-## 下载安装
-
-    go get gopkg.in/ini.v1
-
-## 开始使用
-
-### 从数据源加载
-
-一个 **数据源** 可以是 `[]byte` 类型的原始数据,或 `string` 类型的文件路径。您可以加载 **任意多个** 数据源。如果您传递其它类型的数据源,则会直接返回错误。
-
-```go
-cfg, err := ini.Load([]byte("raw data"), "filename")
-```
-
-或者从一个空白的文件开始:
-
-```go
-cfg := ini.Empty()
-```
-
-当您在一开始无法决定需要加载哪些数据源时,仍可以使用 **Append()** 在需要的时候加载它们。
-
-```go
-err := cfg.Append("other file", []byte("other raw data"))
-```
-
-### 操作分区(Section)
-
-获取指定分区:
-
-```go
-section, err := cfg.GetSection("section name")
-```
-
-如果您想要获取默认分区,则可以用空字符串代替分区名:
-
-```go
-section, err := cfg.GetSection("")
-```
-
-当您非常确定某个分区是存在的,可以使用以下简便方法:
-
-```go
-section := cfg.Section("")
-```
-
-如果不小心判断错了,要获取的分区其实是不存在的,那会发生什么呢?没事的,它会自动创建并返回一个对应的分区对象给您。
-
-创建一个分区:
-
-```go
-err := cfg.NewSection("new section")
-```
-
-获取所有分区对象或名称:
-
-```go
-sections := cfg.Sections()
-names := cfg.SectionStrings()
-```
-
-### 操作键(Key)
-
-获取某个分区下的键:
-
-```go
-key, err := cfg.Section("").GetKey("key name")
-```
-
-和分区一样,您也可以直接获取键而忽略错误处理:
-
-```go
-key := cfg.Section("").Key("key name")
-```
-
-创建一个新的键:
-
-```go
-err := cfg.Section("").NewKey("name", "value")
-```
-
-获取分区下的所有键或键名:
-
-```go
-keys := cfg.Section("").Keys()
-names := cfg.Section("").KeyStrings()
-```
-
-获取分区下的所有键值对的克隆:
-
-```go
-hash := cfg.GetSection("").KeysHash()
-```
-
-### 操作键值(Value)
-
-获取一个类型为字符串(string)的值:
-
-```go
-val := cfg.Section("").Key("key name").String()
-```
-
-获取值的同时通过自定义函数进行处理验证:
-
-```go
-val := cfg.Section("").Key("key name").Validate(func(in string) string {
-	if len(in) == 0 {
-		return "default"
-	}
-	return in
-})
-```
-
-获取其它类型的值:
-
-```go
-// 布尔值的规则:
-// true 当值为:1, t, T, TRUE, true, True, YES, yes, Yes, ON, on, On
-// false 当值为:0, f, F, FALSE, false, False, NO, no, No, OFF, off, Off
-v, err = cfg.Section("").Key("BOOL").Bool()
-v, err = cfg.Section("").Key("FLOAT64").Float64()
-v, err = cfg.Section("").Key("INT").Int()
-v, err = cfg.Section("").Key("INT64").Int64()
-v, err = cfg.Section("").Key("UINT").Uint()
-v, err = cfg.Section("").Key("UINT64").Uint64()
-v, err = cfg.Section("").Key("TIME").TimeFormat(time.RFC3339)
-v, err = cfg.Section("").Key("TIME").Time() // RFC3339
-
-v = cfg.Section("").Key("BOOL").MustBool()
-v = cfg.Section("").Key("FLOAT64").MustFloat64()
-v = cfg.Section("").Key("INT").MustInt()
-v = cfg.Section("").Key("INT64").MustInt64()
-v = cfg.Section("").Key("UINT").MustUint()
-v = cfg.Section("").Key("UINT64").MustUint64()
-v = cfg.Section("").Key("TIME").MustTimeFormat(time.RFC3339)
-v = cfg.Section("").Key("TIME").MustTime() // RFC3339
-
-// 由 Must 开头的方法名允许接收一个相同类型的参数来作为默认值,
-// 当键不存在或者转换失败时,则会直接返回该默认值。
-// 但是,MustString 方法必须传递一个默认值。
-
-v = cfg.Seciont("").Key("String").MustString("default")
-v = cfg.Section("").Key("BOOL").MustBool(true)
-v = cfg.Section("").Key("FLOAT64").MustFloat64(1.25)
-v = cfg.Section("").Key("INT").MustInt(10)
-v = cfg.Section("").Key("INT64").MustInt64(99)
-v = cfg.Section("").Key("UINT").MustUint(3)
-v = cfg.Section("").Key("UINT64").MustUint64(6)
-v = cfg.Section("").Key("TIME").MustTimeFormat(time.RFC3339, time.Now())
-v = cfg.Section("").Key("TIME").MustTime(time.Now()) // RFC3339
-```
-
-如果我的值有好多行怎么办?
-
-```ini
-[advance]
-ADDRESS = """404 road,
-NotFound, State, 5000
-Earth"""
-```
-
-嗯哼?小 case!
-
-```go
-cfg.Section("advance").Key("ADDRESS").String()
-
-/* --- start ---
-404 road,
-NotFound, State, 5000
-Earth
-------  end  --- */
-```
-
-赞爆了!那要是我属于一行的内容写不下想要写到第二行怎么办?
-
-```ini
-[advance]
-two_lines = how about \
-	continuation lines?
-lots_of_lines = 1 \
-	2 \
-	3 \
-	4
-```
-
-简直是小菜一碟!
-
-```go
-cfg.Section("advance").Key("two_lines").String() // how about continuation lines?
-cfg.Section("advance").Key("lots_of_lines").String() // 1 2 3 4
-```
-
-需要注意的是,值两侧的单引号会被自动剔除:
-
-```ini
-foo = "some value" // foo: some value
-bar = 'some value' // bar: some value
-```
-
-这就是全部了?哈哈,当然不是。
-
-#### 操作键值的辅助方法
-
-获取键值时设定候选值:
-
-```go
-v = cfg.Section("").Key("STRING").In("default", []string{"str", "arr", "types"})
-v = cfg.Section("").Key("FLOAT64").InFloat64(1.1, []float64{1.25, 2.5, 3.75})
-v = cfg.Section("").Key("INT").InInt(5, []int{10, 20, 30})
-v = cfg.Section("").Key("INT64").InInt64(10, []int64{10, 20, 30})
-v = cfg.Section("").Key("UINT").InUint(4, []int{3, 6, 9})
-v = cfg.Section("").Key("UINT64").InUint64(8, []int64{3, 6, 9})
-v = cfg.Section("").Key("TIME").InTimeFormat(time.RFC3339, time.Now(), []time.Time{time1, time2, time3})
-v = cfg.Section("").Key("TIME").InTime(time.Now(), []time.Time{time1, time2, time3}) // RFC3339
-```
-
-如果获取到的值不是候选值的任意一个,则会返回默认值,而默认值不需要是候选值中的一员。
-
-验证获取的值是否在指定范围内:
-
-```go
-vals = cfg.Section("").Key("FLOAT64").RangeFloat64(0.0, 1.1, 2.2)
-vals = cfg.Section("").Key("INT").RangeInt(0, 10, 20)
-vals = cfg.Section("").Key("INT64").RangeInt64(0, 10, 20)
-vals = cfg.Section("").Key("UINT").RangeUint(0, 3, 9)
-vals = cfg.Section("").Key("UINT64").RangeUint64(0, 3, 9)
-vals = cfg.Section("").Key("TIME").RangeTimeFormat(time.RFC3339, time.Now(), minTime, maxTime)
-vals = cfg.Section("").Key("TIME").RangeTime(time.Now(), minTime, maxTime) // RFC3339
-```
-
-自动分割键值为切片(slice):
-
-```go
-vals = cfg.Section("").Key("STRINGS").Strings(",")
-vals = cfg.Section("").Key("FLOAT64S").Float64s(",")
-vals = cfg.Section("").Key("INTS").Ints(",")
-vals = cfg.Section("").Key("INT64S").Int64s(",")
-vals = cfg.Section("").Key("UINTS").Uints(",")
-vals = cfg.Section("").Key("UINT64S").Uint64s(",")
-vals = cfg.Section("").Key("TIMES").Times(",")
-```
-
-### 保存配置
-
-终于到了这个时刻,是时候保存一下配置了。
-
-比较原始的做法是输出配置到某个文件:
-
-```go
-// ...
-err = cfg.SaveTo("my.ini")
-err = cfg.SaveToIndent("my.ini", "\t")
-```
-
-另一个比较高级的做法是写入到任何实现 `io.Writer` 接口的对象中:
-
-```go
-// ...
-cfg.WriteTo(writer)
-cfg.WriteToIndent(writer, "\t")
-```
-
-### 高级用法
-
-#### 递归读取键值
-
-在获取所有键值的过程中,特殊语法 `%(<name>)s` 会被应用,其中 `<name>` 可以是相同分区或者默认分区下的键名。字符串 `%(<name>)s` 会被相应的键值所替代,如果指定的键不存在,则会用空字符串替代。您可以最多使用 99 层的递归嵌套。
-
-```ini
-NAME = ini
-
-[author]
-NAME = Unknwon
-GITHUB = https://github.com/%(NAME)s
-
-[package]
-FULL_NAME = github.com/go-ini/%(NAME)s
-```
-
-```go
-cfg.Section("author").Key("GITHUB").String()		// https://github.com/Unknwon
-cfg.Section("package").Key("FULL_NAME").String()	// github.com/go-ini/ini
-```
-
-#### 读取父子分区
-
-您可以在分区名称中使用 `.` 来表示两个或多个分区之间的父子关系。如果某个键在子分区中不存在,则会去它的父分区中再次寻找,直到没有父分区为止。
-
-```ini
-NAME = ini
-VERSION = v1
-IMPORT_PATH = gopkg.in/%(NAME)s.%(VERSION)s
-
-[package]
-CLONE_URL = https://%(IMPORT_PATH)s
-
-[package.sub]
-```
-
-```go
-cfg.Section("package.sub").Key("CLONE_URL").String()	// https://gopkg.in/ini.v1
-```
-
-#### 读取自增键名
-
-如果数据源中的键名为 `-`,则认为该键使用了自增键名的特殊语法。计数器从 1 开始,并且分区之间是相互独立的。
-
-```ini
-[features]
--: Support read/write comments of keys and sections
--: Support auto-increment of key names
--: Support load multiple files to overwrite key values
-```
-
-```go
-cfg.Section("features").KeyStrings()	// []{"#1", "#2", "#3"}
-```
-
-### 映射到结构
-
-想要使用更加面向对象的方式玩转 INI 吗?好主意。
-
-```ini
-Name = Unknwon
-age = 21
-Male = true
-Born = 1993-01-01T20:17:05Z
-
-[Note]
-Content = Hi is a good man!
-Cities = HangZhou, Boston
-```
-
-```go
-type Note struct {
-	Content string
-	Cities  []string
-}
-
-type Person struct {
-	Name string
-	Age  int `ini:"age"`
-	Male bool
-	Born time.Time
-	Note
-	Created time.Time `ini:"-"`
-}
-
-func main() {
-	cfg, err := ini.Load("path/to/ini")
-	// ...
-	p := new(Person)
-	err = cfg.MapTo(p)
-	// ...
-
-	// 一切竟可以如此的简单。
-	err = ini.MapTo(p, "path/to/ini")
-	// ...
-
-	// 嗯哼?只需要映射一个分区吗?
-	n := new(Note)
-	err = cfg.Section("Note").MapTo(n)
-	// ...
-}
-```
-
-结构的字段怎么设置默认值呢?很简单,只要在映射之前对指定字段进行赋值就可以了。如果键未找到或者类型错误,该值不会发生改变。
-
-```go
-// ...
-p := &Person{
-	Name: "Joe",
-}
-// ...
-```
-
-这样玩 INI 真的好酷啊!然而,如果不能还给我原来的配置文件,有什么卵用?
-
-### 从结构反射
-
-可是,我有说不能吗?
-
-```go
-type Embeded struct {
-	Dates  []time.Time `delim:"|"`
-	Places []string
-	None   []int
-}
-
-type Author struct {
-	Name      string `ini:"NAME"`
-	Male      bool
-	Age       int
-	GPA       float64
-	NeverMind string `ini:"-"`
-	*Embeded
-}
-
-func main() {
-	a := &Author{"Unknwon", true, 21, 2.8, "",
-		&Embeded{
-			[]time.Time{time.Now(), time.Now()},
-			[]string{"HangZhou", "Boston"},
-			[]int{},
-		}}
-	cfg := ini.Empty()
-	err = ini.ReflectFrom(cfg, a)
-	// ...
-}
-```
-
-瞧瞧,奇迹发生了。
-
-```ini
-NAME = Unknwon
-Male = true
-Age = 21
-GPA = 2.8
-
-[Embeded]
-Dates = 2015-08-07T22:14:22+08:00|2015-08-07T22:14:22+08:00
-Places = HangZhou,Boston
-None =
-```
-
-#### 名称映射器(Name Mapper)
-
-为了节省您的时间并简化代码,本库支持类型为 [`NameMapper`](https://gowalker.org/gopkg.in/ini.v1#NameMapper) 的名称映射器,该映射器负责结构字段名与分区名和键名之间的映射。
-
-目前有 2 款内置的映射器:
-
-- `AllCapsUnderscore`:该映射器将字段名转换至格式 `ALL_CAPS_UNDERSCORE` 后再去匹配分区名和键名。
-- `TitleUnderscore`:该映射器将字段名转换至格式 `title_underscore` 后再去匹配分区名和键名。
-
-使用方法:
-
-```go
-type Info struct{
-	PackageName string
-}
-
-func main() {
-	err = ini.MapToWithMapper(&Info{}, ini.TitleUnderscore, []byte("packag_name=ini"))
-	// ...
-
-	cfg, err := ini.Load([]byte("PACKAGE_NAME=ini"))
-	// ...
-	info := new(Info)
-	cfg.NameMapper = ini.AllCapsUnderscore
-	err = cfg.MapTo(info)
-	// ...
-}
-```
-
-使用函数 `ini.ReflectFromWithMapper` 时也可应用相同的规则。
-
-#### 映射/反射的其它说明
-
-任何嵌入的结构都会被默认认作一个不同的分区,并且不会自动产生所谓的父子分区关联:
-
-```go
-type Child struct {
-	Age string
-}
-
-type Parent struct {
-	Name string
-	Child
-}
-
-type Config struct {
-	City string
-	Parent
-}
-```
-
-示例配置文件:
-
-```ini
-City = Boston
-
-[Parent]
-Name = Unknwon
-
-[Child]
-Age = 21
-```
-
-很好,但是,我就是要嵌入结构也在同一个分区。好吧,你爹是李刚!
-
-```go
-type Child struct {
-	Age string
-}
-
-type Parent struct {
-	Name string
-	Child `ini:"Parent"`
-}
-
-type Config struct {
-	City string
-	Parent
-}
-```
-
-示例配置文件:
-
-```ini
-City = Boston
-
-[Parent]
-Name = Unknwon
-Age = 21
-```
-
-## 获取帮助
-
-- [API 文档](https://gowalker.org/gopkg.in/ini.v1)
-- [创建工单](https://github.com/go-ini/ini/issues/new)
-
-## 常见问题
-
-### 字段 `BlockMode` 是什么?
-
-默认情况下,本库会在您进行读写操作时采用锁机制来确保数据时间。但在某些情况下,您非常确定只进行读操作。此时,您可以通过设置 `cfg.BlockMode = false` 来将读操作提升大约 **50-70%** 的性能。
-
-### 为什么要写另一个 INI 解析库?
-
-许多人都在使用我的 [goconfig](https://github.com/Unknwon/goconfig) 来完成对 INI 文件的操作,但我希望使用更加 Go 风格的代码。并且当您设置 `cfg.BlockMode = false` 时,会有大约 **10-30%** 的性能提升。
-
-为了做出这些改变,我必须对 API 进行破坏,所以新开一个仓库是最安全的做法。除此之外,本库直接使用 `gopkg.in` 来进行版本化发布。(其实真相是导入路径更短了)
diff --git a/vendor/github.com/aws/aws-sdk-go/vendor/github.com/go-ini/ini/ini.go b/vendor/github.com/aws/aws-sdk-go/vendor/github.com/go-ini/ini/ini.go
deleted file mode 100644
index 1fee789a1..000000000
--- a/vendor/github.com/aws/aws-sdk-go/vendor/github.com/go-ini/ini/ini.go
+++ /dev/null
@@ -1,1226 +0,0 @@
-// Copyright 2014 Unknwon
-//
-// 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 ini provides INI file read and write functionality in Go.
-package ini
-
-import (
-	"bufio"
-	"bytes"
-	"errors"
-	"fmt"
-	"io"
-	"os"
-	"regexp"
-	"runtime"
-	"strconv"
-	"strings"
-	"sync"
-	"time"
-)
-
-const (
-	DEFAULT_SECTION = "DEFAULT"
-	// Maximum allowed depth when recursively substituing variable names.
-	_DEPTH_VALUES = 99
-
-	_VERSION = "1.6.0"
-)
-
-func Version() string {
-	return _VERSION
-}
-
-var (
-	LineBreak = "\n"
-
-	// Variable regexp pattern: %(variable)s
-	varPattern = regexp.MustCompile(`%\(([^\)]+)\)s`)
-
-	// Write spaces around "=" to look better.
-	PrettyFormat = true
-)
-
-func init() {
-	if runtime.GOOS == "windows" {
-		LineBreak = "\r\n"
-	}
-}
-
-func inSlice(str string, s []string) bool {
-	for _, v := range s {
-		if str == v {
-			return true
-		}
-	}
-	return false
-}
-
-// dataSource is a interface that returns file content.
-type dataSource interface {
-	ReadCloser() (io.ReadCloser, error)
-}
-
-type sourceFile struct {
-	name string
-}
-
-func (s sourceFile) ReadCloser() (_ io.ReadCloser, err error) {
-	return os.Open(s.name)
-}
-
-type bytesReadCloser struct {
-	reader io.Reader
-}
-
-func (rc *bytesReadCloser) Read(p []byte) (n int, err error) {
-	return rc.reader.Read(p)
-}
-
-func (rc *bytesReadCloser) Close() error {
-	return nil
-}
-
-type sourceData struct {
-	data []byte
-}
-
-func (s *sourceData) ReadCloser() (io.ReadCloser, error) {
-	return &bytesReadCloser{bytes.NewReader(s.data)}, nil
-}
-
-//  ____  __.
-// |    |/ _|____ ___.__.
-// |      <_/ __ <   |  |
-// |    |  \  ___/\___  |
-// |____|__ \___  > ____|
-//         \/   \/\/
-
-// Key represents a key under a section.
-type Key struct {
-	s          *Section
-	Comment    string
-	name       string
-	value      string
-	isAutoIncr bool
-}
-
-// Name returns name of key.
-func (k *Key) Name() string {
-	return k.name
-}
-
-// Value returns raw value of key for performance purpose.
-func (k *Key) Value() string {
-	return k.value
-}
-
-// String returns string representation of value.
-func (k *Key) String() string {
-	val := k.value
-	if strings.Index(val, "%") == -1 {
-		return val
-	}
-
-	for i := 0; i < _DEPTH_VALUES; i++ {
-		vr := varPattern.FindString(val)
-		if len(vr) == 0 {
-			break
-		}
-
-		// Take off leading '%(' and trailing ')s'.
-		noption := strings.TrimLeft(vr, "%(")
-		noption = strings.TrimRight(noption, ")s")
-
-		// Search in the same section.
-		nk, err := k.s.GetKey(noption)
-		if err != nil {
-			// Search again in default section.
-			nk, _ = k.s.f.Section("").GetKey(noption)
-		}
-
-		// Substitute by new value and take off leading '%(' and trailing ')s'.
-		val = strings.Replace(val, vr, nk.value, -1)
-	}
-	return val
-}
-
-// Validate accepts a validate function which can
-// return modifed result as key value.
-func (k *Key) Validate(fn func(string) string) string {
-	return fn(k.String())
-}
-
-// parseBool returns the boolean value represented by the string.
-//
-// It accepts 1, t, T, TRUE, true, True, YES, yes, Yes, ON, on, On,
-// 0, f, F, FALSE, false, False, NO, no, No, OFF, off, Off.
-// Any other value returns an error.
-func parseBool(str string) (value bool, err error) {
-	switch str {
-	case "1", "t", "T", "true", "TRUE", "True", "YES", "yes", "Yes", "ON", "on", "On":
-		return true, nil
-	case "0", "f", "F", "false", "FALSE", "False", "NO", "no", "No", "OFF", "off", "Off":
-		return false, nil
-	}
-	return false, fmt.Errorf("parsing \"%s\": invalid syntax", str)
-}
-
-// Bool returns bool type value.
-func (k *Key) Bool() (bool, error) {
-	return parseBool(k.String())
-}
-
-// Float64 returns float64 type value.
-func (k *Key) Float64() (float64, error) {
-	return strconv.ParseFloat(k.String(), 64)
-}
-
-// Int returns int type value.
-func (k *Key) Int() (int, error) {
-	return strconv.Atoi(k.String())
-}
-
-// Int64 returns int64 type value.
-func (k *Key) Int64() (int64, error) {
-	return strconv.ParseInt(k.String(), 10, 64)
-}
-
-// Uint returns uint type valued.
-func (k *Key) Uint() (uint, error) {
-	u, e := strconv.ParseUint(k.String(), 10, 64)
-	return uint(u), e
-}
-
-// Uint64 returns uint64 type value.
-func (k *Key) Uint64() (uint64, error) {
-	return strconv.ParseUint(k.String(), 10, 64)
-}
-
-// Duration returns time.Duration type value.
-func (k *Key) Duration() (time.Duration, error) {
-	return time.ParseDuration(k.String())
-}
-
-// TimeFormat parses with given format and returns time.Time type value.
-func (k *Key) TimeFormat(format string) (time.Time, error) {
-	return time.Parse(format, k.String())
-}
-
-// Time parses with RFC3339 format and returns time.Time type value.
-func (k *Key) Time() (time.Time, error) {
-	return k.TimeFormat(time.RFC3339)
-}
-
-// MustString returns default value if key value is empty.
-func (k *Key) MustString(defaultVal string) string {
-	val := k.String()
-	if len(val) == 0 {
-		return defaultVal
-	}
-	return val
-}
-
-// MustBool always returns value without error,
-// it returns false if error occurs.
-func (k *Key) MustBool(defaultVal ...bool) bool {
-	val, err := k.Bool()
-	if len(defaultVal) > 0 && err != nil {
-		return defaultVal[0]
-	}
-	return val
-}
-
-// MustFloat64 always returns value without error,
-// it returns 0.0 if error occurs.
-func (k *Key) MustFloat64(defaultVal ...float64) float64 {
-	val, err := k.Float64()
-	if len(defaultVal) > 0 && err != nil {
-		return defaultVal[0]
-	}
-	return val
-}
-
-// MustInt always returns value without error,
-// it returns 0 if error occurs.
-func (k *Key) MustInt(defaultVal ...int) int {
-	val, err := k.Int()
-	if len(defaultVal) > 0 && err != nil {
-		return defaultVal[0]
-	}
-	return val
-}
-
-// MustInt64 always returns value without error,
-// it returns 0 if error occurs.
-func (k *Key) MustInt64(defaultVal ...int64) int64 {
-	val, err := k.Int64()
-	if len(defaultVal) > 0 && err != nil {
-		return defaultVal[0]
-	}
-	return val
-}
-
-// MustUint always returns value without error,
-// it returns 0 if error occurs.
-func (k *Key) MustUint(defaultVal ...uint) uint {
-	val, err := k.Uint()
-	if len(defaultVal) > 0 && err != nil {
-		return defaultVal[0]
-	}
-	return val
-}
-
-// MustUint64 always returns value without error,
-// it returns 0 if error occurs.
-func (k *Key) MustUint64(defaultVal ...uint64) uint64 {
-	val, err := k.Uint64()
-	if len(defaultVal) > 0 && err != nil {
-		return defaultVal[0]
-	}
-	return val
-}
-
-// MustDuration always returns value without error,
-// it returns zero value if error occurs.
-func (k *Key) MustDuration(defaultVal ...time.Duration) time.Duration {
-	val, err := k.Duration()
-	if len(defaultVal) > 0 && err != nil {
-		return defaultVal[0]
-	}
-	return val
-}
-
-// MustTimeFormat always parses with given format and returns value without error,
-// it returns zero value if error occurs.
-func (k *Key) MustTimeFormat(format string, defaultVal ...time.Time) time.Time {
-	val, err := k.TimeFormat(format)
-	if len(defaultVal) > 0 && err != nil {
-		return defaultVal[0]
-	}
-	return val
-}
-
-// MustTime always parses with RFC3339 format and returns value without error,
-// it returns zero value if error occurs.
-func (k *Key) MustTime(defaultVal ...time.Time) time.Time {
-	return k.MustTimeFormat(time.RFC3339, defaultVal...)
-}
-
-// In always returns value without error,
-// it returns default value if error occurs or doesn't fit into candidates.
-func (k *Key) In(defaultVal string, candidates []string) string {
-	val := k.String()
-	for _, cand := range candidates {
-		if val == cand {
-			return val
-		}
-	}
-	return defaultVal
-}
-
-// InFloat64 always returns value without error,
-// it returns default value if error occurs or doesn't fit into candidates.
-func (k *Key) InFloat64(defaultVal float64, candidates []float64) float64 {
-	val := k.MustFloat64()
-	for _, cand := range candidates {
-		if val == cand {
-			return val
-		}
-	}
-	return defaultVal
-}
-
-// InInt always returns value without error,
-// it returns default value if error occurs or doesn't fit into candidates.
-func (k *Key) InInt(defaultVal int, candidates []int) int {
-	val := k.MustInt()
-	for _, cand := range candidates {
-		if val == cand {
-			return val
-		}
-	}
-	return defaultVal
-}
-
-// InInt64 always returns value without error,
-// it returns default value if error occurs or doesn't fit into candidates.
-func (k *Key) InInt64(defaultVal int64, candidates []int64) int64 {
-	val := k.MustInt64()
-	for _, cand := range candidates {
-		if val == cand {
-			return val
-		}
-	}
-	return defaultVal
-}
-
-// InUint always returns value without error,
-// it returns default value if error occurs or doesn't fit into candidates.
-func (k *Key) InUint(defaultVal uint, candidates []uint) uint {
-	val := k.MustUint()
-	for _, cand := range candidates {
-		if val == cand {
-			return val
-		}
-	}
-	return defaultVal
-}
-
-// InUint64 always returns value without error,
-// it returns default value if error occurs or doesn't fit into candidates.
-func (k *Key) InUint64(defaultVal uint64, candidates []uint64) uint64 {
-	val := k.MustUint64()
-	for _, cand := range candidates {
-		if val == cand {
-			return val
-		}
-	}
-	return defaultVal
-}
-
-// InTimeFormat always parses with given format and returns value without error,
-// it returns default value if error occurs or doesn't fit into candidates.
-func (k *Key) InTimeFormat(format string, defaultVal time.Time, candidates []time.Time) time.Time {
-	val := k.MustTimeFormat(format)
-	for _, cand := range candidates {
-		if val == cand {
-			return val
-		}
-	}
-	return defaultVal
-}
-
-// InTime always parses with RFC3339 format and returns value without error,
-// it returns default value if error occurs or doesn't fit into candidates.
-func (k *Key) InTime(defaultVal time.Time, candidates []time.Time) time.Time {
-	return k.InTimeFormat(time.RFC3339, defaultVal, candidates)
-}
-
-// RangeFloat64 checks if value is in given range inclusively,
-// and returns default value if it's not.
-func (k *Key) RangeFloat64(defaultVal, min, max float64) float64 {
-	val := k.MustFloat64()
-	if val < min || val > max {
-		return defaultVal
-	}
-	return val
-}
-
-// RangeInt checks if value is in given range inclusively,
-// and returns default value if it's not.
-func (k *Key) RangeInt(defaultVal, min, max int) int {
-	val := k.MustInt()
-	if val < min || val > max {
-		return defaultVal
-	}
-	return val
-}
-
-// RangeInt64 checks if value is in given range inclusively,
-// and returns default value if it's not.
-func (k *Key) RangeInt64(defaultVal, min, max int64) int64 {
-	val := k.MustInt64()
-	if val < min || val > max {
-		return defaultVal
-	}
-	return val
-}
-
-// RangeTimeFormat checks if value with given format is in given range inclusively,
-// and returns default value if it's not.
-func (k *Key) RangeTimeFormat(format string, defaultVal, min, max time.Time) time.Time {
-	val := k.MustTimeFormat(format)
-	if val.Unix() < min.Unix() || val.Unix() > max.Unix() {
-		return defaultVal
-	}
-	return val
-}
-
-// RangeTime checks if value with RFC3339 format is in given range inclusively,
-// and returns default value if it's not.
-func (k *Key) RangeTime(defaultVal, min, max time.Time) time.Time {
-	return k.RangeTimeFormat(time.RFC3339, defaultVal, min, max)
-}
-
-// Strings returns list of string devide by given delimiter.
-func (k *Key) Strings(delim string) []string {
-	str := k.String()
-	if len(str) == 0 {
-		return []string{}
-	}
-
-	vals := strings.Split(str, delim)
-	for i := range vals {
-		vals[i] = strings.TrimSpace(vals[i])
-	}
-	return vals
-}
-
-// Float64s returns list of float64 devide by given delimiter.
-func (k *Key) Float64s(delim string) []float64 {
-	strs := k.Strings(delim)
-	vals := make([]float64, len(strs))
-	for i := range strs {
-		vals[i], _ = strconv.ParseFloat(strs[i], 64)
-	}
-	return vals
-}
-
-// Ints returns list of int devide by given delimiter.
-func (k *Key) Ints(delim string) []int {
-	strs := k.Strings(delim)
-	vals := make([]int, len(strs))
-	for i := range strs {
-		vals[i], _ = strconv.Atoi(strs[i])
-	}
-	return vals
-}
-
-// Int64s returns list of int64 devide by given delimiter.
-func (k *Key) Int64s(delim string) []int64 {
-	strs := k.Strings(delim)
-	vals := make([]int64, len(strs))
-	for i := range strs {
-		vals[i], _ = strconv.ParseInt(strs[i], 10, 64)
-	}
-	return vals
-}
-
-// Uints returns list of uint devide by given delimiter.
-func (k *Key) Uints(delim string) []uint {
-	strs := k.Strings(delim)
-	vals := make([]uint, len(strs))
-	for i := range strs {
-		u, _ := strconv.ParseUint(strs[i], 10, 64)
-		vals[i] = uint(u)
-	}
-	return vals
-}
-
-// Uint64s returns list of uint64 devide by given delimiter.
-func (k *Key) Uint64s(delim string) []uint64 {
-	strs := k.Strings(delim)
-	vals := make([]uint64, len(strs))
-	for i := range strs {
-		vals[i], _ = strconv.ParseUint(strs[i], 10, 64)
-	}
-	return vals
-}
-
-// TimesFormat parses with given format and returns list of time.Time devide by given delimiter.
-func (k *Key) TimesFormat(format, delim string) []time.Time {
-	strs := k.Strings(delim)
-	vals := make([]time.Time, len(strs))
-	for i := range strs {
-		vals[i], _ = time.Parse(format, strs[i])
-	}
-	return vals
-}
-
-// Times parses with RFC3339 format and returns list of time.Time devide by given delimiter.
-func (k *Key) Times(delim string) []time.Time {
-	return k.TimesFormat(time.RFC3339, delim)
-}
-
-// SetValue changes key value.
-func (k *Key) SetValue(v string) {
-	k.value = v
-}
-
-//   _________              __  .__
-//  /   _____/ ____   _____/  |_|__| ____   ____
-//  \_____  \_/ __ \_/ ___\   __\  |/  _ \ /    \
-//  /        \  ___/\  \___|  | |  (  <_> )   |  \
-// /_______  /\___  >\___  >__| |__|\____/|___|  /
-//         \/     \/     \/                    \/
-
-// Section represents a config section.
-type Section struct {
-	f        *File
-	Comment  string
-	name     string
-	keys     map[string]*Key
-	keyList  []string
-	keysHash map[string]string
-}
-
-func newSection(f *File, name string) *Section {
-	return &Section{f, "", name, make(map[string]*Key), make([]string, 0, 10), make(map[string]string)}
-}
-
-// Name returns name of Section.
-func (s *Section) Name() string {
-	return s.name
-}
-
-// NewKey creates a new key to given section.
-func (s *Section) NewKey(name, val string) (*Key, error) {
-	if len(name) == 0 {
-		return nil, errors.New("error creating new key: empty key name")
-	}
-
-	if s.f.BlockMode {
-		s.f.lock.Lock()
-		defer s.f.lock.Unlock()
-	}
-
-	if inSlice(name, s.keyList) {
-		s.keys[name].value = val
-		return s.keys[name], nil
-	}
-
-	s.keyList = append(s.keyList, name)
-	s.keys[name] = &Key{s, "", name, val, false}
-	s.keysHash[name] = val
-	return s.keys[name], nil
-}
-
-// GetKey returns key in section by given name.
-func (s *Section) GetKey(name string) (*Key, error) {
-	// FIXME: change to section level lock?
-	if s.f.BlockMode {
-		s.f.lock.RLock()
-	}
-	key := s.keys[name]
-	if s.f.BlockMode {
-		s.f.lock.RUnlock()
-	}
-
-	if key == nil {
-		// Check if it is a child-section.
-		sname := s.name
-		for {
-			if i := strings.LastIndex(sname, "."); i > -1 {
-				sname = sname[:i]
-				sec, err := s.f.GetSection(sname)
-				if err != nil {
-					continue
-				}
-				return sec.GetKey(name)
-			} else {
-				break
-			}
-		}
-		return nil, fmt.Errorf("error when getting key of section '%s': key '%s' not exists", s.name, name)
-	}
-	return key, nil
-}
-
-// Key assumes named Key exists in section and returns a zero-value when not.
-func (s *Section) Key(name string) *Key {
-	key, err := s.GetKey(name)
-	if err != nil {
-		// It's OK here because the only possible error is empty key name,
-		// but if it's empty, this piece of code won't be executed.
-		key, _ = s.NewKey(name, "")
-		return key
-	}
-	return key
-}
-
-// Keys returns list of keys of section.
-func (s *Section) Keys() []*Key {
-	keys := make([]*Key, len(s.keyList))
-	for i := range s.keyList {
-		keys[i] = s.Key(s.keyList[i])
-	}
-	return keys
-}
-
-// KeyStrings returns list of key names of section.
-func (s *Section) KeyStrings() []string {
-	list := make([]string, len(s.keyList))
-	copy(list, s.keyList)
-	return list
-}
-
-// KeysHash returns keys hash consisting of names and values.
-func (s *Section) KeysHash() map[string]string {
-	if s.f.BlockMode {
-		s.f.lock.RLock()
-		defer s.f.lock.RUnlock()
-	}
-
-	hash := map[string]string{}
-	for key, value := range s.keysHash {
-		hash[key] = value
-	}
-	return hash
-}
-
-// DeleteKey deletes a key from section.
-func (s *Section) DeleteKey(name string) {
-	if s.f.BlockMode {
-		s.f.lock.Lock()
-		defer s.f.lock.Unlock()
-	}
-
-	for i, k := range s.keyList {
-		if k == name {
-			s.keyList = append(s.keyList[:i], s.keyList[i+1:]...)
-			delete(s.keys, name)
-			return
-		}
-	}
-}
-
-// ___________.__.__
-// \_   _____/|__|  |   ____
-//  |    __)  |  |  | _/ __ \
-//  |     \   |  |  |_\  ___/
-//  \___  /   |__|____/\___  >
-//      \/                 \/
-
-// File represents a combination of a or more INI file(s) in memory.
-type File struct {
-	// Should make things safe, but sometimes doesn't matter.
-	BlockMode bool
-	// Make sure data is safe in multiple goroutines.
-	lock sync.RWMutex
-
-	// Allow combination of multiple data sources.
-	dataSources []dataSource
-	// Actual data is stored here.
-	sections map[string]*Section
-
-	// To keep data in order.
-	sectionList []string
-
-	NameMapper
-}
-
-// newFile initializes File object with given data sources.
-func newFile(dataSources []dataSource) *File {
-	return &File{
-		BlockMode:   true,
-		dataSources: dataSources,
-		sections:    make(map[string]*Section),
-		sectionList: make([]string, 0, 10),
-	}
-}
-
-func parseDataSource(source interface{}) (dataSource, error) {
-	switch s := source.(type) {
-	case string:
-		return sourceFile{s}, nil
-	case []byte:
-		return &sourceData{s}, nil
-	default:
-		return nil, fmt.Errorf("error parsing data source: unknown type '%s'", s)
-	}
-}
-
-// Load loads and parses from INI data sources.
-// Arguments can be mixed of file name with string type, or raw data in []byte.
-func Load(source interface{}, others ...interface{}) (_ *File, err error) {
-	sources := make([]dataSource, len(others)+1)
-	sources[0], err = parseDataSource(source)
-	if err != nil {
-		return nil, err
-	}
-	for i := range others {
-		sources[i+1], err = parseDataSource(others[i])
-		if err != nil {
-			return nil, err
-		}
-	}
-	f := newFile(sources)
-	return f, f.Reload()
-}
-
-// Empty returns an empty file object.
-func Empty() *File {
-	// Ignore error here, we sure our data is good.
-	f, _ := Load([]byte(""))
-	return f
-}
-
-// NewSection creates a new section.
-func (f *File) NewSection(name string) (*Section, error) {
-	if len(name) == 0 {
-		return nil, errors.New("error creating new section: empty section name")
-	}
-
-	if f.BlockMode {
-		f.lock.Lock()
-		defer f.lock.Unlock()
-	}
-
-	if inSlice(name, f.sectionList) {
-		return f.sections[name], nil
-	}
-
-	f.sectionList = append(f.sectionList, name)
-	f.sections[name] = newSection(f, name)
-	return f.sections[name], nil
-}
-
-// NewSections creates a list of sections.
-func (f *File) NewSections(names ...string) (err error) {
-	for _, name := range names {
-		if _, err = f.NewSection(name); err != nil {
-			return err
-		}
-	}
-	return nil
-}
-
-// GetSection returns section by given name.
-func (f *File) GetSection(name string) (*Section, error) {
-	if len(name) == 0 {
-		name = DEFAULT_SECTION
-	}
-
-	if f.BlockMode {
-		f.lock.RLock()
-		defer f.lock.RUnlock()
-	}
-
-	sec := f.sections[name]
-	if sec == nil {
-		return nil, fmt.Errorf("error when getting section: section '%s' not exists", name)
-	}
-	return sec, nil
-}
-
-// Section assumes named section exists and returns a zero-value when not.
-func (f *File) Section(name string) *Section {
-	sec, err := f.GetSection(name)
-	if err != nil {
-		// Note: It's OK here because the only possible error is empty section name,
-		// but if it's empty, this piece of code won't be executed.
-		sec, _ = f.NewSection(name)
-		return sec
-	}
-	return sec
-}
-
-// Section returns list of Section.
-func (f *File) Sections() []*Section {
-	sections := make([]*Section, len(f.sectionList))
-	for i := range f.sectionList {
-		sections[i] = f.Section(f.sectionList[i])
-	}
-	return sections
-}
-
-// SectionStrings returns list of section names.
-func (f *File) SectionStrings() []string {
-	list := make([]string, len(f.sectionList))
-	copy(list, f.sectionList)
-	return list
-}
-
-// DeleteSection deletes a section.
-func (f *File) DeleteSection(name string) {
-	if f.BlockMode {
-		f.lock.Lock()
-		defer f.lock.Unlock()
-	}
-
-	if len(name) == 0 {
-		name = DEFAULT_SECTION
-	}
-
-	for i, s := range f.sectionList {
-		if s == name {
-			f.sectionList = append(f.sectionList[:i], f.sectionList[i+1:]...)
-			delete(f.sections, name)
-			return
-		}
-	}
-}
-
-func cutComment(str string) string {
-	i := strings.Index(str, "#")
-	if i == -1 {
-		return str
-	}
-	return str[:i]
-}
-
-func checkMultipleLines(buf *bufio.Reader, line, val, valQuote string) (string, error) {
-	isEnd := false
-	for {
-		next, err := buf.ReadString('\n')
-		if err != nil {
-			if err != io.EOF {
-				return "", err
-			}
-			isEnd = true
-		}
-		pos := strings.LastIndex(next, valQuote)
-		if pos > -1 {
-			val += next[:pos]
-			break
-		}
-		val += next
-		if isEnd {
-			return "", fmt.Errorf("error parsing line: missing closing key quote from '%s' to '%s'", line, next)
-		}
-	}
-	return val, nil
-}
-
-func checkContinuationLines(buf *bufio.Reader, val string) (string, bool, error) {
-	isEnd := false
-	for {
-		valLen := len(val)
-		if valLen == 0 || val[valLen-1] != '\\' {
-			break
-		}
-		val = val[:valLen-1]
-
-		next, err := buf.ReadString('\n')
-		if err != nil {
-			if err != io.EOF {
-				return "", isEnd, err
-			}
-			isEnd = true
-		}
-
-		next = strings.TrimSpace(next)
-		if len(next) == 0 {
-			break
-		}
-		val += next
-	}
-	return val, isEnd, nil
-}
-
-// parse parses data through an io.Reader.
-func (f *File) parse(reader io.Reader) error {
-	buf := bufio.NewReader(reader)
-
-	// Handle BOM-UTF8.
-	// http://en.wikipedia.org/wiki/Byte_order_mark#Representations_of_byte_order_marks_by_encoding
-	mask, err := buf.Peek(3)
-	if err == nil && len(mask) >= 3 && mask[0] == 239 && mask[1] == 187 && mask[2] == 191 {
-		buf.Read(mask)
-	}
-
-	count := 1
-	comments := ""
-	isEnd := false
-
-	section, err := f.NewSection(DEFAULT_SECTION)
-	if err != nil {
-		return err
-	}
-
-	for {
-		line, err := buf.ReadString('\n')
-		line = strings.TrimSpace(line)
-		length := len(line)
-
-		// Check error and ignore io.EOF just for a moment.
-		if err != nil {
-			if err != io.EOF {
-				return fmt.Errorf("error reading next line: %v", err)
-			}
-			// The last line of file could be an empty line.
-			if length == 0 {
-				break
-			}
-			isEnd = true
-		}
-
-		// Skip empty lines.
-		if length == 0 {
-			continue
-		}
-
-		switch {
-		case line[0] == '#' || line[0] == ';': // Comments.
-			if len(comments) == 0 {
-				comments = line
-			} else {
-				comments += LineBreak + line
-			}
-			continue
-		case line[0] == '[' && line[length-1] == ']': // New sction.
-			section, err = f.NewSection(strings.TrimSpace(line[1 : length-1]))
-			if err != nil {
-				return err
-			}
-
-			if len(comments) > 0 {
-				section.Comment = comments
-				comments = ""
-			}
-			// Reset counter.
-			count = 1
-			continue
-		}
-
-		// Other possibilities.
-		var (
-			i        int
-			keyQuote string
-			kname    string
-			valQuote string
-			val      string
-		)
-
-		// Key name surrounded by quotes.
-		if line[0] == '"' {
-			if length > 6 && line[0:3] == `"""` {
-				keyQuote = `"""`
-			} else {
-				keyQuote = `"`
-			}
-		} else if line[0] == '`' {
-			keyQuote = "`"
-		}
-		if len(keyQuote) > 0 {
-			qLen := len(keyQuote)
-			pos := strings.Index(line[qLen:], keyQuote)
-			if pos == -1 {
-				return fmt.Errorf("error parsing line: missing closing key quote: %s", line)
-			}
-			pos = pos + qLen
-			i = strings.IndexAny(line[pos:], "=:")
-			if i < 0 {
-				return fmt.Errorf("error parsing line: key-value delimiter not found: %s", line)
-			} else if i == pos {
-				return fmt.Errorf("error parsing line: key is empty: %s", line)
-			}
-			i = i + pos
-			kname = line[qLen:pos] // Just keep spaces inside quotes.
-		} else {
-			i = strings.IndexAny(line, "=:")
-			if i < 0 {
-				return fmt.Errorf("error parsing line: key-value delimiter not found: %s", line)
-			} else if i == 0 {
-				return fmt.Errorf("error parsing line: key is empty: %s", line)
-			}
-			kname = strings.TrimSpace(line[0:i])
-		}
-
-		isAutoIncr := false
-		// Auto increment.
-		if kname == "-" {
-			isAutoIncr = true
-			kname = "#" + fmt.Sprint(count)
-			count++
-		}
-
-		lineRight := strings.TrimSpace(line[i+1:])
-		lineRightLength := len(lineRight)
-		firstChar := ""
-		if lineRightLength >= 2 {
-			firstChar = lineRight[0:1]
-		}
-		if firstChar == "`" {
-			valQuote = "`"
-		} else if firstChar == `"` {
-			if lineRightLength >= 3 && lineRight[0:3] == `"""` {
-				valQuote = `"""`
-			} else {
-				valQuote = `"`
-			}
-		} else if firstChar == `'` {
-			valQuote = `'`
-		}
-
-		if len(valQuote) > 0 {
-			qLen := len(valQuote)
-			pos := strings.LastIndex(lineRight[qLen:], valQuote)
-			// For multiple-line value check.
-			if pos == -1 {
-				if valQuote == `"` || valQuote == `'` {
-					return fmt.Errorf("error parsing line: single quote does not allow multiple-line value: %s", line)
-				}
-
-				val = lineRight[qLen:] + "\n"
-				val, err = checkMultipleLines(buf, line, val, valQuote)
-				if err != nil {
-					return err
-				}
-			} else {
-				val = lineRight[qLen : pos+qLen]
-			}
-		} else {
-			val = strings.TrimSpace(cutComment(lineRight))
-			val, isEnd, err = checkContinuationLines(buf, val)
-			if err != nil {
-				return err
-			}
-		}
-
-		k, err := section.NewKey(kname, val)
-		if err != nil {
-			return err
-		}
-		k.isAutoIncr = isAutoIncr
-		if len(comments) > 0 {
-			k.Comment = comments
-			comments = ""
-		}
-
-		if isEnd {
-			break
-		}
-	}
-	return nil
-}
-
-func (f *File) reload(s dataSource) error {
-	r, err := s.ReadCloser()
-	if err != nil {
-		return err
-	}
-	defer r.Close()
-
-	return f.parse(r)
-}
-
-// Reload reloads and parses all data sources.
-func (f *File) Reload() (err error) {
-	for _, s := range f.dataSources {
-		if err = f.reload(s); err != nil {
-			return err
-		}
-	}
-	return nil
-}
-
-// Append appends one or more data sources and reloads automatically.
-func (f *File) Append(source interface{}, others ...interface{}) error {
-	ds, err := parseDataSource(source)
-	if err != nil {
-		return err
-	}
-	f.dataSources = append(f.dataSources, ds)
-	for _, s := range others {
-		ds, err = parseDataSource(s)
-		if err != nil {
-			return err
-		}
-		f.dataSources = append(f.dataSources, ds)
-	}
-	return f.Reload()
-}
-
-// WriteToIndent writes file content into io.Writer with given value indention.
-func (f *File) WriteToIndent(w io.Writer, indent string) (n int64, err error) {
-	equalSign := "="
-	if PrettyFormat {
-		equalSign = " = "
-	}
-
-	// Use buffer to make sure target is safe until finish encoding.
-	buf := bytes.NewBuffer(nil)
-	for i, sname := range f.sectionList {
-		sec := f.Section(sname)
-		if len(sec.Comment) > 0 {
-			if sec.Comment[0] != '#' && sec.Comment[0] != ';' {
-				sec.Comment = "; " + sec.Comment
-			}
-			if _, err = buf.WriteString(sec.Comment + LineBreak); err != nil {
-				return 0, err
-			}
-		}
-
-		if i > 0 {
-			if _, err = buf.WriteString("[" + sname + "]" + LineBreak); err != nil {
-				return 0, err
-			}
-		} else {
-			// Write nothing if default section is empty.
-			if len(sec.keyList) == 0 {
-				continue
-			}
-		}
-
-		for _, kname := range sec.keyList {
-			key := sec.Key(kname)
-			if len(key.Comment) > 0 {
-				if len(indent) > 0 && sname != DEFAULT_SECTION {
-					buf.WriteString(indent)
-				}
-				if key.Comment[0] != '#' && key.Comment[0] != ';' {
-					key.Comment = "; " + key.Comment
-				}
-				if _, err = buf.WriteString(key.Comment + LineBreak); err != nil {
-					return 0, err
-				}
-			}
-
-			if len(indent) > 0 && sname != DEFAULT_SECTION {
-				buf.WriteString(indent)
-			}
-
-			switch {
-			case key.isAutoIncr:
-				kname = "-"
-			case strings.Contains(kname, "`") || strings.Contains(kname, `"`):
-				kname = `"""` + kname + `"""`
-			case strings.Contains(kname, `=`) || strings.Contains(kname, `:`):
-				kname = "`" + kname + "`"
-			}
-
-			val := key.value
-			// In case key value contains "\n", "`" or "\"".
-			if strings.Contains(val, "\n") || strings.Contains(val, "`") || strings.Contains(val, `"`) ||
-				strings.Contains(val, "#") {
-				val = `"""` + val + `"""`
-			}
-			if _, err = buf.WriteString(kname + equalSign + val + LineBreak); err != nil {
-				return 0, err
-			}
-		}
-
-		// Put a line between sections.
-		if _, err = buf.WriteString(LineBreak); err != nil {
-			return 0, err
-		}
-	}
-
-	return buf.WriteTo(w)
-}
-
-// WriteTo writes file content into io.Writer.
-func (f *File) WriteTo(w io.Writer) (int64, error) {
-	return f.WriteToIndent(w, "")
-}
-
-// SaveToIndent writes content to file system with given value indention.
-func (f *File) SaveToIndent(filename, indent string) error {
-	// Note: Because we are truncating with os.Create,
-	// 	so it's safer to save to a temporary file location and rename afte done.
-	tmpPath := filename + "." + strconv.Itoa(time.Now().Nanosecond()) + ".tmp"
-	defer os.Remove(tmpPath)
-
-	fw, err := os.Create(tmpPath)
-	if err != nil {
-		return err
-	}
-
-	if _, err = f.WriteToIndent(fw, indent); err != nil {
-		fw.Close()
-		return err
-	}
-	fw.Close()
-
-	// Remove old file and rename the new one.
-	os.Remove(filename)
-	return os.Rename(tmpPath, filename)
-}
-
-// SaveTo writes content to file system.
-func (f *File) SaveTo(filename string) error {
-	return f.SaveToIndent(filename, "")
-}
diff --git a/vendor/github.com/aws/aws-sdk-go/vendor/github.com/jmespath/go-jmespath/.gitignore b/vendor/github.com/aws/aws-sdk-go/vendor/github.com/jmespath/go-jmespath/.gitignore
deleted file mode 100644
index 531fcc11c..000000000
--- a/vendor/github.com/aws/aws-sdk-go/vendor/github.com/jmespath/go-jmespath/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-jpgo
-jmespath-fuzz.zip
-cpu.out
-go-jmespath.test
diff --git a/vendor/github.com/aws/aws-sdk-go/vendor/github.com/jmespath/go-jmespath/.travis.yml b/vendor/github.com/aws/aws-sdk-go/vendor/github.com/jmespath/go-jmespath/.travis.yml
deleted file mode 100644
index 1f9807757..000000000
--- a/vendor/github.com/aws/aws-sdk-go/vendor/github.com/jmespath/go-jmespath/.travis.yml
+++ /dev/null
@@ -1,9 +0,0 @@
-language: go
-
-sudo: false
-
-go:
-  - 1.4
-
-install: go get -v -t ./...
-script: make test
diff --git a/vendor/github.com/aws/aws-sdk-go/vendor/github.com/jmespath/go-jmespath/Makefile b/vendor/github.com/aws/aws-sdk-go/vendor/github.com/jmespath/go-jmespath/Makefile
deleted file mode 100644
index a828d2848..000000000
--- a/vendor/github.com/aws/aws-sdk-go/vendor/github.com/jmespath/go-jmespath/Makefile
+++ /dev/null
@@ -1,44 +0,0 @@
-
-CMD = jpgo
-
-help:
-	@echo "Please use \`make <target>' where <target> is one of"
-	@echo "  test                    to run all the tests"
-	@echo "  build                   to build the library and jp executable"
-	@echo "  generate                to run codegen"
-
-
-generate:
-	go generate ./...
-
-build:
-	rm -f $(CMD)
-	go build ./...
-	rm -f cmd/$(CMD)/$(CMD) && cd cmd/$(CMD)/ && go build ./...
-	mv cmd/$(CMD)/$(CMD) .
-
-test:
-	go test -v ./...
-
-check:
-	go vet ./...
-	@echo "golint ./..."
-	@lint=`golint ./...`; \
-	lint=`echo "$$lint" | grep -v "astnodetype_string.go" | grep -v "toktype_string.go"`; \
-	echo "$$lint"; \
-	if [ "$$lint" != "" ]; then exit 1; fi
-
-htmlc:
-	go test -coverprofile="/tmp/jpcov"  && go tool cover -html="/tmp/jpcov" && unlink /tmp/jpcov
-
-buildfuzz:
-	go-fuzz-build github.com/jmespath/go-jmespath/fuzz
-
-fuzz: buildfuzz
-	go-fuzz -bin=./jmespath-fuzz.zip -workdir=fuzz/testdata
-
-bench:
-	go test -bench . -cpuprofile cpu.out
-
-pprof-cpu:
-	go tool pprof ./go-jmespath.test ./cpu.out
diff --git a/vendor/github.com/aws/aws-sdk-go/vendor/github.com/jmespath/go-jmespath/README.md b/vendor/github.com/aws/aws-sdk-go/vendor/github.com/jmespath/go-jmespath/README.md
deleted file mode 100644
index 187ef676d..000000000
--- a/vendor/github.com/aws/aws-sdk-go/vendor/github.com/jmespath/go-jmespath/README.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# go-jmespath - A JMESPath implementation in Go
-
-[![Build Status](https://img.shields.io/travis/jmespath/go-jmespath.svg)](https://travis-ci.org/jmespath/go-jmespath)
-
-
-
-See http://jmespath.org for more info.
diff --git a/vendor/github.com/bugsnag/bugsnag-go/.travis.yml b/vendor/github.com/bugsnag/bugsnag-go/.travis.yml
deleted file mode 100644
index a77773b8e..000000000
--- a/vendor/github.com/bugsnag/bugsnag-go/.travis.yml
+++ /dev/null
@@ -1,13 +0,0 @@
-language: go
-
-go:
-  - 1.1
-  - 1.2
-  - 1.3
-  - tip
-
-install:
-  - go get github.com/bugsnag/panicwrap
-  - go get github.com/bugsnag/osext
-  - go get github.com/bitly/go-simplejson
-  - go get github.com/revel/revel
diff --git a/vendor/github.com/bugsnag/bugsnag-go/LICENSE.txt b/vendor/github.com/bugsnag/bugsnag-go/LICENSE.txt
deleted file mode 100644
index 3cb0ec0ff..000000000
--- a/vendor/github.com/bugsnag/bugsnag-go/LICENSE.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-Copyright (c) 2014 Bugsnag
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/vendor/github.com/bugsnag/bugsnag-go/README.md b/vendor/github.com/bugsnag/bugsnag-go/README.md
deleted file mode 100644
index b54322939..000000000
--- a/vendor/github.com/bugsnag/bugsnag-go/README.md
+++ /dev/null
@@ -1,489 +0,0 @@
-Bugsnag Notifier for Golang
-===========================
-
-The Bugsnag Notifier for Golang gives you instant notification of panics, or
-unexpected errors, in your golang app. Any unhandled panics will trigger a
-notification to be sent to your Bugsnag project.
-
-[Bugsnag](http://bugsnag.com) captures errors in real-time from your web,
-mobile and desktop applications, helping you to understand and resolve them
-as fast as possible. [Create a free account](http://bugsnag.com) to start
-capturing exceptions from your applications.
-
-## How to Install
-
-1. Download the code
-
-    ```shell
-    go get github.com/bugsnag/bugsnag-go
-    ```
-
-### Using with net/http apps
-
-For a golang app based on [net/http](https://godoc.org/net/http), integrating
-Bugsnag takes two steps. You should also use these instructions if you're using
-the [gorilla toolkit](http://www.gorillatoolkit.org/), or the
-[pat](https://github.com/bmizerany/pat/) muxer.
-
-1. Configure bugsnag at the start of your `main()` function:
-
-    ```go
-    import "github.com/bugsnag/bugsnag-go"
-
-    func main() {
-        bugsnag.Configure(bugsnag.Configuration{
-            APIKey: "YOUR_API_KEY_HERE",
-            ReleaseStage: "production",
-            // more configuration options
-        })
-
-        // rest of your program.
-    }
-    ```
-
-2. Wrap your server in a [bugsnag.Handler](https://godoc.org/github.com/bugsnag/bugsnag-go/#Handler)
-
-    ```go
-    // a. If you're using the builtin http mux, you can just pass
-    //    bugsnag.Handler(nil) to http.ListenAndServer
-    http.ListenAndServe(":8080", bugsnag.Handler(nil))
-
-    // b. If you're creating a server manually yourself, you can set
-    //    its handlers the same way
-    srv := http.Server{
-        Handler: bugsnag.Handler(nil)
-    }
-
-    // c. If you're not using the builtin http mux, wrap your own handler
-    // (though make sure that it doesn't already catch panics)
-    http.ListenAndServe(":8080", bugsnag.Handler(handler))
-    ```
-
-### Using with Revel apps
-
-There are two steps to get panic handling in [revel](https://revel.github.io) apps.
-
-1. Add the `bugsnagrevel.Filter` immediately after the `revel.PanicFilter` in `app/init.go`:
-
-    ```go
-
-    import "github.com/bugsnag/bugsnag-go/revel"
-
-    revel.Filters = []revel.Filter{
-        revel.PanicFilter,
-        bugsnagrevel.Filter,
-        // ...
-    }
-    ```
-
-2. Set bugsnag.apikey in the top section of `conf/app.conf`.
-
-    ```
-    module.static=github.com/revel/revel/modules/static
-
-    bugsnag.apikey=YOUR_API_KEY_HERE
-
-    [dev]
-    ```
-
-### Using with Google App Engine
-
-1. Configure bugsnag at the start of your `init()` function:
-
-    ```go
-    import "github.com/bugsnag/bugsnag-go"
-
-    func init() {
-        bugsnag.Configure(bugsnag.Configuration{
-            APIKey: "YOUR_API_KEY_HERE",
-        })
-
-        // ...
-    }
-    ```
-
-2. Wrap *every* http.Handler or http.HandlerFunc with Bugsnag:
-
-    ```go
-    // a. If you're using HandlerFuncs
-    http.HandleFunc("/", bugsnag.HandlerFunc(
-        func (w http.ResponseWriter, r *http.Request) {
-            // ...
-        }))
-
-    // b. If you're using Handlers
-    http.Handle("/", bugsnag.Handler(myHttpHandler))
-    ```
-
-3. In order to use Bugsnag, you must provide the current
-[`appengine.Context`](https://developers.google.com/appengine/docs/go/reference#Context), or
-current `*http.Request` as rawData. The easiest way to do this is to create a new notifier.
-
-    ```go
-    c := appengine.NewContext(r)
-    notifier := bugsnag.New(c)
-
-    if err != nil {
-        notifier.Notify(err)
-    }
-
-    go func () {
-        defer notifier.Recover()
-
-        // ...
-    }()
-    ```
-
-
-## Notifying Bugsnag manually
-
-Bugsnag will automatically handle any panics that crash your program and notify
-you of them. If you've integrated with `revel` or `net/http`, then you'll also
-be notified of any panics() that happen while processing a request.
-
-Sometimes however it's useful to manually notify Bugsnag of a problem. To do this,
-call [`bugsnag.Notify()`](https://godoc.org/github.com/bugsnag/bugsnag-go/#Notify)
-
-```go
-if err != nil {
-    bugsnag.Notify(err)
-}
-```
-
-### Manual panic handling
-
-To avoid a panic in a goroutine from crashing your entire app, you can use
-[`bugsnag.Recover()`](https://godoc.org/github.com/bugsnag/bugsnag-go/#Recover)
-to stop a panic from unwinding the stack any further. When `Recover()` is hit,
-it will send any current panic to Bugsnag and then stop panicking. This is
-most useful at the start of a goroutine:
-
-```go
-go func() {
-    defer bugsnag.Recover()
-
-    // ...
-}()
-```
-
-Alternatively you can use
-[`bugsnag.AutoNotify()`](https://godoc.org/github.com/bugsnag/bugsnag-go/#Recover)
-to notify bugsnag of a panic while letting the program continue to panic. This
-is useful if you're using a Framework that already has some handling of panics
-and you are retrofitting bugsnag support.
-
-```go
-defer bugsnag.AutoNotify()
-```
-
-## Sending Custom Data
-
-Most functions in the Bugsnag API, including `bugsnag.Notify()`,
-`bugsnag.Recover()`, `bugsnag.AutoNotify()`, and `bugsnag.Handler()` let you
-attach data to the notifications that they send. To do this you pass in rawData,
-which can be any of the supported types listed here. To add support for more
-types of rawData see [OnBeforeNotify](#custom-data-with-onbeforenotify).
-
-### Custom MetaData
-
-Custom metaData appears as tabs on Bugsnag.com. You can set it by passing
-a [`bugsnag.MetaData`](https://godoc.org/github.com/bugsnag/bugsnag-go/#MetaData)
-object as rawData.
-
-```go
-bugsnag.Notify(err,
-    bugsnag.MetaData{
-        "Account": {
-            "Name": Account.Name,
-            "Paying": Account.Plan.Premium,
-        },
-    })
-```
-
-### Request data
-
-Bugsnag can extract interesting data from
-[`*http.Request`](https://godoc.org/net/http/#Request) objects, and
-[`*revel.Controller`](https://godoc.org/github.com/revel/revel/#Controller)
-objects. These are automatically passed in when handling panics, and you can
-pass them yourself.
-
-```go
-func (w http.ResponseWriter, r *http.Request) {
-    bugsnag.Notify(err, r)
-}
-```
-
-### User data
-
-User data is searchable, and the `Id` powers the count of users affected. You
-can set which user an error affects by passing a
-[`bugsnag.User`](https://godoc.org/github.com/bugsnag/bugsnag-go/#User) object as
-rawData.
-
-```go
-bugsnag.Notify(err,
-    bugsnag.User{Id: "1234", Name: "Conrad", Email: "me@cirw.in"})
-```
-
-### Context
-
-The context shows up prominently in the list view so that you can get an idea
-of where a problem occurred. You can set it by passing a
-[`bugsnag.Context`](https://godoc.org/github.com/bugsnag/bugsnag-go/#Context)
-object as rawData.
-
-```go
-bugsnag.Notify(err, bugsnag.Context{"backgroundJob"})
-```
-
-### Severity
-
-Bugsnag supports three severities, `SeverityError`, `SeverityWarning`, and `SeverityInfo`.
-You can set the severity of an error by passing one of these objects as rawData.
-
-```go
-bugsnag.Notify(err, bugsnag.SeverityInfo)
-```
-
-## Configuration
-
-You must call `bugsnag.Configure()` at the start of your program to use Bugsnag, you pass it
-a [`bugsnag.Configuration`](https://godoc.org/github.com/bugsnag/bugsnag-go/#Configuration) object
-containing any of the following values.
-
-### APIKey
-
-The Bugsnag API key can be found on your [Bugsnag dashboard](https://bugsnag.com) under "Settings".
-
-```go
-bugsnag.Configure(bugsnag.Configuration{
-    APIKey: "YOUR_API_KEY_HERE",
-})
-```
-
-### Endpoint
-
-The Bugsnag endpoint defaults to `https://notify.bugsnag.com/`. If you're using Bugsnag enterprise,
-you should set this to the endpoint of your local instance.
-
-```go
-bugsnag.Configure(bugsnag.Configuration{
-    Endpoint: "http://bugsnag.internal:49000/",
-})
-```
-
-### ReleaseStage
-
-The ReleaseStage tracks where your app is deployed. You should set this to `production`, `staging`,
-`development` or similar as appropriate.
-
-```go
-bugsnag.Configure(bugsnag.Configuration{
-    ReleaseStage: "development",
-})
-```
-
-### NotifyReleaseStages
-
-The list of ReleaseStages to notify in. By default Bugsnag will notify you in all release stages, but
-you can use this to silence development errors.
-
-```go
-bugsnag.Configure(bugsnag.Configuration{
-    NotifyReleaseStages: []string{"production", "staging"},
-})
-```
-
-### AppVersion
-
-If you use a versioning scheme for deploys of your app, Bugsnag can use the `AppVersion` to only
-re-open errors if they occur in later version of the app.
-
-```go
-bugsnag.Configure(bugsnag.Configuration{
-    AppVersion: "1.2.3",
-})
-```
-
-### Hostname
-
-The hostname is used to track where exceptions are coming from in the Bugsnag dashboard. The
-default value is obtained from `os.Hostname()` so you won't often need to change this.
-
-```go
-bugsnag.Configure(bugsnag.Configuration{
-    Hostname: "go1",
-})
-```
-
-### ProjectPackages
-
-In order to determine where a crash happens Bugsnag needs to know which packages you consider to
-be part of your app (as opposed to a library). By default this is set to `[]string{"main*"}`. Strings
-are matched to package names using [`filepath.Match`](http://godoc.org/path/filepath#Match).
-
-```go
-bugsnag.Configure(bugsnag.Configuration{
-    ProjectPackages: []string{"main", "github.com/domain/myapp/*"},
-}
-```
-
-### ParamsFilters
-
-Sometimes sensitive data is accidentally included in Bugsnag MetaData. You can remove it by
-setting `ParamsFilters`. Any key in the `MetaData` that includes any string in the filters
-will be redacted. The default is `[]string{"password", "secret"}`, which prevents fields like
-`password`, `password_confirmation` and `secret_answer` from being sent.
-
-```go
-bugsnag.Configure(bugsnag.Configuration{
-    ParamsFilters: []string{"password", "secret"},
-}
-```
-
-### Logger
-
-The Logger to write to in case of an error inside Bugsnag. This defaults to the global logger.
-
-```go
-bugsnag.Configure(bugsnag.Configuration{
-    Logger: app.Logger,
-}
-```
-
-### PanicHandler
-
-The first time Bugsnag is configured, it wraps the running program in a panic
-handler using [panicwrap](http://godoc.org/github.com/ConradIrwin/panicwrap). This
-forks a sub-process which monitors unhandled panics. To prevent this, set
-`PanicHandler` to `func() {}` the first time you call
-`bugsnag.Configure`. This will prevent bugsnag from being able to notify you about
-unhandled panics.
-
-```go
-bugsnag.Configure(bugsnag.Configuration{
-    PanicHandler: func() {},
-})
-```
-
-### Synchronous
-
-Bugsnag usually starts a new goroutine before sending notifications. This means
-that notifications can be lost if you do a bugsnag.Notify and then immediately
-os.Exit. To avoid this problem, set Bugsnag to Synchronous (or just `panic()`
-instead ;).
-
-```go
-bugsnag.Configure(bugsnag.Configuration{
-    Synchronous: true
-})
-```
-
-Or just for one error:
-
-```go
-bugsnag.Notify(err, bugsnag.Configuration{Synchronous: true})
-```
-
-### Transport
-
-The transport configures how Bugsnag makes http requests. By default we use
-[`http.DefaultTransport`](http://godoc.org/net/http#RoundTripper) which handles
-HTTP proxies automatically using the `$HTTP_PROXY` environment variable.
-
-```go
-bugsnag.Configure(bugsnag.Configuration{
-    Transport: http.DefaultTransport,
-})
-```
-
-## Custom data with OnBeforeNotify
-
-While it's nice that you can pass `MetaData` directly into `bugsnag.Notify`,
-`bugsnag.AutoNotify`, and `bugsnag.Recover`, this can be a bit cumbersome and
-inefficient — you're constructing the meta-data whether or not it will actually
-be used.  A better idea is to pass raw data in to these functions, and add an
-`OnBeforeNotify` filter that converts them into `MetaData`.
-
-For example, lets say our system processes jobs:
-
-```go
-type Job struct{
-    Retry     bool
-    UserId    string
-    UserEmail string
-    Name      string
-    Params    map[string]string
-}
-```
-
-You can pass a job directly into Bugsnag.notify:
-
-```go
-bugsnag.Notify(err, job)
-```
-
-And then add a filter to extract information from that job and attach it to the
-Bugsnag event:
-
-```go
-bugsnag.OnBeforeNotify(
-    func(event *bugsnag.Event, config *bugsnag.Configuration) error {
-
-        // Search all the RawData for any *Job pointers that we're passed in
-        // to bugsnag.Notify() and friends.
-        for _, datum := range event.RawData {
-            if job, ok := datum.(*Job); ok {
-                // don't notify bugsnag about errors in retries
-                if job.Retry {
-                    return fmt.Errorf("not notifying about retried jobs")
-                }
-
-                // add the job as a tab on Bugsnag.com
-                event.MetaData.AddStruct("Job", job)
-
-                // set the user correctly
-                event.User = &User{Id: job.UserId, Email: job.UserEmail}
-            }
-        }
-
-        // continue notifying as normal
-        return nil
-    })
-```
-
-## Advanced Usage
-
-If you want to have multiple different configurations around in one program,
-you can use `bugsnag.New()` to create multiple independent instances of
-Bugsnag. You can use these without calling `bugsnag.Configure()`, but bear in
-mind that until you call `bugsnag.Configure()` unhandled panics will not be
-sent to bugsnag.
-
-```go
-notifier := bugsnag.New(bugsnag.Configuration{
-    APIKey: "YOUR_OTHER_API_KEY",
-})
-```
-
-In fact any place that lets you pass in `rawData` also allows you to pass in
-configuration.  For example to send http errors to one bugsnag project, you
-could do:
-
-```go
-bugsnag.Handler(nil, bugsnag.Configuration{APIKey: "YOUR_OTHER_API_KEY"})
-```
-
-### GroupingHash
-
-If you need to override Bugsnag's grouping algorithm, you can set the
-`GroupingHash` in an `OnBeforeNotify`:
-
-```go
-bugsnag.OnBeforeNotify(
-    func (event *bugsnag.Event, config *bugsnag.Configuration) error {
-        event.GroupingHash = calculateGroupingHash(event)
-        return nil
-    })
-```
diff --git a/vendor/github.com/bugsnag/bugsnag-go/errors/README.md b/vendor/github.com/bugsnag/bugsnag-go/errors/README.md
deleted file mode 100644
index 8d8e097aa..000000000
--- a/vendor/github.com/bugsnag/bugsnag-go/errors/README.md
+++ /dev/null
@@ -1,6 +0,0 @@
-Adds stacktraces to errors in golang.
-
-This was made to help build the Bugsnag notifier but can be used standalone if
-you like to have stacktraces on errors.
-
-See [Godoc](https://godoc.org/github.com/bugsnag/bugsnag-go/errors) for the API docs.
diff --git a/vendor/github.com/bugsnag/panicwrap/README.md b/vendor/github.com/bugsnag/panicwrap/README.md
deleted file mode 100644
index d0a596753..000000000
--- a/vendor/github.com/bugsnag/panicwrap/README.md
+++ /dev/null
@@ -1,101 +0,0 @@
-# panicwrap
-
-panicwrap is a Go library that re-executes a Go binary and monitors stderr
-output from the binary for a panic. When it find a panic, it executes a
-user-defined handler function. Stdout, stderr, stdin, signals, and exit
-codes continue to work as normal, making the existence of panicwrap mostly
-invisble to the end user until a panic actually occurs.
-
-Since a panic is truly a bug in the program meant to crash the runtime,
-globally catching panics within Go applications is not supposed to be possible.
-Despite this, it is often useful to have a way to know when panics occur.
-panicwrap allows you to do something with these panics, such as writing them
-to a file, so that you can track when panics occur.
-
-panicwrap is ***not a panic recovery system***. Panics indicate serious
-problems with your application and _should_ crash the runtime. panicwrap
-is just meant as a way to monitor for panics. If you still think this is
-the worst idea ever, read the section below on why.
-
-## Features
-
-* **SIMPLE!**
-* Works with all Go applications on all platforms Go supports
-* Custom behavior when a panic occurs
-* Stdout, stderr, stdin, exit codes, and signals continue to work as
-  expected.
-
-## Usage
-
-Using panicwrap is simple. It behaves a lot like `fork`, if you know
-how that works. A basic example is shown below.
-
-Because it would be sad to panic while capturing a panic, it is recommended
-that the handler functions for panicwrap remain relatively simple and well
-tested. panicwrap itself contains many tests.
-
-```go
-package main
-
-import (
-	"fmt"
-	"github.com/mitchellh/panicwrap"
-	"os"
-)
-
-func main() {
-	exitStatus, err := panicwrap.BasicWrap(panicHandler)
-	if err != nil {
-		// Something went wrong setting up the panic wrapper. Unlikely,
-		// but possible.
-		panic(err)
-	}
-
-	// If exitStatus >= 0, then we're the parent process and the panicwrap
-	// re-executed ourselves and completed. Just exit with the proper status.
-	if exitStatus >= 0 {
-		os.Exit(exitStatus)
-	}
-
-	// Otherwise, exitStatus < 0 means we're the child. Continue executing as
-	// normal...
-
-	// Let's say we panic
-	panic("oh shucks")
-}
-
-func panicHandler(output string) {
-	// output contains the full output (including stack traces) of the
-	// panic. Put it in a file or something.
-	fmt.Printf("The child panicked:\n\n%s\n", output)
-	os.Exit(1)
-}
-```
-
-## How Does it Work?
-
-panicwrap works by re-executing the running program (retaining arguments,
-environmental variables, etc.) and monitoring the stderr of the program.
-Since Go always outputs panics in a predictable way with a predictable
-exit code, panicwrap is able to reliably detect panics and allow the parent
-process to handle them.
-
-## WHY?! Panics should CRASH!
-
-Yes, panics _should_ crash. They are 100% always indicative of bugs.
-However, in some cases, such as user-facing programs (programs like
-[Packer](http://github.com/mitchellh/packer) or
-[Docker](http://github.com/dotcloud/docker)), it is up to the user to
-report such panics. This is unreliable, at best, and it would be better if the
-program could have a way to automatically report panics. panicwrap provides
-a way to do this.
-
-For backend applications, it is easier to detect crashes (since the application
-exits). However, it is still nice sometimes to more intelligently log
-panics in some way. For example, at [HashiCorp](http://www.hashicorp.com),
-we use panicwrap to log panics to timestamped files with some additional
-data (configuration settings at the time, environmental variables, etc.)
-
-The goal of panicwrap is _not_ to hide panics. It is instead to provide
-a clean mechanism for handling them before bubbling the up to the user
-and ultimately crashing.
diff --git a/vendor/github.com/denverdino/aliyungo/LICENSE.txt b/vendor/github.com/denverdino/aliyungo/LICENSE.txt
deleted file mode 100644
index 918297133..000000000
--- a/vendor/github.com/denverdino/aliyungo/LICENSE.txt
+++ /dev/null
@@ -1,191 +0,0 @@
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        https://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   Copyright 2015-2015 Li Yi (denverdino@gmail.com).
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       https://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
diff --git a/vendor/github.com/docker/libtrust/CONTRIBUTING.md b/vendor/github.com/docker/libtrust/CONTRIBUTING.md
deleted file mode 100644
index 05be0f8ab..000000000
--- a/vendor/github.com/docker/libtrust/CONTRIBUTING.md
+++ /dev/null
@@ -1,13 +0,0 @@
-# Contributing to libtrust
-
-Want to hack on libtrust? Awesome! Here are instructions to get you
-started.
-
-libtrust is a part of the [Docker](https://www.docker.com) project, and follows
-the same rules and principles. If you're already familiar with the way
-Docker does things, you'll feel right at home.
-
-Otherwise, go read
-[Docker's contributions guidelines](https://github.com/docker/docker/blob/master/CONTRIBUTING.md).
-
-Happy hacking!
diff --git a/vendor/github.com/docker/libtrust/MAINTAINERS b/vendor/github.com/docker/libtrust/MAINTAINERS
deleted file mode 100644
index 9768175fe..000000000
--- a/vendor/github.com/docker/libtrust/MAINTAINERS
+++ /dev/null
@@ -1,3 +0,0 @@
-Solomon Hykes <solomon@docker.com>
-Josh Hawn <josh@docker.com> (github: jlhawn)
-Derek McGowan <derek@docker.com> (github: dmcgowan)
diff --git a/vendor/github.com/docker/libtrust/README.md b/vendor/github.com/docker/libtrust/README.md
deleted file mode 100644
index 8e7db3818..000000000
--- a/vendor/github.com/docker/libtrust/README.md
+++ /dev/null
@@ -1,18 +0,0 @@
-# libtrust
-
-Libtrust is library for managing authentication and authorization using public key cryptography.
-
-Authentication is handled using the identity attached to the public key.
-Libtrust provides multiple methods to prove possession of the private key associated with an identity.
- - TLS x509 certificates
- - Signature verification
- - Key Challenge
-
-Authorization and access control is managed through a distributed trust graph.
-Trust servers are used as the authorities of the trust graph and allow caching portions of the graph for faster access.
-
-## Copyright and license
-
-Code and documentation copyright 2014 Docker, inc. Code released under the Apache 2.0 license.
-Docs released under Creative commons.
-
diff --git a/vendor/github.com/garyburd/redigo/internal/commandinfo.go b/vendor/github.com/garyburd/redigo/internal/commandinfo.go
index ce78eff6f..7ad1ade57 100644
--- a/vendor/github.com/garyburd/redigo/internal/commandinfo.go
+++ b/vendor/github.com/garyburd/redigo/internal/commandinfo.go
@@ -12,7 +12,7 @@
 // License for the specific language governing permissions and limitations
 // under the License.
 
-package internal
+package internal // import "github.com/garyburd/redigo/internal"
 
 import (
 	"strings"
diff --git a/vendor/github.com/garyburd/redigo/redis/doc.go b/vendor/github.com/garyburd/redigo/redis/doc.go
index 1ae6f0cc2..a5cd454af 100644
--- a/vendor/github.com/garyburd/redigo/redis/doc.go
+++ b/vendor/github.com/garyburd/redigo/redis/doc.go
@@ -166,4 +166,4 @@
 //   if _, err := redis.Scan(reply, &value1, &value2); err != nil {
 //      // handle error
 //  }
-package redis
+package redis // import "github.com/garyburd/redigo/redis"
diff --git a/vendor/github.com/aws/aws-sdk-go/vendor/github.com/go-ini/ini/LICENSE b/vendor/github.com/go-ini/ini/LICENSE
similarity index 100%
rename from vendor/github.com/aws/aws-sdk-go/vendor/github.com/go-ini/ini/LICENSE
rename to vendor/github.com/go-ini/ini/LICENSE
diff --git a/vendor/github.com/go-ini/ini/error.go b/vendor/github.com/go-ini/ini/error.go
new file mode 100644
index 000000000..80afe7431
--- /dev/null
+++ b/vendor/github.com/go-ini/ini/error.go
@@ -0,0 +1,32 @@
+// Copyright 2016 Unknwon
+//
+// 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 ini
+
+import (
+	"fmt"
+)
+
+type ErrDelimiterNotFound struct {
+	Line string
+}
+
+func IsErrDelimiterNotFound(err error) bool {
+	_, ok := err.(ErrDelimiterNotFound)
+	return ok
+}
+
+func (err ErrDelimiterNotFound) Error() string {
+	return fmt.Sprintf("key-value delimiter not found: %s", err.Line)
+}
diff --git a/vendor/github.com/go-ini/ini/ini.go b/vendor/github.com/go-ini/ini/ini.go
new file mode 100644
index 000000000..cd065e782
--- /dev/null
+++ b/vendor/github.com/go-ini/ini/ini.go
@@ -0,0 +1,501 @@
+// Copyright 2014 Unknwon
+//
+// 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 ini provides INI file read and write functionality in Go.
+package ini
+
+import (
+	"bytes"
+	"errors"
+	"fmt"
+	"io"
+	"os"
+	"regexp"
+	"runtime"
+	"strconv"
+	"strings"
+	"sync"
+	"time"
+)
+
+const (
+	// Name for default section. You can use this constant or the string literal.
+	// In most of cases, an empty string is all you need to access the section.
+	DEFAULT_SECTION = "DEFAULT"
+
+	// Maximum allowed depth when recursively substituing variable names.
+	_DEPTH_VALUES = 99
+	_VERSION      = "1.21.1"
+)
+
+// Version returns current package version literal.
+func Version() string {
+	return _VERSION
+}
+
+var (
+	// Delimiter to determine or compose a new line.
+	// This variable will be changed to "\r\n" automatically on Windows
+	// at package init time.
+	LineBreak = "\n"
+
+	// Variable regexp pattern: %(variable)s
+	varPattern = regexp.MustCompile(`%\(([^\)]+)\)s`)
+
+	// Indicate whether to align "=" sign with spaces to produce pretty output
+	// or reduce all possible spaces for compact format.
+	PrettyFormat = true
+
+	// Explicitly write DEFAULT section header
+	DefaultHeader = false
+)
+
+func init() {
+	if runtime.GOOS == "windows" {
+		LineBreak = "\r\n"
+	}
+}
+
+func inSlice(str string, s []string) bool {
+	for _, v := range s {
+		if str == v {
+			return true
+		}
+	}
+	return false
+}
+
+// dataSource is an interface that returns object which can be read and closed.
+type dataSource interface {
+	ReadCloser() (io.ReadCloser, error)
+}
+
+// sourceFile represents an object that contains content on the local file system.
+type sourceFile struct {
+	name string
+}
+
+func (s sourceFile) ReadCloser() (_ io.ReadCloser, err error) {
+	return os.Open(s.name)
+}
+
+type bytesReadCloser struct {
+	reader io.Reader
+}
+
+func (rc *bytesReadCloser) Read(p []byte) (n int, err error) {
+	return rc.reader.Read(p)
+}
+
+func (rc *bytesReadCloser) Close() error {
+	return nil
+}
+
+// sourceData represents an object that contains content in memory.
+type sourceData struct {
+	data []byte
+}
+
+func (s *sourceData) ReadCloser() (io.ReadCloser, error) {
+	return &bytesReadCloser{bytes.NewReader(s.data)}, nil
+}
+
+// File represents a combination of a or more INI file(s) in memory.
+type File struct {
+	// Should make things safe, but sometimes doesn't matter.
+	BlockMode bool
+	// Make sure data is safe in multiple goroutines.
+	lock sync.RWMutex
+
+	// Allow combination of multiple data sources.
+	dataSources []dataSource
+	// Actual data is stored here.
+	sections map[string]*Section
+
+	// To keep data in order.
+	sectionList []string
+
+	options LoadOptions
+
+	NameMapper
+	ValueMapper
+}
+
+// newFile initializes File object with given data sources.
+func newFile(dataSources []dataSource, opts LoadOptions) *File {
+	return &File{
+		BlockMode:   true,
+		dataSources: dataSources,
+		sections:    make(map[string]*Section),
+		sectionList: make([]string, 0, 10),
+		options:     opts,
+	}
+}
+
+func parseDataSource(source interface{}) (dataSource, error) {
+	switch s := source.(type) {
+	case string:
+		return sourceFile{s}, nil
+	case []byte:
+		return &sourceData{s}, nil
+	default:
+		return nil, fmt.Errorf("error parsing data source: unknown type '%s'", s)
+	}
+}
+
+type LoadOptions struct {
+	// Loose indicates whether the parser should ignore nonexistent files or return error.
+	Loose bool
+	// Insensitive indicates whether the parser forces all section and key names to lowercase.
+	Insensitive bool
+	// IgnoreContinuation indicates whether to ignore continuation lines while parsing.
+	IgnoreContinuation bool
+	// AllowBooleanKeys indicates whether to allow boolean type keys or treat as value is missing.
+	// This type of keys are mostly used in my.cnf.
+	AllowBooleanKeys bool
+}
+
+func LoadSources(opts LoadOptions, source interface{}, others ...interface{}) (_ *File, err error) {
+	sources := make([]dataSource, len(others)+1)
+	sources[0], err = parseDataSource(source)
+	if err != nil {
+		return nil, err
+	}
+	for i := range others {
+		sources[i+1], err = parseDataSource(others[i])
+		if err != nil {
+			return nil, err
+		}
+	}
+	f := newFile(sources, opts)
+	if err = f.Reload(); err != nil {
+		return nil, err
+	}
+	return f, nil
+}
+
+// Load loads and parses from INI data sources.
+// Arguments can be mixed of file name with string type, or raw data in []byte.
+// It will return error if list contains nonexistent files.
+func Load(source interface{}, others ...interface{}) (*File, error) {
+	return LoadSources(LoadOptions{}, source, others...)
+}
+
+// LooseLoad has exactly same functionality as Load function
+// except it ignores nonexistent files instead of returning error.
+func LooseLoad(source interface{}, others ...interface{}) (*File, error) {
+	return LoadSources(LoadOptions{Loose: true}, source, others...)
+}
+
+// InsensitiveLoad has exactly same functionality as Load function
+// except it forces all section and key names to be lowercased.
+func InsensitiveLoad(source interface{}, others ...interface{}) (*File, error) {
+	return LoadSources(LoadOptions{Insensitive: true}, source, others...)
+}
+
+// Empty returns an empty file object.
+func Empty() *File {
+	// Ignore error here, we sure our data is good.
+	f, _ := Load([]byte(""))
+	return f
+}
+
+// NewSection creates a new section.
+func (f *File) NewSection(name string) (*Section, error) {
+	if len(name) == 0 {
+		return nil, errors.New("error creating new section: empty section name")
+	} else if f.options.Insensitive && name != DEFAULT_SECTION {
+		name = strings.ToLower(name)
+	}
+
+	if f.BlockMode {
+		f.lock.Lock()
+		defer f.lock.Unlock()
+	}
+
+	if inSlice(name, f.sectionList) {
+		return f.sections[name], nil
+	}
+
+	f.sectionList = append(f.sectionList, name)
+	f.sections[name] = newSection(f, name)
+	return f.sections[name], nil
+}
+
+// NewSections creates a list of sections.
+func (f *File) NewSections(names ...string) (err error) {
+	for _, name := range names {
+		if _, err = f.NewSection(name); err != nil {
+			return err
+		}
+	}
+	return nil
+}
+
+// GetSection returns section by given name.
+func (f *File) GetSection(name string) (*Section, error) {
+	if len(name) == 0 {
+		name = DEFAULT_SECTION
+	} else if f.options.Insensitive {
+		name = strings.ToLower(name)
+	}
+
+	if f.BlockMode {
+		f.lock.RLock()
+		defer f.lock.RUnlock()
+	}
+
+	sec := f.sections[name]
+	if sec == nil {
+		return nil, fmt.Errorf("section '%s' does not exist", name)
+	}
+	return sec, nil
+}
+
+// Section assumes named section exists and returns a zero-value when not.
+func (f *File) Section(name string) *Section {
+	sec, err := f.GetSection(name)
+	if err != nil {
+		// Note: It's OK here because the only possible error is empty section name,
+		// but if it's empty, this piece of code won't be executed.
+		sec, _ = f.NewSection(name)
+		return sec
+	}
+	return sec
+}
+
+// Section returns list of Section.
+func (f *File) Sections() []*Section {
+	sections := make([]*Section, len(f.sectionList))
+	for i := range f.sectionList {
+		sections[i] = f.Section(f.sectionList[i])
+	}
+	return sections
+}
+
+// SectionStrings returns list of section names.
+func (f *File) SectionStrings() []string {
+	list := make([]string, len(f.sectionList))
+	copy(list, f.sectionList)
+	return list
+}
+
+// DeleteSection deletes a section.
+func (f *File) DeleteSection(name string) {
+	if f.BlockMode {
+		f.lock.Lock()
+		defer f.lock.Unlock()
+	}
+
+	if len(name) == 0 {
+		name = DEFAULT_SECTION
+	}
+
+	for i, s := range f.sectionList {
+		if s == name {
+			f.sectionList = append(f.sectionList[:i], f.sectionList[i+1:]...)
+			delete(f.sections, name)
+			return
+		}
+	}
+}
+
+func (f *File) reload(s dataSource) error {
+	r, err := s.ReadCloser()
+	if err != nil {
+		return err
+	}
+	defer r.Close()
+
+	return f.parse(r)
+}
+
+// Reload reloads and parses all data sources.
+func (f *File) Reload() (err error) {
+	for _, s := range f.dataSources {
+		if err = f.reload(s); err != nil {
+			// In loose mode, we create an empty default section for nonexistent files.
+			if os.IsNotExist(err) && f.options.Loose {
+				f.parse(bytes.NewBuffer(nil))
+				continue
+			}
+			return err
+		}
+	}
+	return nil
+}
+
+// Append appends one or more data sources and reloads automatically.
+func (f *File) Append(source interface{}, others ...interface{}) error {
+	ds, err := parseDataSource(source)
+	if err != nil {
+		return err
+	}
+	f.dataSources = append(f.dataSources, ds)
+	for _, s := range others {
+		ds, err = parseDataSource(s)
+		if err != nil {
+			return err
+		}
+		f.dataSources = append(f.dataSources, ds)
+	}
+	return f.Reload()
+}
+
+// WriteToIndent writes content into io.Writer with given indention.
+// If PrettyFormat has been set to be true,
+// it will align "=" sign with spaces under each section.
+func (f *File) WriteToIndent(w io.Writer, indent string) (n int64, err error) {
+	equalSign := "="
+	if PrettyFormat {
+		equalSign = " = "
+	}
+
+	// Use buffer to make sure target is safe until finish encoding.
+	buf := bytes.NewBuffer(nil)
+	for i, sname := range f.sectionList {
+		sec := f.Section(sname)
+		if len(sec.Comment) > 0 {
+			if sec.Comment[0] != '#' && sec.Comment[0] != ';' {
+				sec.Comment = "; " + sec.Comment
+			}
+			if _, err = buf.WriteString(sec.Comment + LineBreak); err != nil {
+				return 0, err
+			}
+		}
+
+		if i > 0 || DefaultHeader {
+			if _, err = buf.WriteString("[" + sname + "]" + LineBreak); err != nil {
+				return 0, err
+			}
+		} else {
+			// Write nothing if default section is empty
+			if len(sec.keyList) == 0 {
+				continue
+			}
+		}
+
+		// Count and generate alignment length and buffer spaces using the
+		// longest key. Keys may be modifed if they contain certain characters so
+		// we need to take that into account in our calculation.
+		alignLength := 0
+		if PrettyFormat {
+			for _, kname := range sec.keyList {
+				keyLength := len(kname)
+				// First case will surround key by ` and second by """
+				if strings.ContainsAny(kname, "\"=:") {
+					keyLength += 2
+				} else if strings.Contains(kname, "`") {
+					keyLength += 6
+				}
+
+				if keyLength > alignLength {
+					alignLength = keyLength
+				}
+			}
+		}
+		alignSpaces := bytes.Repeat([]byte(" "), alignLength)
+
+		for _, kname := range sec.keyList {
+			key := sec.Key(kname)
+			if len(key.Comment) > 0 {
+				if len(indent) > 0 && sname != DEFAULT_SECTION {
+					buf.WriteString(indent)
+				}
+				if key.Comment[0] != '#' && key.Comment[0] != ';' {
+					key.Comment = "; " + key.Comment
+				}
+				if _, err = buf.WriteString(key.Comment + LineBreak); err != nil {
+					return 0, err
+				}
+			}
+
+			if len(indent) > 0 && sname != DEFAULT_SECTION {
+				buf.WriteString(indent)
+			}
+
+			switch {
+			case key.isAutoIncrement:
+				kname = "-"
+			case strings.ContainsAny(kname, "\"=:"):
+				kname = "`" + kname + "`"
+			case strings.Contains(kname, "`"):
+				kname = `"""` + kname + `"""`
+			}
+			if _, err = buf.WriteString(kname); err != nil {
+				return 0, err
+			}
+
+			if key.isBooleanType {
+				continue
+			}
+
+			// Write out alignment spaces before "=" sign
+			if PrettyFormat {
+				buf.Write(alignSpaces[:alignLength-len(kname)])
+			}
+
+			val := key.value
+			// In case key value contains "\n", "`", "\"", "#" or ";"
+			if strings.ContainsAny(val, "\n`") {
+				val = `"""` + val + `"""`
+			} else if strings.ContainsAny(val, "#;") {
+				val = "`" + val + "`"
+			}
+			if _, err = buf.WriteString(equalSign + val + LineBreak); err != nil {
+				return 0, err
+			}
+		}
+
+		// Put a line between sections
+		if _, err = buf.WriteString(LineBreak); err != nil {
+			return 0, err
+		}
+	}
+
+	return buf.WriteTo(w)
+}
+
+// WriteTo writes file content into io.Writer.
+func (f *File) WriteTo(w io.Writer) (int64, error) {
+	return f.WriteToIndent(w, "")
+}
+
+// SaveToIndent writes content to file system with given value indention.
+func (f *File) SaveToIndent(filename, indent string) error {
+	// Note: Because we are truncating with os.Create,
+	// 	so it's safer to save to a temporary file location and rename afte done.
+	tmpPath := filename + "." + strconv.Itoa(time.Now().Nanosecond()) + ".tmp"
+	defer os.Remove(tmpPath)
+
+	fw, err := os.Create(tmpPath)
+	if err != nil {
+		return err
+	}
+
+	if _, err = f.WriteToIndent(fw, indent); err != nil {
+		fw.Close()
+		return err
+	}
+	fw.Close()
+
+	// Remove old file and rename the new one.
+	os.Remove(filename)
+	return os.Rename(tmpPath, filename)
+}
+
+// SaveTo writes content to file system.
+func (f *File) SaveTo(filename string) error {
+	return f.SaveToIndent(filename, "")
+}
diff --git a/vendor/github.com/go-ini/ini/key.go b/vendor/github.com/go-ini/ini/key.go
new file mode 100644
index 000000000..9738c55a2
--- /dev/null
+++ b/vendor/github.com/go-ini/ini/key.go
@@ -0,0 +1,633 @@
+// Copyright 2014 Unknwon
+//
+// 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 ini
+
+import (
+	"fmt"
+	"strconv"
+	"strings"
+	"time"
+)
+
+// Key represents a key under a section.
+type Key struct {
+	s               *Section
+	name            string
+	value           string
+	isAutoIncrement bool
+	isBooleanType   bool
+
+	Comment string
+}
+
+// ValueMapper represents a mapping function for values, e.g. os.ExpandEnv
+type ValueMapper func(string) string
+
+// Name returns name of key.
+func (k *Key) Name() string {
+	return k.name
+}
+
+// Value returns raw value of key for performance purpose.
+func (k *Key) Value() string {
+	return k.value
+}
+
+// String returns string representation of value.
+func (k *Key) String() string {
+	val := k.value
+	if k.s.f.ValueMapper != nil {
+		val = k.s.f.ValueMapper(val)
+	}
+	if strings.Index(val, "%") == -1 {
+		return val
+	}
+
+	for i := 0; i < _DEPTH_VALUES; i++ {
+		vr := varPattern.FindString(val)
+		if len(vr) == 0 {
+			break
+		}
+
+		// Take off leading '%(' and trailing ')s'.
+		noption := strings.TrimLeft(vr, "%(")
+		noption = strings.TrimRight(noption, ")s")
+
+		// Search in the same section.
+		nk, err := k.s.GetKey(noption)
+		if err != nil {
+			// Search again in default section.
+			nk, _ = k.s.f.Section("").GetKey(noption)
+		}
+
+		// Substitute by new value and take off leading '%(' and trailing ')s'.
+		val = strings.Replace(val, vr, nk.value, -1)
+	}
+	return val
+}
+
+// Validate accepts a validate function which can
+// return modifed result as key value.
+func (k *Key) Validate(fn func(string) string) string {
+	return fn(k.String())
+}
+
+// parseBool returns the boolean value represented by the string.
+//
+// It accepts 1, t, T, TRUE, true, True, YES, yes, Yes, y, ON, on, On,
+// 0, f, F, FALSE, false, False, NO, no, No, n, OFF, off, Off.
+// Any other value returns an error.
+func parseBool(str string) (value bool, err error) {
+	switch str {
+	case "1", "t", "T", "true", "TRUE", "True", "YES", "yes", "Yes", "y", "ON", "on", "On":
+		return true, nil
+	case "0", "f", "F", "false", "FALSE", "False", "NO", "no", "No", "n", "OFF", "off", "Off":
+		return false, nil
+	}
+	return false, fmt.Errorf("parsing \"%s\": invalid syntax", str)
+}
+
+// Bool returns bool type value.
+func (k *Key) Bool() (bool, error) {
+	return parseBool(k.String())
+}
+
+// Float64 returns float64 type value.
+func (k *Key) Float64() (float64, error) {
+	return strconv.ParseFloat(k.String(), 64)
+}
+
+// Int returns int type value.
+func (k *Key) Int() (int, error) {
+	return strconv.Atoi(k.String())
+}
+
+// Int64 returns int64 type value.
+func (k *Key) Int64() (int64, error) {
+	return strconv.ParseInt(k.String(), 10, 64)
+}
+
+// Uint returns uint type valued.
+func (k *Key) Uint() (uint, error) {
+	u, e := strconv.ParseUint(k.String(), 10, 64)
+	return uint(u), e
+}
+
+// Uint64 returns uint64 type value.
+func (k *Key) Uint64() (uint64, error) {
+	return strconv.ParseUint(k.String(), 10, 64)
+}
+
+// Duration returns time.Duration type value.
+func (k *Key) Duration() (time.Duration, error) {
+	return time.ParseDuration(k.String())
+}
+
+// TimeFormat parses with given format and returns time.Time type value.
+func (k *Key) TimeFormat(format string) (time.Time, error) {
+	return time.Parse(format, k.String())
+}
+
+// Time parses with RFC3339 format and returns time.Time type value.
+func (k *Key) Time() (time.Time, error) {
+	return k.TimeFormat(time.RFC3339)
+}
+
+// MustString returns default value if key value is empty.
+func (k *Key) MustString(defaultVal string) string {
+	val := k.String()
+	if len(val) == 0 {
+		k.value = defaultVal
+		return defaultVal
+	}
+	return val
+}
+
+// MustBool always returns value without error,
+// it returns false if error occurs.
+func (k *Key) MustBool(defaultVal ...bool) bool {
+	val, err := k.Bool()
+	if len(defaultVal) > 0 && err != nil {
+		k.value = strconv.FormatBool(defaultVal[0])
+		return defaultVal[0]
+	}
+	return val
+}
+
+// MustFloat64 always returns value without error,
+// it returns 0.0 if error occurs.
+func (k *Key) MustFloat64(defaultVal ...float64) float64 {
+	val, err := k.Float64()
+	if len(defaultVal) > 0 && err != nil {
+		k.value = strconv.FormatFloat(defaultVal[0], 'f', -1, 64)
+		return defaultVal[0]
+	}
+	return val
+}
+
+// MustInt always returns value without error,
+// it returns 0 if error occurs.
+func (k *Key) MustInt(defaultVal ...int) int {
+	val, err := k.Int()
+	if len(defaultVal) > 0 && err != nil {
+		k.value = strconv.FormatInt(int64(defaultVal[0]), 10)
+		return defaultVal[0]
+	}
+	return val
+}
+
+// MustInt64 always returns value without error,
+// it returns 0 if error occurs.
+func (k *Key) MustInt64(defaultVal ...int64) int64 {
+	val, err := k.Int64()
+	if len(defaultVal) > 0 && err != nil {
+		k.value = strconv.FormatInt(defaultVal[0], 10)
+		return defaultVal[0]
+	}
+	return val
+}
+
+// MustUint always returns value without error,
+// it returns 0 if error occurs.
+func (k *Key) MustUint(defaultVal ...uint) uint {
+	val, err := k.Uint()
+	if len(defaultVal) > 0 && err != nil {
+		k.value = strconv.FormatUint(uint64(defaultVal[0]), 10)
+		return defaultVal[0]
+	}
+	return val
+}
+
+// MustUint64 always returns value without error,
+// it returns 0 if error occurs.
+func (k *Key) MustUint64(defaultVal ...uint64) uint64 {
+	val, err := k.Uint64()
+	if len(defaultVal) > 0 && err != nil {
+		k.value = strconv.FormatUint(defaultVal[0], 10)
+		return defaultVal[0]
+	}
+	return val
+}
+
+// MustDuration always returns value without error,
+// it returns zero value if error occurs.
+func (k *Key) MustDuration(defaultVal ...time.Duration) time.Duration {
+	val, err := k.Duration()
+	if len(defaultVal) > 0 && err != nil {
+		k.value = defaultVal[0].String()
+		return defaultVal[0]
+	}
+	return val
+}
+
+// MustTimeFormat always parses with given format and returns value without error,
+// it returns zero value if error occurs.
+func (k *Key) MustTimeFormat(format string, defaultVal ...time.Time) time.Time {
+	val, err := k.TimeFormat(format)
+	if len(defaultVal) > 0 && err != nil {
+		k.value = defaultVal[0].Format(format)
+		return defaultVal[0]
+	}
+	return val
+}
+
+// MustTime always parses with RFC3339 format and returns value without error,
+// it returns zero value if error occurs.
+func (k *Key) MustTime(defaultVal ...time.Time) time.Time {
+	return k.MustTimeFormat(time.RFC3339, defaultVal...)
+}
+
+// In always returns value without error,
+// it returns default value if error occurs or doesn't fit into candidates.
+func (k *Key) In(defaultVal string, candidates []string) string {
+	val := k.String()
+	for _, cand := range candidates {
+		if val == cand {
+			return val
+		}
+	}
+	return defaultVal
+}
+
+// InFloat64 always returns value without error,
+// it returns default value if error occurs or doesn't fit into candidates.
+func (k *Key) InFloat64(defaultVal float64, candidates []float64) float64 {
+	val := k.MustFloat64()
+	for _, cand := range candidates {
+		if val == cand {
+			return val
+		}
+	}
+	return defaultVal
+}
+
+// InInt always returns value without error,
+// it returns default value if error occurs or doesn't fit into candidates.
+func (k *Key) InInt(defaultVal int, candidates []int) int {
+	val := k.MustInt()
+	for _, cand := range candidates {
+		if val == cand {
+			return val
+		}
+	}
+	return defaultVal
+}
+
+// InInt64 always returns value without error,
+// it returns default value if error occurs or doesn't fit into candidates.
+func (k *Key) InInt64(defaultVal int64, candidates []int64) int64 {
+	val := k.MustInt64()
+	for _, cand := range candidates {
+		if val == cand {
+			return val
+		}
+	}
+	return defaultVal
+}
+
+// InUint always returns value without error,
+// it returns default value if error occurs or doesn't fit into candidates.
+func (k *Key) InUint(defaultVal uint, candidates []uint) uint {
+	val := k.MustUint()
+	for _, cand := range candidates {
+		if val == cand {
+			return val
+		}
+	}
+	return defaultVal
+}
+
+// InUint64 always returns value without error,
+// it returns default value if error occurs or doesn't fit into candidates.
+func (k *Key) InUint64(defaultVal uint64, candidates []uint64) uint64 {
+	val := k.MustUint64()
+	for _, cand := range candidates {
+		if val == cand {
+			return val
+		}
+	}
+	return defaultVal
+}
+
+// InTimeFormat always parses with given format and returns value without error,
+// it returns default value if error occurs or doesn't fit into candidates.
+func (k *Key) InTimeFormat(format string, defaultVal time.Time, candidates []time.Time) time.Time {
+	val := k.MustTimeFormat(format)
+	for _, cand := range candidates {
+		if val == cand {
+			return val
+		}
+	}
+	return defaultVal
+}
+
+// InTime always parses with RFC3339 format and returns value without error,
+// it returns default value if error occurs or doesn't fit into candidates.
+func (k *Key) InTime(defaultVal time.Time, candidates []time.Time) time.Time {
+	return k.InTimeFormat(time.RFC3339, defaultVal, candidates)
+}
+
+// RangeFloat64 checks if value is in given range inclusively,
+// and returns default value if it's not.
+func (k *Key) RangeFloat64(defaultVal, min, max float64) float64 {
+	val := k.MustFloat64()
+	if val < min || val > max {
+		return defaultVal
+	}
+	return val
+}
+
+// RangeInt checks if value is in given range inclusively,
+// and returns default value if it's not.
+func (k *Key) RangeInt(defaultVal, min, max int) int {
+	val := k.MustInt()
+	if val < min || val > max {
+		return defaultVal
+	}
+	return val
+}
+
+// RangeInt64 checks if value is in given range inclusively,
+// and returns default value if it's not.
+func (k *Key) RangeInt64(defaultVal, min, max int64) int64 {
+	val := k.MustInt64()
+	if val < min || val > max {
+		return defaultVal
+	}
+	return val
+}
+
+// RangeTimeFormat checks if value with given format is in given range inclusively,
+// and returns default value if it's not.
+func (k *Key) RangeTimeFormat(format string, defaultVal, min, max time.Time) time.Time {
+	val := k.MustTimeFormat(format)
+	if val.Unix() < min.Unix() || val.Unix() > max.Unix() {
+		return defaultVal
+	}
+	return val
+}
+
+// RangeTime checks if value with RFC3339 format is in given range inclusively,
+// and returns default value if it's not.
+func (k *Key) RangeTime(defaultVal, min, max time.Time) time.Time {
+	return k.RangeTimeFormat(time.RFC3339, defaultVal, min, max)
+}
+
+// Strings returns list of string divided by given delimiter.
+func (k *Key) Strings(delim string) []string {
+	str := k.String()
+	if len(str) == 0 {
+		return []string{}
+	}
+
+	vals := strings.Split(str, delim)
+	for i := range vals {
+		vals[i] = strings.TrimSpace(vals[i])
+	}
+	return vals
+}
+
+// Float64s returns list of float64 divided by given delimiter. Any invalid input will be treated as zero value.
+func (k *Key) Float64s(delim string) []float64 {
+	vals, _ := k.getFloat64s(delim, true, false)
+	return vals
+}
+
+// Ints returns list of int divided by given delimiter. Any invalid input will be treated as zero value.
+func (k *Key) Ints(delim string) []int {
+	vals, _ := k.getInts(delim, true, false)
+	return vals
+}
+
+// Int64s returns list of int64 divided by given delimiter. Any invalid input will be treated as zero value.
+func (k *Key) Int64s(delim string) []int64 {
+	vals, _ := k.getInt64s(delim, true, false)
+	return vals
+}
+
+// Uints returns list of uint divided by given delimiter. Any invalid input will be treated as zero value.
+func (k *Key) Uints(delim string) []uint {
+	vals, _ := k.getUints(delim, true, false)
+	return vals
+}
+
+// Uint64s returns list of uint64 divided by given delimiter. Any invalid input will be treated as zero value.
+func (k *Key) Uint64s(delim string) []uint64 {
+	vals, _ := k.getUint64s(delim, true, false)
+	return vals
+}
+
+// TimesFormat parses with given format and returns list of time.Time divided by given delimiter.
+// Any invalid input will be treated as zero value (0001-01-01 00:00:00 +0000 UTC).
+func (k *Key) TimesFormat(format, delim string) []time.Time {
+	vals, _ := k.getTimesFormat(format, delim, true, false)
+	return vals
+}
+
+// Times parses with RFC3339 format and returns list of time.Time divided by given delimiter.
+// Any invalid input will be treated as zero value (0001-01-01 00:00:00 +0000 UTC).
+func (k *Key) Times(delim string) []time.Time {
+	return k.TimesFormat(time.RFC3339, delim)
+}
+
+// ValidFloat64s returns list of float64 divided by given delimiter. If some value is not float, then
+// it will not be included to result list.
+func (k *Key) ValidFloat64s(delim string) []float64 {
+	vals, _ := k.getFloat64s(delim, false, false)
+	return vals
+}
+
+// ValidInts returns list of int divided by given delimiter. If some value is not integer, then it will
+// not be included to result list.
+func (k *Key) ValidInts(delim string) []int {
+	vals, _ := k.getInts(delim, false, false)
+	return vals
+}
+
+// ValidInt64s returns list of int64 divided by given delimiter. If some value is not 64-bit integer,
+// then it will not be included to result list.
+func (k *Key) ValidInt64s(delim string) []int64 {
+	vals, _ := k.getInt64s(delim, false, false)
+	return vals
+}
+
+// ValidUints returns list of uint divided by given delimiter. If some value is not unsigned integer,
+// then it will not be included to result list.
+func (k *Key) ValidUints(delim string) []uint {
+	vals, _ := k.getUints(delim, false, false)
+	return vals
+}
+
+// ValidUint64s returns list of uint64 divided by given delimiter. If some value is not 64-bit unsigned
+// integer, then it will not be included to result list.
+func (k *Key) ValidUint64s(delim string) []uint64 {
+	vals, _ := k.getUint64s(delim, false, false)
+	return vals
+}
+
+// ValidTimesFormat parses with given format and returns list of time.Time divided by given delimiter.
+func (k *Key) ValidTimesFormat(format, delim string) []time.Time {
+	vals, _ := k.getTimesFormat(format, delim, false, false)
+	return vals
+}
+
+// ValidTimes parses with RFC3339 format and returns list of time.Time divided by given delimiter.
+func (k *Key) ValidTimes(delim string) []time.Time {
+	return k.ValidTimesFormat(time.RFC3339, delim)
+}
+
+// StrictFloat64s returns list of float64 divided by given delimiter or error on first invalid input.
+func (k *Key) StrictFloat64s(delim string) ([]float64, error) {
+	return k.getFloat64s(delim, false, true)
+}
+
+// StrictInts returns list of int divided by given delimiter or error on first invalid input.
+func (k *Key) StrictInts(delim string) ([]int, error) {
+	return k.getInts(delim, false, true)
+}
+
+// StrictInt64s returns list of int64 divided by given delimiter or error on first invalid input.
+func (k *Key) StrictInt64s(delim string) ([]int64, error) {
+	return k.getInt64s(delim, false, true)
+}
+
+// StrictUints returns list of uint divided by given delimiter or error on first invalid input.
+func (k *Key) StrictUints(delim string) ([]uint, error) {
+	return k.getUints(delim, false, true)
+}
+
+// StrictUint64s returns list of uint64 divided by given delimiter or error on first invalid input.
+func (k *Key) StrictUint64s(delim string) ([]uint64, error) {
+	return k.getUint64s(delim, false, true)
+}
+
+// StrictTimesFormat parses with given format and returns list of time.Time divided by given delimiter
+// or error on first invalid input.
+func (k *Key) StrictTimesFormat(format, delim string) ([]time.Time, error) {
+	return k.getTimesFormat(format, delim, false, true)
+}
+
+// StrictTimes parses with RFC3339 format and returns list of time.Time divided by given delimiter
+// or error on first invalid input.
+func (k *Key) StrictTimes(delim string) ([]time.Time, error) {
+	return k.StrictTimesFormat(time.RFC3339, delim)
+}
+
+// getFloat64s returns list of float64 divided by given delimiter.
+func (k *Key) getFloat64s(delim string, addInvalid, returnOnInvalid bool) ([]float64, error) {
+	strs := k.Strings(delim)
+	vals := make([]float64, 0, len(strs))
+	for _, str := range strs {
+		val, err := strconv.ParseFloat(str, 64)
+		if err != nil && returnOnInvalid {
+			return nil, err
+		}
+		if err == nil || addInvalid {
+			vals = append(vals, val)
+		}
+	}
+	return vals, nil
+}
+
+// getInts returns list of int divided by given delimiter.
+func (k *Key) getInts(delim string, addInvalid, returnOnInvalid bool) ([]int, error) {
+	strs := k.Strings(delim)
+	vals := make([]int, 0, len(strs))
+	for _, str := range strs {
+		val, err := strconv.Atoi(str)
+		if err != nil && returnOnInvalid {
+			return nil, err
+		}
+		if err == nil || addInvalid {
+			vals = append(vals, val)
+		}
+	}
+	return vals, nil
+}
+
+// getInt64s returns list of int64 divided by given delimiter.
+func (k *Key) getInt64s(delim string, addInvalid, returnOnInvalid bool) ([]int64, error) {
+	strs := k.Strings(delim)
+	vals := make([]int64, 0, len(strs))
+	for _, str := range strs {
+		val, err := strconv.ParseInt(str, 10, 64)
+		if err != nil && returnOnInvalid {
+			return nil, err
+		}
+		if err == nil || addInvalid {
+			vals = append(vals, val)
+		}
+	}
+	return vals, nil
+}
+
+// getUints returns list of uint divided by given delimiter.
+func (k *Key) getUints(delim string, addInvalid, returnOnInvalid bool) ([]uint, error) {
+	strs := k.Strings(delim)
+	vals := make([]uint, 0, len(strs))
+	for _, str := range strs {
+		val, err := strconv.ParseUint(str, 10, 0)
+		if err != nil && returnOnInvalid {
+			return nil, err
+		}
+		if err == nil || addInvalid {
+			vals = append(vals, uint(val))
+		}
+	}
+	return vals, nil
+}
+
+// getUint64s returns list of uint64 divided by given delimiter.
+func (k *Key) getUint64s(delim string, addInvalid, returnOnInvalid bool) ([]uint64, error) {
+	strs := k.Strings(delim)
+	vals := make([]uint64, 0, len(strs))
+	for _, str := range strs {
+		val, err := strconv.ParseUint(str, 10, 64)
+		if err != nil && returnOnInvalid {
+			return nil, err
+		}
+		if err == nil || addInvalid {
+			vals = append(vals, val)
+		}
+	}
+	return vals, nil
+}
+
+// getTimesFormat parses with given format and returns list of time.Time divided by given delimiter.
+func (k *Key) getTimesFormat(format, delim string, addInvalid, returnOnInvalid bool) ([]time.Time, error) {
+	strs := k.Strings(delim)
+	vals := make([]time.Time, 0, len(strs))
+	for _, str := range strs {
+		val, err := time.Parse(format, str)
+		if err != nil && returnOnInvalid {
+			return nil, err
+		}
+		if err == nil || addInvalid {
+			vals = append(vals, val)
+		}
+	}
+	return vals, nil
+}
+
+// SetValue changes key value.
+func (k *Key) SetValue(v string) {
+	if k.s.f.BlockMode {
+		k.s.f.lock.Lock()
+		defer k.s.f.lock.Unlock()
+	}
+
+	k.value = v
+	k.s.keysHash[k.name] = v
+}
diff --git a/vendor/github.com/go-ini/ini/parser.go b/vendor/github.com/go-ini/ini/parser.go
new file mode 100644
index 000000000..dc6df87a6
--- /dev/null
+++ b/vendor/github.com/go-ini/ini/parser.go
@@ -0,0 +1,325 @@
+// Copyright 2015 Unknwon
+//
+// 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 ini
+
+import (
+	"bufio"
+	"bytes"
+	"fmt"
+	"io"
+	"strconv"
+	"strings"
+	"unicode"
+)
+
+type tokenType int
+
+const (
+	_TOKEN_INVALID tokenType = iota
+	_TOKEN_COMMENT
+	_TOKEN_SECTION
+	_TOKEN_KEY
+)
+
+type parser struct {
+	buf     *bufio.Reader
+	isEOF   bool
+	count   int
+	comment *bytes.Buffer
+}
+
+func newParser(r io.Reader) *parser {
+	return &parser{
+		buf:     bufio.NewReader(r),
+		count:   1,
+		comment: &bytes.Buffer{},
+	}
+}
+
+// BOM handles header of BOM-UTF8 format.
+// http://en.wikipedia.org/wiki/Byte_order_mark#Representations_of_byte_order_marks_by_encoding
+func (p *parser) BOM() error {
+	mask, err := p.buf.Peek(3)
+	if err != nil && err != io.EOF {
+		return err
+	} else if len(mask) < 3 {
+		return nil
+	} else if mask[0] == 239 && mask[1] == 187 && mask[2] == 191 {
+		p.buf.Read(mask)
+	}
+	return nil
+}
+
+func (p *parser) readUntil(delim byte) ([]byte, error) {
+	data, err := p.buf.ReadBytes(delim)
+	if err != nil {
+		if err == io.EOF {
+			p.isEOF = true
+		} else {
+			return nil, err
+		}
+	}
+	return data, nil
+}
+
+func cleanComment(in []byte) ([]byte, bool) {
+	i := bytes.IndexAny(in, "#;")
+	if i == -1 {
+		return nil, false
+	}
+	return in[i:], true
+}
+
+func readKeyName(in []byte) (string, int, error) {
+	line := string(in)
+
+	// Check if key name surrounded by quotes.
+	var keyQuote string
+	if line[0] == '"' {
+		if len(line) > 6 && string(line[0:3]) == `"""` {
+			keyQuote = `"""`
+		} else {
+			keyQuote = `"`
+		}
+	} else if line[0] == '`' {
+		keyQuote = "`"
+	}
+
+	// Get out key name
+	endIdx := -1
+	if len(keyQuote) > 0 {
+		startIdx := len(keyQuote)
+		// FIXME: fail case -> """"""name"""=value
+		pos := strings.Index(line[startIdx:], keyQuote)
+		if pos == -1 {
+			return "", -1, fmt.Errorf("missing closing key quote: %s", line)
+		}
+		pos += startIdx
+
+		// Find key-value delimiter
+		i := strings.IndexAny(line[pos+startIdx:], "=:")
+		if i < 0 {
+			return "", -1, ErrDelimiterNotFound{line}
+		}
+		endIdx = pos + i
+		return strings.TrimSpace(line[startIdx:pos]), endIdx + startIdx + 1, nil
+	}
+
+	endIdx = strings.IndexAny(line, "=:")
+	if endIdx < 0 {
+		return "", -1, ErrDelimiterNotFound{line}
+	}
+	return strings.TrimSpace(line[0:endIdx]), endIdx + 1, nil
+}
+
+func (p *parser) readMultilines(line, val, valQuote string) (string, error) {
+	for {
+		data, err := p.readUntil('\n')
+		if err != nil {
+			return "", err
+		}
+		next := string(data)
+
+		pos := strings.LastIndex(next, valQuote)
+		if pos > -1 {
+			val += next[:pos]
+
+			comment, has := cleanComment([]byte(next[pos:]))
+			if has {
+				p.comment.Write(bytes.TrimSpace(comment))
+			}
+			break
+		}
+		val += next
+		if p.isEOF {
+			return "", fmt.Errorf("missing closing key quote from '%s' to '%s'", line, next)
+		}
+	}
+	return val, nil
+}
+
+func (p *parser) readContinuationLines(val string) (string, error) {
+	for {
+		data, err := p.readUntil('\n')
+		if err != nil {
+			return "", err
+		}
+		next := strings.TrimSpace(string(data))
+
+		if len(next) == 0 {
+			break
+		}
+		val += next
+		if val[len(val)-1] != '\\' {
+			break
+		}
+		val = val[:len(val)-1]
+	}
+	return val, nil
+}
+
+// hasSurroundedQuote check if and only if the first and last characters
+// are quotes \" or \'.
+// It returns false if any other parts also contain same kind of quotes.
+func hasSurroundedQuote(in string, quote byte) bool {
+	return len(in) > 2 && in[0] == quote && in[len(in)-1] == quote &&
+		strings.IndexByte(in[1:], quote) == len(in)-2
+}
+
+func (p *parser) readValue(in []byte, ignoreContinuation bool) (string, error) {
+	line := strings.TrimLeftFunc(string(in), unicode.IsSpace)
+	if len(line) == 0 {
+		return "", nil
+	}
+
+	var valQuote string
+	if len(line) > 3 && string(line[0:3]) == `"""` {
+		valQuote = `"""`
+	} else if line[0] == '`' {
+		valQuote = "`"
+	}
+
+	if len(valQuote) > 0 {
+		startIdx := len(valQuote)
+		pos := strings.LastIndex(line[startIdx:], valQuote)
+		// Check for multi-line value
+		if pos == -1 {
+			return p.readMultilines(line, line[startIdx:], valQuote)
+		}
+
+		return line[startIdx : pos+startIdx], nil
+	}
+
+	// Won't be able to reach here if value only contains whitespace.
+	line = strings.TrimSpace(line)
+
+	// Check continuation lines when desired.
+	if !ignoreContinuation && line[len(line)-1] == '\\' {
+		return p.readContinuationLines(line[:len(line)-1])
+	}
+
+	i := strings.IndexAny(line, "#;")
+	if i > -1 {
+		p.comment.WriteString(line[i:])
+		line = strings.TrimSpace(line[:i])
+	}
+
+	// Trim single quotes
+	if hasSurroundedQuote(line, '\'') ||
+		hasSurroundedQuote(line, '"') {
+		line = line[1 : len(line)-1]
+	}
+	return line, nil
+}
+
+// parse parses data through an io.Reader.
+func (f *File) parse(reader io.Reader) (err error) {
+	p := newParser(reader)
+	if err = p.BOM(); err != nil {
+		return fmt.Errorf("BOM: %v", err)
+	}
+
+	// Ignore error because default section name is never empty string.
+	section, _ := f.NewSection(DEFAULT_SECTION)
+
+	var line []byte
+	for !p.isEOF {
+		line, err = p.readUntil('\n')
+		if err != nil {
+			return err
+		}
+
+		line = bytes.TrimLeftFunc(line, unicode.IsSpace)
+		if len(line) == 0 {
+			continue
+		}
+
+		// Comments
+		if line[0] == '#' || line[0] == ';' {
+			// Note: we do not care ending line break,
+			// it is needed for adding second line,
+			// so just clean it once at the end when set to value.
+			p.comment.Write(line)
+			continue
+		}
+
+		// Section
+		if line[0] == '[' {
+			// Read to the next ']' (TODO: support quoted strings)
+			// TODO(unknwon): use LastIndexByte when stop supporting Go1.4
+			closeIdx := bytes.LastIndex(line, []byte("]"))
+			if closeIdx == -1 {
+				return fmt.Errorf("unclosed section: %s", line)
+			}
+
+			name := string(line[1:closeIdx])
+			section, err = f.NewSection(name)
+			if err != nil {
+				return err
+			}
+
+			comment, has := cleanComment(line[closeIdx+1:])
+			if has {
+				p.comment.Write(comment)
+			}
+
+			section.Comment = strings.TrimSpace(p.comment.String())
+
+			// Reset aotu-counter and comments
+			p.comment.Reset()
+			p.count = 1
+			continue
+		}
+
+		kname, offset, err := readKeyName(line)
+		if err != nil {
+			// Treat as boolean key when desired, and whole line is key name.
+			if IsErrDelimiterNotFound(err) && f.options.AllowBooleanKeys {
+				key, err := section.NewKey(string(line), "true")
+				if err != nil {
+					return err
+				}
+				key.isBooleanType = true
+				key.Comment = strings.TrimSpace(p.comment.String())
+				p.comment.Reset()
+				continue
+			}
+			return err
+		}
+
+		// Auto increment.
+		isAutoIncr := false
+		if kname == "-" {
+			isAutoIncr = true
+			kname = "#" + strconv.Itoa(p.count)
+			p.count++
+		}
+
+		key, err := section.NewKey(kname, "")
+		if err != nil {
+			return err
+		}
+		key.isAutoIncrement = isAutoIncr
+
+		value, err := p.readValue(line[offset:], f.options.IgnoreContinuation)
+		if err != nil {
+			return err
+		}
+		key.SetValue(value)
+		key.Comment = strings.TrimSpace(p.comment.String())
+		p.comment.Reset()
+	}
+	return nil
+}
diff --git a/vendor/github.com/go-ini/ini/section.go b/vendor/github.com/go-ini/ini/section.go
new file mode 100644
index 000000000..bbb73caf8
--- /dev/null
+++ b/vendor/github.com/go-ini/ini/section.go
@@ -0,0 +1,206 @@
+// Copyright 2014 Unknwon
+//
+// 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 ini
+
+import (
+	"errors"
+	"fmt"
+	"strings"
+)
+
+// Section represents a config section.
+type Section struct {
+	f        *File
+	Comment  string
+	name     string
+	keys     map[string]*Key
+	keyList  []string
+	keysHash map[string]string
+}
+
+func newSection(f *File, name string) *Section {
+	return &Section{f, "", name, make(map[string]*Key), make([]string, 0, 10), make(map[string]string)}
+}
+
+// Name returns name of Section.
+func (s *Section) Name() string {
+	return s.name
+}
+
+// NewKey creates a new key to given section.
+func (s *Section) NewKey(name, val string) (*Key, error) {
+	if len(name) == 0 {
+		return nil, errors.New("error creating new key: empty key name")
+	} else if s.f.options.Insensitive {
+		name = strings.ToLower(name)
+	}
+
+	if s.f.BlockMode {
+		s.f.lock.Lock()
+		defer s.f.lock.Unlock()
+	}
+
+	if inSlice(name, s.keyList) {
+		s.keys[name].value = val
+		return s.keys[name], nil
+	}
+
+	s.keyList = append(s.keyList, name)
+	s.keys[name] = &Key{
+		s:     s,
+		name:  name,
+		value: val,
+	}
+	s.keysHash[name] = val
+	return s.keys[name], nil
+}
+
+// GetKey returns key in section by given name.
+func (s *Section) GetKey(name string) (*Key, error) {
+	// FIXME: change to section level lock?
+	if s.f.BlockMode {
+		s.f.lock.RLock()
+	}
+	if s.f.options.Insensitive {
+		name = strings.ToLower(name)
+	}
+	key := s.keys[name]
+	if s.f.BlockMode {
+		s.f.lock.RUnlock()
+	}
+
+	if key == nil {
+		// Check if it is a child-section.
+		sname := s.name
+		for {
+			if i := strings.LastIndex(sname, "."); i > -1 {
+				sname = sname[:i]
+				sec, err := s.f.GetSection(sname)
+				if err != nil {
+					continue
+				}
+				return sec.GetKey(name)
+			} else {
+				break
+			}
+		}
+		return nil, fmt.Errorf("error when getting key of section '%s': key '%s' not exists", s.name, name)
+	}
+	return key, nil
+}
+
+// HasKey returns true if section contains a key with given name.
+func (s *Section) HasKey(name string) bool {
+	key, _ := s.GetKey(name)
+	return key != nil
+}
+
+// Haskey is a backwards-compatible name for HasKey.
+func (s *Section) Haskey(name string) bool {
+	return s.HasKey(name)
+}
+
+// HasValue returns true if section contains given raw value.
+func (s *Section) HasValue(value string) bool {
+	if s.f.BlockMode {
+		s.f.lock.RLock()
+		defer s.f.lock.RUnlock()
+	}
+
+	for _, k := range s.keys {
+		if value == k.value {
+			return true
+		}
+	}
+	return false
+}
+
+// Key assumes named Key exists in section and returns a zero-value when not.
+func (s *Section) Key(name string) *Key {
+	key, err := s.GetKey(name)
+	if err != nil {
+		// It's OK here because the only possible error is empty key name,
+		// but if it's empty, this piece of code won't be executed.
+		key, _ = s.NewKey(name, "")
+		return key
+	}
+	return key
+}
+
+// Keys returns list of keys of section.
+func (s *Section) Keys() []*Key {
+	keys := make([]*Key, len(s.keyList))
+	for i := range s.keyList {
+		keys[i] = s.Key(s.keyList[i])
+	}
+	return keys
+}
+
+// ParentKeys returns list of keys of parent section.
+func (s *Section) ParentKeys() []*Key {
+	var parentKeys []*Key
+	sname := s.name
+	for {
+		if i := strings.LastIndex(sname, "."); i > -1 {
+			sname = sname[:i]
+			sec, err := s.f.GetSection(sname)
+			if err != nil {
+				continue
+			}
+			parentKeys = append(parentKeys, sec.Keys()...)
+		} else {
+			break
+		}
+
+	}
+	return parentKeys
+}
+
+// KeyStrings returns list of key names of section.
+func (s *Section) KeyStrings() []string {
+	list := make([]string, len(s.keyList))
+	copy(list, s.keyList)
+	return list
+}
+
+// KeysHash returns keys hash consisting of names and values.
+func (s *Section) KeysHash() map[string]string {
+	if s.f.BlockMode {
+		s.f.lock.RLock()
+		defer s.f.lock.RUnlock()
+	}
+
+	hash := map[string]string{}
+	for key, value := range s.keysHash {
+		hash[key] = value
+	}
+	return hash
+}
+
+// DeleteKey deletes a key from section.
+func (s *Section) DeleteKey(name string) {
+	if s.f.BlockMode {
+		s.f.lock.Lock()
+		defer s.f.lock.Unlock()
+	}
+
+	for i, k := range s.keyList {
+		if k == name {
+			s.keyList = append(s.keyList[:i], s.keyList[i+1:]...)
+			delete(s.keys, name)
+			return
+		}
+	}
+}
diff --git a/vendor/github.com/aws/aws-sdk-go/vendor/github.com/go-ini/ini/struct.go b/vendor/github.com/go-ini/ini/struct.go
similarity index 62%
rename from vendor/github.com/aws/aws-sdk-go/vendor/github.com/go-ini/ini/struct.go
rename to vendor/github.com/go-ini/ini/struct.go
index c11843710..d00fb4b83 100644
--- a/vendor/github.com/aws/aws-sdk-go/vendor/github.com/go-ini/ini/struct.go
+++ b/vendor/github.com/go-ini/ini/struct.go
@@ -19,6 +19,7 @@ import (
 	"errors"
 	"fmt"
 	"reflect"
+	"strings"
 	"time"
 	"unicode"
 )
@@ -76,6 +77,59 @@ func parseDelim(actual string) string {
 
 var reflectTime = reflect.TypeOf(time.Now()).Kind()
 
+// setSliceWithProperType sets proper values to slice based on its type.
+func setSliceWithProperType(key *Key, field reflect.Value, delim string) error {
+	strs := key.Strings(delim)
+	numVals := len(strs)
+	if numVals == 0 {
+		return nil
+	}
+
+	var vals interface{}
+
+	sliceOf := field.Type().Elem().Kind()
+	switch sliceOf {
+	case reflect.String:
+		vals = strs
+	case reflect.Int:
+		vals = key.Ints(delim)
+	case reflect.Int64:
+		vals = key.Int64s(delim)
+	case reflect.Uint:
+		vals = key.Uints(delim)
+	case reflect.Uint64:
+		vals = key.Uint64s(delim)
+	case reflect.Float64:
+		vals = key.Float64s(delim)
+	case reflectTime:
+		vals = key.Times(delim)
+	default:
+		return fmt.Errorf("unsupported type '[]%s'", sliceOf)
+	}
+
+	slice := reflect.MakeSlice(field.Type(), numVals, numVals)
+	for i := 0; i < numVals; i++ {
+		switch sliceOf {
+		case reflect.String:
+			slice.Index(i).Set(reflect.ValueOf(vals.([]string)[i]))
+		case reflect.Int:
+			slice.Index(i).Set(reflect.ValueOf(vals.([]int)[i]))
+		case reflect.Int64:
+			slice.Index(i).Set(reflect.ValueOf(vals.([]int64)[i]))
+		case reflect.Uint:
+			slice.Index(i).Set(reflect.ValueOf(vals.([]uint)[i]))
+		case reflect.Uint64:
+			slice.Index(i).Set(reflect.ValueOf(vals.([]uint64)[i]))
+		case reflect.Float64:
+			slice.Index(i).Set(reflect.ValueOf(vals.([]float64)[i]))
+		case reflectTime:
+			slice.Index(i).Set(reflect.ValueOf(vals.([]time.Time)[i]))
+		}
+	}
+	field.Set(slice)
+	return nil
+}
+
 // setWithProperType sets proper value to field based on its type,
 // but it does not return error for failing parsing,
 // because we want to use default value that is already assigned to strcut.
@@ -94,20 +148,22 @@ func setWithProperType(t reflect.Type, key *Key, field reflect.Value, delim stri
 		field.SetBool(boolVal)
 	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
 		durationVal, err := key.Duration()
-		if err == nil {
+		// Skip zero value
+		if err == nil && int(durationVal) > 0 {
 			field.Set(reflect.ValueOf(durationVal))
 			return nil
 		}
 
 		intVal, err := key.Int64()
-		if err != nil {
+		if err != nil || intVal == 0 {
 			return nil
 		}
 		field.SetInt(intVal)
 	//	byte is an alias for uint8, so supporting uint8 breaks support for byte
 	case reflect.Uint, reflect.Uint16, reflect.Uint32, reflect.Uint64:
 		durationVal, err := key.Duration()
-		if err == nil {
+		// Skip zero value
+		if err == nil && int(durationVal) > 0 {
 			field.Set(reflect.ValueOf(durationVal))
 			return nil
 		}
@@ -131,29 +187,7 @@ func setWithProperType(t reflect.Type, key *Key, field reflect.Value, delim stri
 		}
 		field.Set(reflect.ValueOf(timeVal))
 	case reflect.Slice:
-		vals := key.Strings(delim)
-		numVals := len(vals)
-		if numVals == 0 {
-			return nil
-		}
-
-		sliceOf := field.Type().Elem().Kind()
-
-		var times []time.Time
-		if sliceOf == reflectTime {
-			times = key.Times(delim)
-		}
-
-		slice := reflect.MakeSlice(field.Type(), numVals, numVals)
-		for i := 0; i < numVals; i++ {
-			switch sliceOf {
-			case reflectTime:
-				slice.Index(i).Set(reflect.ValueOf(times[i]))
-			default:
-				slice.Index(i).Set(reflect.ValueOf(vals[i]))
-			}
-		}
-		field.Set(slice)
+		return setSliceWithProperType(key, field, delim)
 	default:
 		return fmt.Errorf("unsupported type '%s'", t)
 	}
@@ -175,7 +209,8 @@ func (s *Section) mapTo(val reflect.Value) error {
 			continue
 		}
 
-		fieldName := s.parseFieldName(tpField.Name, tag)
+		opts := strings.SplitN(tag, ",", 2) // strip off possible omitempty
+		fieldName := s.parseFieldName(tpField.Name, opts[0])
 		if len(fieldName) == 0 || !field.CanSet() {
 			continue
 		}
@@ -238,40 +273,81 @@ func MapTo(v, source interface{}, others ...interface{}) error {
 	return MapToWithMapper(v, nil, source, others...)
 }
 
-// reflectWithProperType does the opposite thing with setWithProperType.
+// reflectSliceWithProperType does the opposite thing as setSliceWithProperType.
+func reflectSliceWithProperType(key *Key, field reflect.Value, delim string) error {
+	slice := field.Slice(0, field.Len())
+	if field.Len() == 0 {
+		return nil
+	}
+
+	var buf bytes.Buffer
+	sliceOf := field.Type().Elem().Kind()
+	for i := 0; i < field.Len(); i++ {
+		switch sliceOf {
+		case reflect.String:
+			buf.WriteString(slice.Index(i).String())
+		case reflect.Int, reflect.Int64:
+			buf.WriteString(fmt.Sprint(slice.Index(i).Int()))
+		case reflect.Uint, reflect.Uint64:
+			buf.WriteString(fmt.Sprint(slice.Index(i).Uint()))
+		case reflect.Float64:
+			buf.WriteString(fmt.Sprint(slice.Index(i).Float()))
+		case reflectTime:
+			buf.WriteString(slice.Index(i).Interface().(time.Time).Format(time.RFC3339))
+		default:
+			return fmt.Errorf("unsupported type '[]%s'", sliceOf)
+		}
+		buf.WriteString(delim)
+	}
+	key.SetValue(buf.String()[:buf.Len()-1])
+	return nil
+}
+
+// reflectWithProperType does the opposite thing as setWithProperType.
 func reflectWithProperType(t reflect.Type, key *Key, field reflect.Value, delim string) error {
 	switch t.Kind() {
 	case reflect.String:
 		key.SetValue(field.String())
-	case reflect.Bool,
-		reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64,
-		reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64,
-		reflect.Float64,
-		reflectTime:
-		key.SetValue(fmt.Sprint(field))
+	case reflect.Bool:
+		key.SetValue(fmt.Sprint(field.Bool()))
+	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
+		key.SetValue(fmt.Sprint(field.Int()))
+	case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
+		key.SetValue(fmt.Sprint(field.Uint()))
+	case reflect.Float32, reflect.Float64:
+		key.SetValue(fmt.Sprint(field.Float()))
+	case reflectTime:
+		key.SetValue(fmt.Sprint(field.Interface().(time.Time).Format(time.RFC3339)))
 	case reflect.Slice:
-		vals := field.Slice(0, field.Len())
-		if field.Len() == 0 {
-			return nil
-		}
-
-		var buf bytes.Buffer
-		isTime := fmt.Sprint(field.Type()) == "[]time.Time"
-		for i := 0; i < field.Len(); i++ {
-			if isTime {
-				buf.WriteString(vals.Index(i).Interface().(time.Time).Format(time.RFC3339))
-			} else {
-				buf.WriteString(fmt.Sprint(vals.Index(i)))
-			}
-			buf.WriteString(delim)
-		}
-		key.SetValue(buf.String()[:buf.Len()-1])
+		return reflectSliceWithProperType(key, field, delim)
 	default:
 		return fmt.Errorf("unsupported type '%s'", t)
 	}
 	return nil
 }
 
+// CR: copied from encoding/json/encode.go with modifications of time.Time support.
+// TODO: add more test coverage.
+func isEmptyValue(v reflect.Value) bool {
+	switch v.Kind() {
+	case reflect.Array, reflect.Map, reflect.Slice, reflect.String:
+		return v.Len() == 0
+	case reflect.Bool:
+		return !v.Bool()
+	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
+		return v.Int() == 0
+	case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
+		return v.Uint() == 0
+	case reflect.Float32, reflect.Float64:
+		return v.Float() == 0
+	case reflectTime:
+		return v.Interface().(time.Time).IsZero()
+	case reflect.Interface, reflect.Ptr:
+		return v.IsNil()
+	}
+	return false
+}
+
 func (s *Section) reflectFrom(val reflect.Value) error {
 	if val.Kind() == reflect.Ptr {
 		val = val.Elem()
@@ -287,13 +363,18 @@ func (s *Section) reflectFrom(val reflect.Value) error {
 			continue
 		}
 
-		fieldName := s.parseFieldName(tpField.Name, tag)
+		opts := strings.SplitN(tag, ",", 2)
+		if len(opts) == 2 && opts[1] == "omitempty" && isEmptyValue(field) {
+			continue
+		}
+
+		fieldName := s.parseFieldName(tpField.Name, opts[0])
 		if len(fieldName) == 0 || !field.CanSet() {
 			continue
 		}
 
 		if (tpField.Type.Kind() == reflect.Ptr && tpField.Anonymous) ||
-			(tpField.Type.Kind() == reflect.Struct) {
+			(tpField.Type.Kind() == reflect.Struct && tpField.Type.Name() != "Time") {
 			// Note: The only error here is section doesn't exist.
 			sec, err := s.f.GetSection(fieldName)
 			if err != nil {
@@ -301,7 +382,7 @@ func (s *Section) reflectFrom(val reflect.Value) error {
 				sec, _ = s.f.NewSection(fieldName)
 			}
 			if err = sec.reflectFrom(field); err != nil {
-				return fmt.Errorf("error reflecting field(%s): %v", fieldName, err)
+				return fmt.Errorf("error reflecting field (%s): %v", fieldName, err)
 			}
 			continue
 		}
@@ -312,7 +393,7 @@ func (s *Section) reflectFrom(val reflect.Value) error {
 			key, _ = s.NewKey(fieldName, "")
 		}
 		if err = reflectWithProperType(tpField.Type, key, field, parseDelim(tpField.Tag.Get("delim"))); err != nil {
-			return fmt.Errorf("error reflecting field(%s): %v", fieldName, err)
+			return fmt.Errorf("error reflecting field (%s): %v", fieldName, err)
 		}
 
 	}
diff --git a/vendor/github.com/golang/protobuf/proto/Makefile b/vendor/github.com/golang/protobuf/proto/Makefile
deleted file mode 100644
index e2e0651a9..000000000
--- a/vendor/github.com/golang/protobuf/proto/Makefile
+++ /dev/null
@@ -1,43 +0,0 @@
-# Go support for Protocol Buffers - Google's data interchange format
-#
-# Copyright 2010 The Go Authors.  All rights reserved.
-# https://github.com/golang/protobuf
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are
-# met:
-#
-#     * Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-#     * Redistributions in binary form must reproduce the above
-# copyright notice, this list of conditions and the following disclaimer
-# in the documentation and/or other materials provided with the
-# distribution.
-#     * Neither the name of Google Inc. nor the names of its
-# contributors may be used to endorse or promote products derived from
-# this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-install:
-	go install
-
-test: install generate-test-pbs
-	go test
-
-
-generate-test-pbs:
-	make install
-	make -C testdata
-	protoc --go_out=Mtestdata/test.proto=github.com/golang/protobuf/proto/testdata,Mgoogle/protobuf/any.proto=github.com/golang/protobuf/ptypes/any:. proto3_proto/proto3.proto
-	make
diff --git a/vendor/github.com/gorilla/context/.travis.yml b/vendor/github.com/gorilla/context/.travis.yml
deleted file mode 100644
index d87d46576..000000000
--- a/vendor/github.com/gorilla/context/.travis.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-language: go
-
-go:
-  - 1.0
-  - 1.1
-  - 1.2
-  - tip
diff --git a/vendor/github.com/gorilla/context/README.md b/vendor/github.com/gorilla/context/README.md
deleted file mode 100644
index c60a31b05..000000000
--- a/vendor/github.com/gorilla/context/README.md
+++ /dev/null
@@ -1,7 +0,0 @@
-context
-=======
-[![Build Status](https://travis-ci.org/gorilla/context.png?branch=master)](https://travis-ci.org/gorilla/context)
-
-gorilla/context is a general purpose registry for global request variables.
-
-Read the full documentation here: http://www.gorillatoolkit.org/pkg/context
diff --git a/vendor/github.com/gorilla/handlers/.travis.yml b/vendor/github.com/gorilla/handlers/.travis.yml
deleted file mode 100644
index 354b7f8b2..000000000
--- a/vendor/github.com/gorilla/handlers/.travis.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-language: go
-
-go:
-  - 1.1
-  - 1.2
-  - 1.3
-  - 1.4
-  - tip
diff --git a/vendor/github.com/gorilla/handlers/README.md b/vendor/github.com/gorilla/handlers/README.md
deleted file mode 100644
index a340abe08..000000000
--- a/vendor/github.com/gorilla/handlers/README.md
+++ /dev/null
@@ -1,52 +0,0 @@
-gorilla/handlers
-================
-[![GoDoc](https://godoc.org/github.com/gorilla/handlers?status.svg)](https://godoc.org/github.com/gorilla/handlers) [![Build Status](https://travis-ci.org/gorilla/handlers.svg?branch=master)](https://travis-ci.org/gorilla/handlers)
-
-Package handlers is a collection of handlers (aka "HTTP middleware") for use
-with Go's `net/http` package (or any framework supporting `http.Handler`), including:
-
-* `LoggingHandler` for logging HTTP requests in the Apache [Common Log
-  Format](http://httpd.apache.org/docs/2.2/logs.html#common).
-* `CombinedLoggingHandler` for logging HTTP requests in the Apache [Combined Log
-  Format](http://httpd.apache.org/docs/2.2/logs.html#combined) commonly used by
-  both Apache and nginx.
-* `CompressHandler` for gzipping responses.
-* `ContentTypeHandler` for validating requests against a list of accepted
-  content types.
-* `MethodHandler` for matching HTTP methods against handlers in a
-  `map[string]http.Handler`
-* `ProxyHeaders` for populating `r.RemoteAddr` and `r.URL.Scheme` based on the
-  `X-Forwarded-For`, `X-Real-IP`, `X-Forwarded-Proto` and RFC7239 `Forwarded`
-  headers when running a Go server behind a HTTP reverse proxy.
-* `CanonicalHost` for re-directing to the preferred host when handling multiple 
-  domains (i.e. multiple CNAME aliases).
-
-Other handlers are documented [on the Gorilla
-website](http://www.gorillatoolkit.org/pkg/handlers).
-
-## Example
-
-A simple example using `handlers.LoggingHandler` and `handlers.CompressHandler`:
-
-```go
-import (
-    "net/http"
-    "github.com/gorilla/handlers"
-)
-
-func main() {
-    r := http.NewServeMux()
-
-    // Only log requests to our admin dashboard to stdout
-    r.Handle("/admin", handlers.LoggingHandler(os.Stdout, http.HandlerFunc(ShowAdminDashboard)))
-    r.HandleFunc("/", ShowIndex)
-
-    // Wrap our server with our gzip handler to gzip compress all responses.
-    http.ListenAndServe(":8000", handlers.CompressHandler(r))
-}
-```
-
-## License
-
-BSD licensed. See the included LICENSE file for details.
-
diff --git a/vendor/github.com/gorilla/mux/.travis.yml b/vendor/github.com/gorilla/mux/.travis.yml
deleted file mode 100644
index d87d46576..000000000
--- a/vendor/github.com/gorilla/mux/.travis.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-language: go
-
-go:
-  - 1.0
-  - 1.1
-  - 1.2
-  - tip
diff --git a/vendor/github.com/gorilla/mux/README.md b/vendor/github.com/gorilla/mux/README.md
deleted file mode 100644
index e60301b03..000000000
--- a/vendor/github.com/gorilla/mux/README.md
+++ /dev/null
@@ -1,7 +0,0 @@
-mux
-===
-[![Build Status](https://travis-ci.org/gorilla/mux.png?branch=master)](https://travis-ci.org/gorilla/mux)
-
-gorilla/mux is a powerful URL router and dispatcher.
-
-Read the full documentation here: http://www.gorillatoolkit.org/pkg/mux
diff --git a/vendor/github.com/inconshreveable/mousetrap/README.md b/vendor/github.com/inconshreveable/mousetrap/README.md
deleted file mode 100644
index 7a950d177..000000000
--- a/vendor/github.com/inconshreveable/mousetrap/README.md
+++ /dev/null
@@ -1,23 +0,0 @@
-# mousetrap
-
-mousetrap is a tiny library that answers a single question.
-
-On a Windows machine, was the process invoked by someone double clicking on
-the executable file while browsing in explorer?
-
-### Motivation
-
-Windows developers unfamiliar with command line tools will often "double-click"
-the executable for a tool. Because most CLI tools print the help and then exit
-when invoked without arguments, this is often very frustrating for those users.
-
-mousetrap provides a way to detect these invocations so that you can provide
-more helpful behavior and instructions on how to run the CLI tool. To see what
-this looks like, both from an organizational and a technical perspective, see
-https://inconshreveable.com/09-09-2014/sweat-the-small-stuff/
-
-### The interface
-
-The library exposes a single interface:
-
-    func StartedByExplorer() (bool)
diff --git a/vendor/github.com/aws/aws-sdk-go/vendor/github.com/jmespath/go-jmespath/LICENSE b/vendor/github.com/jmespath/go-jmespath/LICENSE
similarity index 100%
rename from vendor/github.com/aws/aws-sdk-go/vendor/github.com/jmespath/go-jmespath/LICENSE
rename to vendor/github.com/jmespath/go-jmespath/LICENSE
diff --git a/vendor/github.com/aws/aws-sdk-go/vendor/github.com/jmespath/go-jmespath/api.go b/vendor/github.com/jmespath/go-jmespath/api.go
similarity index 100%
rename from vendor/github.com/aws/aws-sdk-go/vendor/github.com/jmespath/go-jmespath/api.go
rename to vendor/github.com/jmespath/go-jmespath/api.go
diff --git a/vendor/github.com/aws/aws-sdk-go/vendor/github.com/jmespath/go-jmespath/astnodetype_string.go b/vendor/github.com/jmespath/go-jmespath/astnodetype_string.go
similarity index 100%
rename from vendor/github.com/aws/aws-sdk-go/vendor/github.com/jmespath/go-jmespath/astnodetype_string.go
rename to vendor/github.com/jmespath/go-jmespath/astnodetype_string.go
diff --git a/vendor/github.com/aws/aws-sdk-go/vendor/github.com/jmespath/go-jmespath/functions.go b/vendor/github.com/jmespath/go-jmespath/functions.go
similarity index 100%
rename from vendor/github.com/aws/aws-sdk-go/vendor/github.com/jmespath/go-jmespath/functions.go
rename to vendor/github.com/jmespath/go-jmespath/functions.go
diff --git a/vendor/github.com/aws/aws-sdk-go/vendor/github.com/jmespath/go-jmespath/interpreter.go b/vendor/github.com/jmespath/go-jmespath/interpreter.go
similarity index 100%
rename from vendor/github.com/aws/aws-sdk-go/vendor/github.com/jmespath/go-jmespath/interpreter.go
rename to vendor/github.com/jmespath/go-jmespath/interpreter.go
diff --git a/vendor/github.com/aws/aws-sdk-go/vendor/github.com/jmespath/go-jmespath/lexer.go b/vendor/github.com/jmespath/go-jmespath/lexer.go
similarity index 100%
rename from vendor/github.com/aws/aws-sdk-go/vendor/github.com/jmespath/go-jmespath/lexer.go
rename to vendor/github.com/jmespath/go-jmespath/lexer.go
diff --git a/vendor/github.com/aws/aws-sdk-go/vendor/github.com/jmespath/go-jmespath/parser.go b/vendor/github.com/jmespath/go-jmespath/parser.go
similarity index 100%
rename from vendor/github.com/aws/aws-sdk-go/vendor/github.com/jmespath/go-jmespath/parser.go
rename to vendor/github.com/jmespath/go-jmespath/parser.go
diff --git a/vendor/github.com/aws/aws-sdk-go/vendor/github.com/jmespath/go-jmespath/toktype_string.go b/vendor/github.com/jmespath/go-jmespath/toktype_string.go
similarity index 100%
rename from vendor/github.com/aws/aws-sdk-go/vendor/github.com/jmespath/go-jmespath/toktype_string.go
rename to vendor/github.com/jmespath/go-jmespath/toktype_string.go
diff --git a/vendor/github.com/aws/aws-sdk-go/vendor/github.com/jmespath/go-jmespath/util.go b/vendor/github.com/jmespath/go-jmespath/util.go
similarity index 100%
rename from vendor/github.com/aws/aws-sdk-go/vendor/github.com/jmespath/go-jmespath/util.go
rename to vendor/github.com/jmespath/go-jmespath/util.go
diff --git a/vendor/github.com/miekg/dns/LICENSE b/vendor/github.com/miekg/dns/LICENSE
new file mode 100644
index 000000000..5763fa7fe
--- /dev/null
+++ b/vendor/github.com/miekg/dns/LICENSE
@@ -0,0 +1,32 @@
+Extensions of the original work are copyright (c) 2011 Miek Gieben
+
+As this is fork of the official Go code the same license applies:
+
+Copyright (c) 2009 The Go Authors. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+   * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+   * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+   * Neither the name of Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
diff --git a/vendor/github.com/miekg/dns/client.go b/vendor/github.com/miekg/dns/client.go
new file mode 100644
index 000000000..0db7f7bf6
--- /dev/null
+++ b/vendor/github.com/miekg/dns/client.go
@@ -0,0 +1,455 @@
+package dns
+
+// A client implementation.
+
+import (
+	"bytes"
+	"crypto/tls"
+	"encoding/binary"
+	"io"
+	"net"
+	"time"
+)
+
+const dnsTimeout time.Duration = 2 * time.Second
+const tcpIdleTimeout time.Duration = 8 * time.Second
+
+// A Conn represents a connection to a DNS server.
+type Conn struct {
+	net.Conn                         // a net.Conn holding the connection
+	UDPSize        uint16            // minimum receive buffer for UDP messages
+	TsigSecret     map[string]string // secret(s) for Tsig map[<zonename>]<base64 secret>, zonename must be fully qualified
+	rtt            time.Duration
+	t              time.Time
+	tsigRequestMAC string
+}
+
+// A Client defines parameters for a DNS client.
+type Client struct {
+	Net            string            // if "tcp" or "tcp-tls" (DNS over TLS) a TCP query will be initiated, otherwise an UDP one (default is "" for UDP)
+	UDPSize        uint16            // minimum receive buffer for UDP messages
+	TLSConfig      *tls.Config       // TLS connection configuration
+	Timeout        time.Duration     // a cumulative timeout for dial, write and read, defaults to 0 (disabled) - overrides DialTimeout, ReadTimeout and WriteTimeout when non-zero
+	DialTimeout    time.Duration     // net.DialTimeout, defaults to 2 seconds - overridden by Timeout when that value is non-zero
+	ReadTimeout    time.Duration     // net.Conn.SetReadTimeout value for connections, defaults to 2 seconds - overridden by Timeout when that value is non-zero
+	WriteTimeout   time.Duration     // net.Conn.SetWriteTimeout value for connections, defaults to 2 seconds - overridden by Timeout when that value is non-zero
+	TsigSecret     map[string]string // secret(s) for Tsig map[<zonename>]<base64 secret>, zonename must be fully qualified
+	SingleInflight bool              // if true suppress multiple outstanding queries for the same Qname, Qtype and Qclass
+	group          singleflight
+}
+
+// Exchange performs a synchronous UDP query. It sends the message m to the address
+// contained in a and waits for a reply. Exchange does not retry a failed query, nor
+// will it fall back to TCP in case of truncation.
+// See client.Exchange for more information on setting larger buffer sizes.
+func Exchange(m *Msg, a string) (r *Msg, err error) {
+	var co *Conn
+	co, err = DialTimeout("udp", a, dnsTimeout)
+	if err != nil {
+		return nil, err
+	}
+
+	defer co.Close()
+
+	opt := m.IsEdns0()
+	// If EDNS0 is used use that for size.
+	if opt != nil && opt.UDPSize() >= MinMsgSize {
+		co.UDPSize = opt.UDPSize()
+	}
+
+	co.SetWriteDeadline(time.Now().Add(dnsTimeout))
+	if err = co.WriteMsg(m); err != nil {
+		return nil, err
+	}
+
+	co.SetReadDeadline(time.Now().Add(dnsTimeout))
+	r, err = co.ReadMsg()
+	if err == nil && r.Id != m.Id {
+		err = ErrId
+	}
+	return r, err
+}
+
+// ExchangeConn performs a synchronous query. It sends the message m via the connection
+// c and waits for a reply. The connection c is not closed by ExchangeConn.
+// This function is going away, but can easily be mimicked:
+//
+//	co := &dns.Conn{Conn: c} // c is your net.Conn
+//	co.WriteMsg(m)
+//	in, _  := co.ReadMsg()
+//	co.Close()
+//
+func ExchangeConn(c net.Conn, m *Msg) (r *Msg, err error) {
+	println("dns: this function is deprecated")
+	co := new(Conn)
+	co.Conn = c
+	if err = co.WriteMsg(m); err != nil {
+		return nil, err
+	}
+	r, err = co.ReadMsg()
+	if err == nil && r.Id != m.Id {
+		err = ErrId
+	}
+	return r, err
+}
+
+// Exchange performs a synchronous query. It sends the message m to the address
+// contained in a and waits for a reply. Basic use pattern with a *dns.Client:
+//
+//	c := new(dns.Client)
+//	in, rtt, err := c.Exchange(message, "127.0.0.1:53")
+//
+// Exchange does not retry a failed query, nor will it fall back to TCP in
+// case of truncation.
+// It is up to the caller to create a message that allows for larger responses to be
+// returned. Specifically this means adding an EDNS0 OPT RR that will advertise a larger
+// buffer, see SetEdns0. Messsages without an OPT RR will fallback to the historic limit
+// of 512 bytes.
+func (c *Client) Exchange(m *Msg, a string) (r *Msg, rtt time.Duration, err error) {
+	if !c.SingleInflight {
+		return c.exchange(m, a)
+	}
+	// This adds a bunch of garbage, TODO(miek).
+	t := "nop"
+	if t1, ok := TypeToString[m.Question[0].Qtype]; ok {
+		t = t1
+	}
+	cl := "nop"
+	if cl1, ok := ClassToString[m.Question[0].Qclass]; ok {
+		cl = cl1
+	}
+	r, rtt, err, shared := c.group.Do(m.Question[0].Name+t+cl, func() (*Msg, time.Duration, error) {
+		return c.exchange(m, a)
+	})
+	if err != nil {
+		return r, rtt, err
+	}
+	if shared {
+		return r.Copy(), rtt, nil
+	}
+	return r, rtt, nil
+}
+
+func (c *Client) dialTimeout() time.Duration {
+	if c.Timeout != 0 {
+		return c.Timeout
+	}
+	if c.DialTimeout != 0 {
+		return c.DialTimeout
+	}
+	return dnsTimeout
+}
+
+func (c *Client) readTimeout() time.Duration {
+	if c.ReadTimeout != 0 {
+		return c.ReadTimeout
+	}
+	return dnsTimeout
+}
+
+func (c *Client) writeTimeout() time.Duration {
+	if c.WriteTimeout != 0 {
+		return c.WriteTimeout
+	}
+	return dnsTimeout
+}
+
+func (c *Client) exchange(m *Msg, a string) (r *Msg, rtt time.Duration, err error) {
+	var co *Conn
+	network := "udp"
+	tls := false
+
+	switch c.Net {
+	case "tcp-tls":
+		network = "tcp"
+		tls = true
+	case "tcp4-tls":
+		network = "tcp4"
+		tls = true
+	case "tcp6-tls":
+		network = "tcp6"
+		tls = true
+	default:
+		if c.Net != "" {
+			network = c.Net
+		}
+	}
+
+	var deadline time.Time
+	if c.Timeout != 0 {
+		deadline = time.Now().Add(c.Timeout)
+	}
+
+	if tls {
+		co, err = DialTimeoutWithTLS(network, a, c.TLSConfig, c.dialTimeout())
+	} else {
+		co, err = DialTimeout(network, a, c.dialTimeout())
+	}
+
+	if err != nil {
+		return nil, 0, err
+	}
+	defer co.Close()
+
+	opt := m.IsEdns0()
+	// If EDNS0 is used use that for size.
+	if opt != nil && opt.UDPSize() >= MinMsgSize {
+		co.UDPSize = opt.UDPSize()
+	}
+	// Otherwise use the client's configured UDP size.
+	if opt == nil && c.UDPSize >= MinMsgSize {
+		co.UDPSize = c.UDPSize
+	}
+
+	co.TsigSecret = c.TsigSecret
+	co.SetWriteDeadline(deadlineOrTimeout(deadline, c.writeTimeout()))
+	if err = co.WriteMsg(m); err != nil {
+		return nil, 0, err
+	}
+
+	co.SetReadDeadline(deadlineOrTimeout(deadline, c.readTimeout()))
+	r, err = co.ReadMsg()
+	if err == nil && r.Id != m.Id {
+		err = ErrId
+	}
+	return r, co.rtt, err
+}
+
+// ReadMsg reads a message from the connection co.
+// If the received message contains a TSIG record the transaction
+// signature is verified.
+func (co *Conn) ReadMsg() (*Msg, error) {
+	p, err := co.ReadMsgHeader(nil)
+	if err != nil {
+		return nil, err
+	}
+
+	m := new(Msg)
+	if err := m.Unpack(p); err != nil {
+		// If ErrTruncated was returned, we still want to allow the user to use
+		// the message, but naively they can just check err if they don't want
+		// to use a truncated message
+		if err == ErrTruncated {
+			return m, err
+		}
+		return nil, err
+	}
+	if t := m.IsTsig(); t != nil {
+		if _, ok := co.TsigSecret[t.Hdr.Name]; !ok {
+			return m, ErrSecret
+		}
+		// Need to work on the original message p, as that was used to calculate the tsig.
+		err = TsigVerify(p, co.TsigSecret[t.Hdr.Name], co.tsigRequestMAC, false)
+	}
+	return m, err
+}
+
+// ReadMsgHeader reads a DNS message, parses and populates hdr (when hdr is not nil).
+// Returns message as a byte slice to be parsed with Msg.Unpack later on.
+// Note that error handling on the message body is not possible as only the header is parsed.
+func (co *Conn) ReadMsgHeader(hdr *Header) ([]byte, error) {
+	var (
+		p   []byte
+		n   int
+		err error
+	)
+
+	switch t := co.Conn.(type) {
+	case *net.TCPConn, *tls.Conn:
+		r := t.(io.Reader)
+
+		// First two bytes specify the length of the entire message.
+		l, err := tcpMsgLen(r)
+		if err != nil {
+			return nil, err
+		}
+		p = make([]byte, l)
+		n, err = tcpRead(r, p)
+		co.rtt = time.Since(co.t)
+	default:
+		if co.UDPSize > MinMsgSize {
+			p = make([]byte, co.UDPSize)
+		} else {
+			p = make([]byte, MinMsgSize)
+		}
+		n, err = co.Read(p)
+		co.rtt = time.Since(co.t)
+	}
+
+	if err != nil {
+		return nil, err
+	} else if n < headerSize {
+		return nil, ErrShortRead
+	}
+
+	p = p[:n]
+	if hdr != nil {
+		dh, _, err := unpackMsgHdr(p, 0)
+		if err != nil {
+			return nil, err
+		}
+		*hdr = dh
+	}
+	return p, err
+}
+
+// tcpMsgLen is a helper func to read first two bytes of stream as uint16 packet length.
+func tcpMsgLen(t io.Reader) (int, error) {
+	p := []byte{0, 0}
+	n, err := t.Read(p)
+	if err != nil {
+		return 0, err
+	}
+	if n != 2 {
+		return 0, ErrShortRead
+	}
+	l := binary.BigEndian.Uint16(p)
+	if l == 0 {
+		return 0, ErrShortRead
+	}
+	return int(l), nil
+}
+
+// tcpRead calls TCPConn.Read enough times to fill allocated buffer.
+func tcpRead(t io.Reader, p []byte) (int, error) {
+	n, err := t.Read(p)
+	if err != nil {
+		return n, err
+	}
+	for n < len(p) {
+		j, err := t.Read(p[n:])
+		if err != nil {
+			return n, err
+		}
+		n += j
+	}
+	return n, err
+}
+
+// Read implements the net.Conn read method.
+func (co *Conn) Read(p []byte) (n int, err error) {
+	if co.Conn == nil {
+		return 0, ErrConnEmpty
+	}
+	if len(p) < 2 {
+		return 0, io.ErrShortBuffer
+	}
+	switch t := co.Conn.(type) {
+	case *net.TCPConn, *tls.Conn:
+		r := t.(io.Reader)
+
+		l, err := tcpMsgLen(r)
+		if err != nil {
+			return 0, err
+		}
+		if l > len(p) {
+			return int(l), io.ErrShortBuffer
+		}
+		return tcpRead(r, p[:l])
+	}
+	// UDP connection
+	n, err = co.Conn.Read(p)
+	if err != nil {
+		return n, err
+	}
+	return n, err
+}
+
+// WriteMsg sends a message through the connection co.
+// If the message m contains a TSIG record the transaction
+// signature is calculated.
+func (co *Conn) WriteMsg(m *Msg) (err error) {
+	var out []byte
+	if t := m.IsTsig(); t != nil {
+		mac := ""
+		if _, ok := co.TsigSecret[t.Hdr.Name]; !ok {
+			return ErrSecret
+		}
+		out, mac, err = TsigGenerate(m, co.TsigSecret[t.Hdr.Name], co.tsigRequestMAC, false)
+		// Set for the next read, although only used in zone transfers
+		co.tsigRequestMAC = mac
+	} else {
+		out, err = m.Pack()
+	}
+	if err != nil {
+		return err
+	}
+	co.t = time.Now()
+	if _, err = co.Write(out); err != nil {
+		return err
+	}
+	return nil
+}
+
+// Write implements the net.Conn Write method.
+func (co *Conn) Write(p []byte) (n int, err error) {
+	switch t := co.Conn.(type) {
+	case *net.TCPConn, *tls.Conn:
+		w := t.(io.Writer)
+
+		lp := len(p)
+		if lp < 2 {
+			return 0, io.ErrShortBuffer
+		}
+		if lp > MaxMsgSize {
+			return 0, &Error{err: "message too large"}
+		}
+		l := make([]byte, 2, lp+2)
+		binary.BigEndian.PutUint16(l, uint16(lp))
+		p = append(l, p...)
+		n, err := io.Copy(w, bytes.NewReader(p))
+		return int(n), err
+	}
+	n, err = co.Conn.(*net.UDPConn).Write(p)
+	return n, err
+}
+
+// Dial connects to the address on the named network.
+func Dial(network, address string) (conn *Conn, err error) {
+	conn = new(Conn)
+	conn.Conn, err = net.Dial(network, address)
+	if err != nil {
+		return nil, err
+	}
+	return conn, nil
+}
+
+// DialTimeout acts like Dial but takes a timeout.
+func DialTimeout(network, address string, timeout time.Duration) (conn *Conn, err error) {
+	conn = new(Conn)
+	conn.Conn, err = net.DialTimeout(network, address, timeout)
+	if err != nil {
+		return nil, err
+	}
+	return conn, nil
+}
+
+// DialWithTLS connects to the address on the named network with TLS.
+func DialWithTLS(network, address string, tlsConfig *tls.Config) (conn *Conn, err error) {
+	conn = new(Conn)
+	conn.Conn, err = tls.Dial(network, address, tlsConfig)
+	if err != nil {
+		return nil, err
+	}
+	return conn, nil
+}
+
+// DialTimeoutWithTLS acts like DialWithTLS but takes a timeout.
+func DialTimeoutWithTLS(network, address string, tlsConfig *tls.Config, timeout time.Duration) (conn *Conn, err error) {
+	var dialer net.Dialer
+	dialer.Timeout = timeout
+
+	conn = new(Conn)
+	conn.Conn, err = tls.DialWithDialer(&dialer, network, address, tlsConfig)
+	if err != nil {
+		return nil, err
+	}
+	return conn, nil
+}
+
+func deadlineOrTimeout(deadline time.Time, timeout time.Duration) time.Time {
+	if deadline.IsZero() {
+		return time.Now().Add(timeout)
+	}
+	return deadline
+}
diff --git a/vendor/github.com/miekg/dns/clientconfig.go b/vendor/github.com/miekg/dns/clientconfig.go
new file mode 100644
index 000000000..cfa9ad0b2
--- /dev/null
+++ b/vendor/github.com/miekg/dns/clientconfig.go
@@ -0,0 +1,99 @@
+package dns
+
+import (
+	"bufio"
+	"os"
+	"strconv"
+	"strings"
+)
+
+// ClientConfig wraps the contents of the /etc/resolv.conf file.
+type ClientConfig struct {
+	Servers  []string // servers to use
+	Search   []string // suffixes to append to local name
+	Port     string   // what port to use
+	Ndots    int      // number of dots in name to trigger absolute lookup
+	Timeout  int      // seconds before giving up on packet
+	Attempts int      // lost packets before giving up on server, not used in the package dns
+}
+
+// ClientConfigFromFile parses a resolv.conf(5) like file and returns
+// a *ClientConfig.
+func ClientConfigFromFile(resolvconf string) (*ClientConfig, error) {
+	file, err := os.Open(resolvconf)
+	if err != nil {
+		return nil, err
+	}
+	defer file.Close()
+	c := new(ClientConfig)
+	scanner := bufio.NewScanner(file)
+	c.Servers = make([]string, 0)
+	c.Search = make([]string, 0)
+	c.Port = "53"
+	c.Ndots = 1
+	c.Timeout = 5
+	c.Attempts = 2
+
+	for scanner.Scan() {
+		if err := scanner.Err(); err != nil {
+			return nil, err
+		}
+		line := scanner.Text()
+		f := strings.Fields(line)
+		if len(f) < 1 {
+			continue
+		}
+		switch f[0] {
+		case "nameserver": // add one name server
+			if len(f) > 1 {
+				// One more check: make sure server name is
+				// just an IP address.  Otherwise we need DNS
+				// to look it up.
+				name := f[1]
+				c.Servers = append(c.Servers, name)
+			}
+
+		case "domain": // set search path to just this domain
+			if len(f) > 1 {
+				c.Search = make([]string, 1)
+				c.Search[0] = f[1]
+			} else {
+				c.Search = make([]string, 0)
+			}
+
+		case "search": // set search path to given servers
+			c.Search = make([]string, len(f)-1)
+			for i := 0; i < len(c.Search); i++ {
+				c.Search[i] = f[i+1]
+			}
+
+		case "options": // magic options
+			for i := 1; i < len(f); i++ {
+				s := f[i]
+				switch {
+				case len(s) >= 6 && s[:6] == "ndots:":
+					n, _ := strconv.Atoi(s[6:])
+					if n < 1 {
+						n = 1
+					}
+					c.Ndots = n
+				case len(s) >= 8 && s[:8] == "timeout:":
+					n, _ := strconv.Atoi(s[8:])
+					if n < 1 {
+						n = 1
+					}
+					c.Timeout = n
+				case len(s) >= 8 && s[:9] == "attempts:":
+					n, _ := strconv.Atoi(s[9:])
+					if n < 1 {
+						n = 1
+					}
+					c.Attempts = n
+				case s == "rotate":
+					/* not imp */
+				}
+			}
+		}
+	}
+	return c, nil
+}
diff --git a/vendor/github.com/miekg/dns/dane.go b/vendor/github.com/miekg/dns/dane.go
new file mode 100644
index 000000000..cdaa833ff
--- /dev/null
+++ b/vendor/github.com/miekg/dns/dane.go
@@ -0,0 +1,44 @@
+package dns
+
+import (
+	"crypto/sha256"
+	"crypto/sha512"
+	"crypto/x509"
+	"encoding/hex"
+	"errors"
+	"io"
+)
+
+// CertificateToDANE converts a certificate to a hex string as used in the TLSA or SMIMEA records.
+func CertificateToDANE(selector, matchingType uint8, cert *x509.Certificate) (string, error) {
+	switch matchingType {
+	case 0:
+		switch selector {
+		case 0:
+			return hex.EncodeToString(cert.Raw), nil
+		case 1:
+			return hex.EncodeToString(cert.RawSubjectPublicKeyInfo), nil
+		}
+	case 1:
+		h := sha256.New()
+		switch selector {
+		case 0:
+			io.WriteString(h, string(cert.Raw))
+			return hex.EncodeToString(h.Sum(nil)), nil
+		case 1:
+			io.WriteString(h, string(cert.RawSubjectPublicKeyInfo))
+			return hex.EncodeToString(h.Sum(nil)), nil
+		}
+	case 2:
+		h := sha512.New()
+		switch selector {
+		case 0:
+			io.WriteString(h, string(cert.Raw))
+			return hex.EncodeToString(h.Sum(nil)), nil
+		case 1:
+			io.WriteString(h, string(cert.RawSubjectPublicKeyInfo))
+			return hex.EncodeToString(h.Sum(nil)), nil
+		}
+	}
+	return "", errors.New("dns: bad MatchingType or Selector")
+}
diff --git a/vendor/github.com/miekg/dns/defaults.go b/vendor/github.com/miekg/dns/defaults.go
new file mode 100644
index 000000000..cf456165f
--- /dev/null
+++ b/vendor/github.com/miekg/dns/defaults.go
@@ -0,0 +1,282 @@
+package dns
+
+import (
+	"errors"
+	"net"
+	"strconv"
+)
+
+const hexDigit = "0123456789abcdef"
+
+// Everything is assumed in ClassINET.
+
+// SetReply creates a reply message from a request message.
+func (dns *Msg) SetReply(request *Msg) *Msg {
+	dns.Id = request.Id
+	dns.RecursionDesired = request.RecursionDesired // Copy rd bit
+	dns.Response = true
+	dns.Opcode = OpcodeQuery
+	dns.Rcode = RcodeSuccess
+	if len(request.Question) > 0 {
+		dns.Question = make([]Question, 1)
+		dns.Question[0] = request.Question[0]
+	}
+	return dns
+}
+
+// SetQuestion creates a question message, it sets the Question
+// section, generates an Id and sets the RecursionDesired (RD)
+// bit to true.
+func (dns *Msg) SetQuestion(z string, t uint16) *Msg {
+	dns.Id = Id()
+	dns.RecursionDesired = true
+	dns.Question = make([]Question, 1)
+	dns.Question[0] = Question{z, t, ClassINET}
+	return dns
+}
+
+// SetNotify creates a notify message, it sets the Question
+// section, generates an Id and sets the Authoritative (AA)
+// bit to true.
+func (dns *Msg) SetNotify(z string) *Msg {
+	dns.Opcode = OpcodeNotify
+	dns.Authoritative = true
+	dns.Id = Id()
+	dns.Question = make([]Question, 1)
+	dns.Question[0] = Question{z, TypeSOA, ClassINET}
+	return dns
+}
+
+// SetRcode creates an error message suitable for the request.
+func (dns *Msg) SetRcode(request *Msg, rcode int) *Msg {
+	dns.SetReply(request)
+	dns.Rcode = rcode
+	return dns
+}
+
+// SetRcodeFormatError creates a message with FormError set.
+func (dns *Msg) SetRcodeFormatError(request *Msg) *Msg {
+	dns.Rcode = RcodeFormatError
+	dns.Opcode = OpcodeQuery
+	dns.Response = true
+	dns.Authoritative = false
+	dns.Id = request.Id
+	return dns
+}
+
+// SetUpdate makes the message a dynamic update message. It
+// sets the ZONE section to: z, TypeSOA, ClassINET.
+func (dns *Msg) SetUpdate(z string) *Msg {
+	dns.Id = Id()
+	dns.Response = false
+	dns.Opcode = OpcodeUpdate
+	dns.Compress = false // BIND9 cannot handle compression
+	dns.Question = make([]Question, 1)
+	dns.Question[0] = Question{z, TypeSOA, ClassINET}
+	return dns
+}
+
+// SetIxfr creates message for requesting an IXFR.
+func (dns *Msg) SetIxfr(z string, serial uint32, ns, mbox string) *Msg {
+	dns.Id = Id()
+	dns.Question = make([]Question, 1)
+	dns.Ns = make([]RR, 1)
+	s := new(SOA)
+	s.Hdr = RR_Header{z, TypeSOA, ClassINET, defaultTtl, 0}
+	s.Serial = serial
+	s.Ns = ns
+	s.Mbox = mbox
+	dns.Question[0] = Question{z, TypeIXFR, ClassINET}
+	dns.Ns[0] = s
+	return dns
+}
+
+// SetAxfr creates message for requesting an AXFR.
+func (dns *Msg) SetAxfr(z string) *Msg {
+	dns.Id = Id()
+	dns.Question = make([]Question, 1)
+	dns.Question[0] = Question{z, TypeAXFR, ClassINET}
+	return dns
+}
+
+// SetTsig appends a TSIG RR to the message.
+// This is only a skeleton TSIG RR that is added as the last RR in the
+// additional section. The Tsig is calculated when the message is being send.
+func (dns *Msg) SetTsig(z, algo string, fudge, timesigned int64) *Msg {
+	t := new(TSIG)
+	t.Hdr = RR_Header{z, TypeTSIG, ClassANY, 0, 0}
+	t.Algorithm = algo
+	t.Fudge = 300
+	t.TimeSigned = uint64(timesigned)
+	t.OrigId = dns.Id
+	dns.Extra = append(dns.Extra, t)
+	return dns
+}
+
+// SetEdns0 appends a EDNS0 OPT RR to the message.
+// TSIG should always the last RR in a message.
+func (dns *Msg) SetEdns0(udpsize uint16, do bool) *Msg {
+	e := new(OPT)
+	e.Hdr.Name = "."
+	e.Hdr.Rrtype = TypeOPT
+	e.SetUDPSize(udpsize)
+	if do {
+		e.SetDo()
+	}
+	dns.Extra = append(dns.Extra, e)
+	return dns
+}
+
+// IsTsig checks if the message has a TSIG record as the last record
+// in the additional section. It returns the TSIG record found or nil.
+func (dns *Msg) IsTsig() *TSIG {
+	if len(dns.Extra) > 0 {
+		if dns.Extra[len(dns.Extra)-1].Header().Rrtype == TypeTSIG {
+			return dns.Extra[len(dns.Extra)-1].(*TSIG)
+		}
+	}
+	return nil
+}
+
+// IsEdns0 checks if the message has a EDNS0 (OPT) record, any EDNS0
+// record in the additional section will do. It returns the OPT record
+// found or nil.
+func (dns *Msg) IsEdns0() *OPT {
+	// EDNS0 is at the end of the additional section, start there.
+	// We might want to change this to *only* look at the last two
+	// records. So we see TSIG and/or OPT - this a slightly bigger
+	// change though.
+	for i := len(dns.Extra) - 1; i >= 0; i-- {
+		if dns.Extra[i].Header().Rrtype == TypeOPT {
+			return dns.Extra[i].(*OPT)
+		}
+	}
+	return nil
+}
+
+// IsDomainName checks if s is a valid domain name, it returns the number of
+// labels and true, when a domain name is valid.  Note that non fully qualified
+// domain name is considered valid, in this case the last label is counted in
+// the number of labels.  When false is returned the number of labels is not
+// defined.  Also note that this function is extremely liberal; almost any
+// string is a valid domain name as the DNS is 8 bit protocol. It checks if each
+// label fits in 63 characters, but there is no length check for the entire
+// string s. I.e.  a domain name longer than 255 characters is considered valid.
+func IsDomainName(s string) (labels int, ok bool) {
+	_, labels, err := packDomainName(s, nil, 0, nil, false)
+	return labels, err == nil
+}
+
+// IsSubDomain checks if child is indeed a child of the parent. If child and parent
+// are the same domain true is returned as well.
+func IsSubDomain(parent, child string) bool {
+	// Entire child is contained in parent
+	return CompareDomainName(parent, child) == CountLabel(parent)
+}
+
+// IsMsg sanity checks buf and returns an error if it isn't a valid DNS packet.
+// The checking is performed on the binary payload.
+func IsMsg(buf []byte) error {
+	// Header
+	if len(buf) < 12 {
+		return errors.New("dns: bad message header")
+	}
+	// Header: Opcode
+	// TODO(miek): more checks here, e.g. check all header bits.
+	return nil
+}
+
+// IsFqdn checks if a domain name is fully qualified.
+func IsFqdn(s string) bool {
+	l := len(s)
+	if l == 0 {
+		return false
+	}
+	return s[l-1] == '.'
+}
+
+// IsRRset checks if a set of RRs is a valid RRset as defined by RFC 2181.
+// This means the RRs need to have the same type, name, and class. Returns true
+// if the RR set is valid, otherwise false.
+func IsRRset(rrset []RR) bool {
+	if len(rrset) == 0 {
+		return false
+	}
+	if len(rrset) == 1 {
+		return true
+	}
+	rrHeader := rrset[0].Header()
+	rrType := rrHeader.Rrtype
+	rrClass := rrHeader.Class
+	rrName := rrHeader.Name
+
+	for _, rr := range rrset[1:] {
+		curRRHeader := rr.Header()
+		if curRRHeader.Rrtype != rrType || curRRHeader.Class != rrClass || curRRHeader.Name != rrName {
+			// Mismatch between the records, so this is not a valid rrset for
+			//signing/verifying
+			return false
+		}
+	}
+
+	return true
+}
+
+// Fqdn return the fully qualified domain name from s.
+// If s is already fully qualified, it behaves as the identity function.
+func Fqdn(s string) string {
+	if IsFqdn(s) {
+		return s
+	}
+	return s + "."
+}
+
+// Copied from the official Go code.
+
+// ReverseAddr returns the in-addr.arpa. or ip6.arpa. hostname of the IP
+// address suitable for reverse DNS (PTR) record lookups or an error if it fails
+// to parse the IP address.
+func ReverseAddr(addr string) (arpa string, err error) {
+	ip := net.ParseIP(addr)
+	if ip == nil {
+		return "", &Error{err: "unrecognized address: " + addr}
+	}
+	if ip.To4() != nil {
+		return strconv.Itoa(int(ip[15])) + "." + strconv.Itoa(int(ip[14])) + "." + strconv.Itoa(int(ip[13])) + "." +
+			strconv.Itoa(int(ip[12])) + ".in-addr.arpa.", nil
+	}
+	// Must be IPv6
+	buf := make([]byte, 0, len(ip)*4+len("ip6.arpa."))
+	// Add it, in reverse, to the buffer
+	for i := len(ip) - 1; i >= 0; i-- {
+		v := ip[i]
+		buf = append(buf, hexDigit[v&0xF])
+		buf = append(buf, '.')
+		buf = append(buf, hexDigit[v>>4])
+		buf = append(buf, '.')
+	}
+	// Append "ip6.arpa." and return (buf already has the final .)
+	buf = append(buf, "ip6.arpa."...)
+	return string(buf), nil
+}
+
+// String returns the string representation for the type t.
+func (t Type) String() string {
+	if t1, ok := TypeToString[uint16(t)]; ok {
+		return t1
+	}
+	return "TYPE" + strconv.Itoa(int(t))
+}
+
+// String returns the string representation for the class c.
+func (c Class) String() string {
+	if c1, ok := ClassToString[uint16(c)]; ok {
+		return c1
+	}
+	return "CLASS" + strconv.Itoa(int(c))
+}
+
+// String returns the string representation for the name n.
+func (n Name) String() string {
+	return sprintName(string(n))
+}
diff --git a/vendor/github.com/miekg/dns/dns.go b/vendor/github.com/miekg/dns/dns.go
new file mode 100644
index 000000000..b3292287c
--- /dev/null
+++ b/vendor/github.com/miekg/dns/dns.go
@@ -0,0 +1,104 @@
+package dns
+
+import "strconv"
+
+const (
+	year68     = 1 << 31 // For RFC1982 (Serial Arithmetic) calculations in 32 bits.
+	defaultTtl = 3600    // Default internal TTL.
+
+	DefaultMsgSize = 4096  // DefaultMsgSize is the standard default for messages larger than 512 bytes.
+	MinMsgSize     = 512   // MinMsgSize is the minimal size of a DNS packet.
+	MaxMsgSize     = 65535 // MaxMsgSize is the largest possible DNS packet.
+)
+
+// Error represents a DNS error.
+type Error struct{ err string }
+
+func (e *Error) Error() string {
+	if e == nil {
+		return "dns: <nil>"
+	}
+	return "dns: " + e.err
+}
+
+// An RR represents a resource record.
+type RR interface {
+	// Header returns the header of an resource record. The header contains
+	// everything up to the rdata.
+	Header() *RR_Header
+	// String returns the text representation of the resource record.
+	String() string
+
+	// copy returns a copy of the RR
+	copy() RR
+	// len returns the length (in octets) of the uncompressed RR in wire format.
+	len() int
+	// pack packs an RR into wire format.
+	pack([]byte, int, map[string]int, bool) (int, error)
+}
+
+// RR_Header is the header all DNS resource records share.
+type RR_Header struct {
+	Name     string `dns:"cdomain-name"`
+	Rrtype   uint16
+	Class    uint16
+	Ttl      uint32
+	Rdlength uint16 // Length of data after header.
+}
+
+// Header returns itself. This is here to make RR_Header implements the RR interface.
+func (h *RR_Header) Header() *RR_Header { return h }
+
+// Just to implement the RR interface.
+func (h *RR_Header) copy() RR { return nil }
+
+func (h *RR_Header) copyHeader() *RR_Header {
+	r := new(RR_Header)
+	r.Name = h.Name
+	r.Rrtype = h.Rrtype
+	r.Class = h.Class
+	r.Ttl = h.Ttl
+	r.Rdlength = h.Rdlength
+	return r
+}
+
+func (h *RR_Header) String() string {
+	var s string
+
+	if h.Rrtype == TypeOPT {
+		s = ";"
+		// and maybe other things
+	}
+
+	s += sprintName(h.Name) + "\t"
+	s += strconv.FormatInt(int64(h.Ttl), 10) + "\t"
+	s += Class(h.Class).String() + "\t"
+	s += Type(h.Rrtype).String() + "\t"
+	return s
+}
+
+func (h *RR_Header) len() int {
+	l := len(h.Name) + 1
+	l += 10 // rrtype(2) + class(2) + ttl(4) + rdlength(2)
+	return l
+}
+
+// ToRFC3597 converts a known RR to the unknown RR representation from RFC 3597.
+func (rr *RFC3597) ToRFC3597(r RR) error {
+	buf := make([]byte, r.len()*2)
+	off, err := PackRR(r, buf, 0, nil, false)
+	if err != nil {
+		return err
+	}
+	buf = buf[:off]
+	if int(r.Header().Rdlength) > off {
+		return ErrBuf
+	}
+
+	rfc3597, _, err := unpackRFC3597(*r.Header(), buf, off-int(r.Header().Rdlength))
+	if err != nil {
+		return err
+	}
+	*rr = *rfc3597.(*RFC3597)
+	return nil
+}
diff --git a/vendor/github.com/miekg/dns/dnssec.go b/vendor/github.com/miekg/dns/dnssec.go
new file mode 100644
index 000000000..f5f3fbdd8
--- /dev/null
+++ b/vendor/github.com/miekg/dns/dnssec.go
@@ -0,0 +1,721 @@
+package dns
+
+import (
+	"bytes"
+	"crypto"
+	"crypto/dsa"
+	"crypto/ecdsa"
+	"crypto/elliptic"
+	_ "crypto/md5"
+	"crypto/rand"
+	"crypto/rsa"
+	_ "crypto/sha1"
+	_ "crypto/sha256"
+	_ "crypto/sha512"
+	"encoding/asn1"
+	"encoding/binary"
+	"encoding/hex"
+	"math/big"
+	"sort"
+	"strings"
+	"time"
+)
+
+// DNSSEC encryption algorithm codes.
+const (
+	_ uint8 = iota
+	RSAMD5
+	DH
+	DSA
+	_ // Skip 4, RFC 6725, section 2.1
+	RSASHA1
+	DSANSEC3SHA1
+	RSASHA1NSEC3SHA1
+	RSASHA256
+	_ // Skip 9, RFC 6725, section 2.1
+	RSASHA512
+	_ // Skip 11, RFC 6725, section 2.1
+	ECCGOST
+	ECDSAP256SHA256
+	ECDSAP384SHA384
+	INDIRECT   uint8 = 252
+	PRIVATEDNS uint8 = 253 // Private (experimental keys)
+	PRIVATEOID uint8 = 254
+)
+
+// Map for algorithm names.
+var AlgorithmToString = map[uint8]string{
+	RSAMD5:           "RSAMD5",
+	DH:               "DH",
+	DSA:              "DSA",
+	RSASHA1:          "RSASHA1",
+	DSANSEC3SHA1:     "DSA-NSEC3-SHA1",
+	RSASHA1NSEC3SHA1: "RSASHA1-NSEC3-SHA1",
+	RSASHA256:        "RSASHA256",
+	RSASHA512:        "RSASHA512",
+	ECCGOST:          "ECC-GOST",
+	ECDSAP256SHA256:  "ECDSAP256SHA256",
+	ECDSAP384SHA384:  "ECDSAP384SHA384",
+	INDIRECT:         "INDIRECT",
+	PRIVATEDNS:       "PRIVATEDNS",
+	PRIVATEOID:       "PRIVATEOID",
+}
+
+// Map of algorithm strings.
+var StringToAlgorithm = reverseInt8(AlgorithmToString)
+
+// Map of algorithm crypto hashes.
+var AlgorithmToHash = map[uint8]crypto.Hash{
+	RSAMD5:           crypto.MD5, // Deprecated in RFC 6725
+	RSASHA1:          crypto.SHA1,
+	RSASHA1NSEC3SHA1: crypto.SHA1,
+	RSASHA256:        crypto.SHA256,
+	ECDSAP256SHA256:  crypto.SHA256,
+	ECDSAP384SHA384:  crypto.SHA384,
+	RSASHA512:        crypto.SHA512,
+}
+
+// DNSSEC hashing algorithm codes.
+const (
+	_      uint8 = iota
+	SHA1         // RFC 4034
+	SHA256       // RFC 4509
+	GOST94       // RFC 5933
+	SHA384       // Experimental
+	SHA512       // Experimental
+)
+
+// Map for hash names.
+var HashToString = map[uint8]string{
+	SHA1:   "SHA1",
+	SHA256: "SHA256",
+	GOST94: "GOST94",
+	SHA384: "SHA384",
+	SHA512: "SHA512",
+}
+
+// Map of hash strings.
+var StringToHash = reverseInt8(HashToString)
+
+// DNSKEY flag values.
+const (
+	SEP    = 1
+	REVOKE = 1 << 7
+	ZONE   = 1 << 8
+)
+
+// The RRSIG needs to be converted to wireformat with some of the rdata (the signature) missing.
+type rrsigWireFmt struct {
+	TypeCovered uint16
+	Algorithm   uint8
+	Labels      uint8
+	OrigTtl     uint32
+	Expiration  uint32
+	Inception   uint32
+	KeyTag      uint16
+	SignerName  string `dns:"domain-name"`
+	/* No Signature */
+}
+
+// Used for converting DNSKEY's rdata to wirefmt.
+type dnskeyWireFmt struct {
+	Flags     uint16
+	Protocol  uint8
+	Algorithm uint8
+	PublicKey string `dns:"base64"`
+	/* Nothing is left out */
+}
+
+func divRoundUp(a, b int) int {
+	return (a + b - 1) / b
+}
+
+// KeyTag calculates the keytag (or key-id) of the DNSKEY.
+func (k *DNSKEY) KeyTag() uint16 {
+	if k == nil {
+		return 0
+	}
+	var keytag int
+	switch k.Algorithm {
+	case RSAMD5:
+		// Look at the bottom two bytes of the modules, which the last
+		// item in the pubkey. We could do this faster by looking directly
+		// at the base64 values. But I'm lazy.
+		modulus, _ := fromBase64([]byte(k.PublicKey))
+		if len(modulus) > 1 {
+			x := binary.BigEndian.Uint16(modulus[len(modulus)-2:])
+			keytag = int(x)
+		}
+	default:
+		keywire := new(dnskeyWireFmt)
+		keywire.Flags = k.Flags
+		keywire.Protocol = k.Protocol
+		keywire.Algorithm = k.Algorithm
+		keywire.PublicKey = k.PublicKey
+		wire := make([]byte, DefaultMsgSize)
+		n, err := packKeyWire(keywire, wire)
+		if err != nil {
+			return 0
+		}
+		wire = wire[:n]
+		for i, v := range wire {
+			if i&1 != 0 {
+				keytag += int(v) // must be larger than uint32
+			} else {
+				keytag += int(v) << 8
+			}
+		}
+		keytag += (keytag >> 16) & 0xFFFF
+		keytag &= 0xFFFF
+	}
+	return uint16(keytag)
+}
+
+// ToDS converts a DNSKEY record to a DS record.
+func (k *DNSKEY) ToDS(h uint8) *DS {
+	if k == nil {
+		return nil
+	}
+	ds := new(DS)
+	ds.Hdr.Name = k.Hdr.Name
+	ds.Hdr.Class = k.Hdr.Class
+	ds.Hdr.Rrtype = TypeDS
+	ds.Hdr.Ttl = k.Hdr.Ttl
+	ds.Algorithm = k.Algorithm
+	ds.DigestType = h
+	ds.KeyTag = k.KeyTag()
+
+	keywire := new(dnskeyWireFmt)
+	keywire.Flags = k.Flags
+	keywire.Protocol = k.Protocol
+	keywire.Algorithm = k.Algorithm
+	keywire.PublicKey = k.PublicKey
+	wire := make([]byte, DefaultMsgSize)
+	n, err := packKeyWire(keywire, wire)
+	if err != nil {
+		return nil
+	}
+	wire = wire[:n]
+
+	owner := make([]byte, 255)
+	off, err1 := PackDomainName(strings.ToLower(k.Hdr.Name), owner, 0, nil, false)
+	if err1 != nil {
+		return nil
+	}
+	owner = owner[:off]
+	// RFC4034:
+	// digest = digest_algorithm( DNSKEY owner name | DNSKEY RDATA);
+	// "|" denotes concatenation
+	// DNSKEY RDATA = Flags | Protocol | Algorithm | Public Key.
+
+	// digest buffer
+	digest := append(owner, wire...) // another copy
+
+	var hash crypto.Hash
+	switch h {
+	case SHA1:
+		hash = crypto.SHA1
+	case SHA256:
+		hash = crypto.SHA256
+	case SHA384:
+		hash = crypto.SHA384
+	case SHA512:
+		hash = crypto.SHA512
+	default:
+		return nil
+	}
+
+	s := hash.New()
+	s.Write(digest)
+	ds.Digest = hex.EncodeToString(s.Sum(nil))
+	return ds
+}
+
+// ToCDNSKEY converts a DNSKEY record to a CDNSKEY record.
+func (k *DNSKEY) ToCDNSKEY() *CDNSKEY {
+	c := &CDNSKEY{DNSKEY: *k}
+	c.Hdr = *k.Hdr.copyHeader()
+	c.Hdr.Rrtype = TypeCDNSKEY
+	return c
+}
+
+// ToCDS converts a DS record to a CDS record.
+func (d *DS) ToCDS() *CDS {
+	c := &CDS{DS: *d}
+	c.Hdr = *d.Hdr.copyHeader()
+	c.Hdr.Rrtype = TypeCDS
+	return c
+}
+
+// Sign signs an RRSet. The signature needs to be filled in with the values:
+// Inception, Expiration, KeyTag, SignerName and Algorithm.  The rest is copied
+// from the RRset. Sign returns a non-nill error when the signing went OK.
+// There is no check if RRSet is a proper (RFC 2181) RRSet.  If OrigTTL is non
+// zero, it is used as-is, otherwise the TTL of the RRset is used as the
+// OrigTTL.
+func (rr *RRSIG) Sign(k crypto.Signer, rrset []RR) error {
+	if k == nil {
+		return ErrPrivKey
+	}
+	// s.Inception and s.Expiration may be 0 (rollover etc.), the rest must be set
+	if rr.KeyTag == 0 || len(rr.SignerName) == 0 || rr.Algorithm == 0 {
+		return ErrKey
+	}
+
+	rr.Hdr.Rrtype = TypeRRSIG
+	rr.Hdr.Name = rrset[0].Header().Name
+	rr.Hdr.Class = rrset[0].Header().Class
+	if rr.OrigTtl == 0 { // If set don't override
+		rr.OrigTtl = rrset[0].Header().Ttl
+	}
+	rr.TypeCovered = rrset[0].Header().Rrtype
+	rr.Labels = uint8(CountLabel(rrset[0].Header().Name))
+
+	if strings.HasPrefix(rrset[0].Header().Name, "*") {
+		rr.Labels-- // wildcard, remove from label count
+	}
+
+	sigwire := new(rrsigWireFmt)
+	sigwire.TypeCovered = rr.TypeCovered
+	sigwire.Algorithm = rr.Algorithm
+	sigwire.Labels = rr.Labels
+	sigwire.OrigTtl = rr.OrigTtl
+	sigwire.Expiration = rr.Expiration
+	sigwire.Inception = rr.Inception
+	sigwire.KeyTag = rr.KeyTag
+	// For signing, lowercase this name
+	sigwire.SignerName = strings.ToLower(rr.SignerName)
+
+	// Create the desired binary blob
+	signdata := make([]byte, DefaultMsgSize)
+	n, err := packSigWire(sigwire, signdata)
+	if err != nil {
+		return err
+	}
+	signdata = signdata[:n]
+	wire, err := rawSignatureData(rrset, rr)
+	if err != nil {
+		return err
+	}
+	signdata = append(signdata, wire...)
+
+	hash, ok := AlgorithmToHash[rr.Algorithm]
+	if !ok {
+		return ErrAlg
+	}
+
+	h := hash.New()
+	h.Write(signdata)
+
+	signature, err := sign(k, h.Sum(nil), hash, rr.Algorithm)
+	if err != nil {
+		return err
+	}
+
+	rr.Signature = toBase64(signature)
+
+	return nil
+}
+
+func sign(k crypto.Signer, hashed []byte, hash crypto.Hash, alg uint8) ([]byte, error) {
+	signature, err := k.Sign(rand.Reader, hashed, hash)
+	if err != nil {
+		return nil, err
+	}
+
+	switch alg {
+	case RSASHA1, RSASHA1NSEC3SHA1, RSASHA256, RSASHA512:
+		return signature, nil
+
+	case ECDSAP256SHA256, ECDSAP384SHA384:
+		ecdsaSignature := &struct {
+			R, S *big.Int
+		}{}
+		if _, err := asn1.Unmarshal(signature, ecdsaSignature); err != nil {
+			return nil, err
+		}
+
+		var intlen int
+		switch alg {
+		case ECDSAP256SHA256:
+			intlen = 32
+		case ECDSAP384SHA384:
+			intlen = 48
+		}
+
+		signature := intToBytes(ecdsaSignature.R, intlen)
+		signature = append(signature, intToBytes(ecdsaSignature.S, intlen)...)
+		return signature, nil
+
+	// There is no defined interface for what a DSA backed crypto.Signer returns
+	case DSA, DSANSEC3SHA1:
+		// 	t := divRoundUp(divRoundUp(p.PublicKey.Y.BitLen(), 8)-64, 8)
+		// 	signature := []byte{byte(t)}
+		// 	signature = append(signature, intToBytes(r1, 20)...)
+		// 	signature = append(signature, intToBytes(s1, 20)...)
+		// 	rr.Signature = signature
+	}
+
+	return nil, ErrAlg
+}
+
+// Verify validates an RRSet with the signature and key. This is only the
+// cryptographic test, the signature validity period must be checked separately.
+// This function copies the rdata of some RRs (to lowercase domain names) for the validation to work.
+func (rr *RRSIG) Verify(k *DNSKEY, rrset []RR) error {
+	// First the easy checks
+	if !IsRRset(rrset) {
+		return ErrRRset
+	}
+	if rr.KeyTag != k.KeyTag() {
+		return ErrKey
+	}
+	if rr.Hdr.Class != k.Hdr.Class {
+		return ErrKey
+	}
+	if rr.Algorithm != k.Algorithm {
+		return ErrKey
+	}
+	if strings.ToLower(rr.SignerName) != strings.ToLower(k.Hdr.Name) {
+		return ErrKey
+	}
+	if k.Protocol != 3 {
+		return ErrKey
+	}
+
+	// IsRRset checked that we have at least one RR and that the RRs in
+	// the set have consistent type, class, and name. Also check that type and
+	// class matches the RRSIG record.
+	if rrset[0].Header().Class != rr.Hdr.Class {
+		return ErrRRset
+	}
+	if rrset[0].Header().Rrtype != rr.TypeCovered {
+		return ErrRRset
+	}
+
+	// RFC 4035 5.3.2.  Reconstructing the Signed Data
+	// Copy the sig, except the rrsig data
+	sigwire := new(rrsigWireFmt)
+	sigwire.TypeCovered = rr.TypeCovered
+	sigwire.Algorithm = rr.Algorithm
+	sigwire.Labels = rr.Labels
+	sigwire.OrigTtl = rr.OrigTtl
+	sigwire.Expiration = rr.Expiration
+	sigwire.Inception = rr.Inception
+	sigwire.KeyTag = rr.KeyTag
+	sigwire.SignerName = strings.ToLower(rr.SignerName)
+	// Create the desired binary blob
+	signeddata := make([]byte, DefaultMsgSize)
+	n, err := packSigWire(sigwire, signeddata)
+	if err != nil {
+		return err
+	}
+	signeddata = signeddata[:n]
+	wire, err := rawSignatureData(rrset, rr)
+	if err != nil {
+		return err
+	}
+	signeddata = append(signeddata, wire...)
+
+	sigbuf := rr.sigBuf()           // Get the binary signature data
+	if rr.Algorithm == PRIVATEDNS { // PRIVATEOID
+		// TODO(miek)
+		// remove the domain name and assume its ours?
+	}
+
+	hash, ok := AlgorithmToHash[rr.Algorithm]
+	if !ok {
+		return ErrAlg
+	}
+
+	switch rr.Algorithm {
+	case RSASHA1, RSASHA1NSEC3SHA1, RSASHA256, RSASHA512, RSAMD5:
+		// TODO(mg): this can be done quicker, ie. cache the pubkey data somewhere??
+		pubkey := k.publicKeyRSA() // Get the key
+		if pubkey == nil {
+			return ErrKey
+		}
+
+		h := hash.New()
+		h.Write(signeddata)
+		return rsa.VerifyPKCS1v15(pubkey, hash, h.Sum(nil), sigbuf)
+
+	case ECDSAP256SHA256, ECDSAP384SHA384:
+		pubkey := k.publicKeyECDSA()
+		if pubkey == nil {
+			return ErrKey
+		}
+
+		// Split sigbuf into the r and s coordinates
+		r := new(big.Int).SetBytes(sigbuf[:len(sigbuf)/2])
+		s := new(big.Int).SetBytes(sigbuf[len(sigbuf)/2:])
+
+		h := hash.New()
+		h.Write(signeddata)
+		if ecdsa.Verify(pubkey, h.Sum(nil), r, s) {
+			return nil
+		}
+		return ErrSig
+
+	default:
+		return ErrAlg
+	}
+}
+
+// ValidityPeriod uses RFC1982 serial arithmetic to calculate
+// if a signature period is valid. If t is the zero time, the
+// current time is taken other t is. Returns true if the signature
+// is valid at the given time, otherwise returns false.
+func (rr *RRSIG) ValidityPeriod(t time.Time) bool {
+	var utc int64
+	if t.IsZero() {
+		utc = time.Now().UTC().Unix()
+	} else {
+		utc = t.UTC().Unix()
+	}
+	modi := (int64(rr.Inception) - utc) / year68
+	mode := (int64(rr.Expiration) - utc) / year68
+	ti := int64(rr.Inception) + (modi * year68)
+	te := int64(rr.Expiration) + (mode * year68)
+	return ti <= utc && utc <= te
+}
+
+// Return the signatures base64 encodedig sigdata as a byte slice.
+func (rr *RRSIG) sigBuf() []byte {
+	sigbuf, err := fromBase64([]byte(rr.Signature))
+	if err != nil {
+		return nil
+	}
+	return sigbuf
+}
+
+// publicKeyRSA returns the RSA public key from a DNSKEY record.
+func (k *DNSKEY) publicKeyRSA() *rsa.PublicKey {
+	keybuf, err := fromBase64([]byte(k.PublicKey))
+	if err != nil {
+		return nil
+	}
+
+	// RFC 2537/3110, section 2. RSA Public KEY Resource Records
+	// Length is in the 0th byte, unless its zero, then it
+	// it in bytes 1 and 2 and its a 16 bit number
+	explen := uint16(keybuf[0])
+	keyoff := 1
+	if explen == 0 {
+		explen = uint16(keybuf[1])<<8 | uint16(keybuf[2])
+		keyoff = 3
+	}
+	pubkey := new(rsa.PublicKey)
+
+	pubkey.N = big.NewInt(0)
+	shift := uint64((explen - 1) * 8)
+	expo := uint64(0)
+	for i := int(explen - 1); i > 0; i-- {
+		expo += uint64(keybuf[keyoff+i]) << shift
+		shift -= 8
+	}
+	// Remainder
+	expo += uint64(keybuf[keyoff])
+	if expo > 2<<31 {
+		// Larger expo than supported.
+		// println("dns: F5 primes (or larger) are not supported")
+		return nil
+	}
+	pubkey.E = int(expo)
+
+	pubkey.N.SetBytes(keybuf[keyoff+int(explen):])
+	return pubkey
+}
+
+// publicKeyECDSA returns the Curve public key from the DNSKEY record.
+func (k *DNSKEY) publicKeyECDSA() *ecdsa.PublicKey {
+	keybuf, err := fromBase64([]byte(k.PublicKey))
+	if err != nil {
+		return nil
+	}
+	pubkey := new(ecdsa.PublicKey)
+	switch k.Algorithm {
+	case ECDSAP256SHA256:
+		pubkey.Curve = elliptic.P256()
+		if len(keybuf) != 64 {
+			// wrongly encoded key
+			return nil
+		}
+	case ECDSAP384SHA384:
+		pubkey.Curve = elliptic.P384()
+		if len(keybuf) != 96 {
+			// Wrongly encoded key
+			return nil
+		}
+	}
+	pubkey.X = big.NewInt(0)
+	pubkey.X.SetBytes(keybuf[:len(keybuf)/2])
+	pubkey.Y = big.NewInt(0)
+	pubkey.Y.SetBytes(keybuf[len(keybuf)/2:])
+	return pubkey
+}
+
+func (k *DNSKEY) publicKeyDSA() *dsa.PublicKey {
+	keybuf, err := fromBase64([]byte(k.PublicKey))
+	if err != nil {
+		return nil
+	}
+	if len(keybuf) < 22 {
+		return nil
+	}
+	t, keybuf := int(keybuf[0]), keybuf[1:]
+	size := 64 + t*8
+	q, keybuf := keybuf[:20], keybuf[20:]
+	if len(keybuf) != 3*size {
+		return nil
+	}
+	p, keybuf := keybuf[:size], keybuf[size:]
+	g, y := keybuf[:size], keybuf[size:]
+	pubkey := new(dsa.PublicKey)
+	pubkey.Parameters.Q = big.NewInt(0).SetBytes(q)
+	pubkey.Parameters.P = big.NewInt(0).SetBytes(p)
+	pubkey.Parameters.G = big.NewInt(0).SetBytes(g)
+	pubkey.Y = big.NewInt(0).SetBytes(y)
+	return pubkey
+}
+
+type wireSlice [][]byte
+
+func (p wireSlice) Len() int      { return len(p) }
+func (p wireSlice) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
+func (p wireSlice) Less(i, j int) bool {
+	_, ioff, _ := UnpackDomainName(p[i], 0)
+	_, joff, _ := UnpackDomainName(p[j], 0)
+	return bytes.Compare(p[i][ioff+10:], p[j][joff+10:]) < 0
+}
+
+// Return the raw signature data.
+func rawSignatureData(rrset []RR, s *RRSIG) (buf []byte, err error) {
+	wires := make(wireSlice, len(rrset))
+	for i, r := range rrset {
+		r1 := r.copy()
+		r1.Header().Ttl = s.OrigTtl
+		labels := SplitDomainName(r1.Header().Name)
+		// 6.2. Canonical RR Form. (4) - wildcards
+		if len(labels) > int(s.Labels) {
+			// Wildcard
+			r1.Header().Name = "*." + strings.Join(labels[len(labels)-int(s.Labels):], ".") + "."
+		}
+		// RFC 4034: 6.2.  Canonical RR Form. (2) - domain name to lowercase
+		r1.Header().Name = strings.ToLower(r1.Header().Name)
+		// 6.2. Canonical RR Form. (3) - domain rdata to lowercase.
+		//   NS, MD, MF, CNAME, SOA, MB, MG, MR, PTR,
+		//   HINFO, MINFO, MX, RP, AFSDB, RT, SIG, PX, NXT, NAPTR, KX,
+		//   SRV, DNAME, A6
+		//
+		// RFC 6840 - Clarifications and Implementation Notes for DNS Security (DNSSEC):
+		//	Section 6.2 of [RFC4034] also erroneously lists HINFO as a record
+		//	that needs conversion to lowercase, and twice at that.  Since HINFO
+		//	records contain no domain names, they are not subject to case
+		//	conversion.
+		switch x := r1.(type) {
+		case *NS:
+			x.Ns = strings.ToLower(x.Ns)
+		case *CNAME:
+			x.Target = strings.ToLower(x.Target)
+		case *SOA:
+			x.Ns = strings.ToLower(x.Ns)
+			x.Mbox = strings.ToLower(x.Mbox)
+		case *MB:
+			x.Mb = strings.ToLower(x.Mb)
+		case *MG:
+			x.Mg = strings.ToLower(x.Mg)
+		case *MR:
+			x.Mr = strings.ToLower(x.Mr)
+		case *PTR:
+			x.Ptr = strings.ToLower(x.Ptr)
+		case *MINFO:
+			x.Rmail = strings.ToLower(x.Rmail)
+			x.Email = strings.ToLower(x.Email)
+		case *MX:
+			x.Mx = strings.ToLower(x.Mx)
+		case *NAPTR:
+			x.Replacement = strings.ToLower(x.Replacement)
+		case *KX:
+			x.Exchanger = strings.ToLower(x.Exchanger)
+		case *SRV:
+			x.Target = strings.ToLower(x.Target)
+		case *DNAME:
+			x.Target = strings.ToLower(x.Target)
+		}
+		// 6.2. Canonical RR Form. (5) - origTTL
+		wire := make([]byte, r1.len()+1) // +1 to be safe(r)
+		off, err1 := PackRR(r1, wire, 0, nil, false)
+		if err1 != nil {
+			return nil, err1
+		}
+		wire = wire[:off]
+		wires[i] = wire
+	}
+	sort.Sort(wires)
+	for i, wire := range wires {
+		if i > 0 && bytes.Equal(wire, wires[i-1]) {
+			continue
+		}
+		buf = append(buf, wire...)
+	}
+	return buf, nil
+}
+
+func packSigWire(sw *rrsigWireFmt, msg []byte) (int, error) {
+	// copied from zmsg.go RRSIG packing
+	off, err := packUint16(sw.TypeCovered, msg, 0)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint8(sw.Algorithm, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint8(sw.Labels, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint32(sw.OrigTtl, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint32(sw.Expiration, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint32(sw.Inception, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint16(sw.KeyTag, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = PackDomainName(sw.SignerName, msg, off, nil, false)
+	if err != nil {
+		return off, err
+	}
+	return off, nil
+}
+
+func packKeyWire(dw *dnskeyWireFmt, msg []byte) (int, error) {
+	// copied from zmsg.go DNSKEY packing
+	off, err := packUint16(dw.Flags, msg, 0)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint8(dw.Protocol, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint8(dw.Algorithm, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packStringBase64(dw.PublicKey, msg, off)
+	if err != nil {
+		return off, err
+	}
+	return off, nil
+}
diff --git a/vendor/github.com/miekg/dns/dnssec_keygen.go b/vendor/github.com/miekg/dns/dnssec_keygen.go
new file mode 100644
index 000000000..229a07937
--- /dev/null
+++ b/vendor/github.com/miekg/dns/dnssec_keygen.go
@@ -0,0 +1,156 @@
+package dns
+
+import (
+	"crypto"
+	"crypto/dsa"
+	"crypto/ecdsa"
+	"crypto/elliptic"
+	"crypto/rand"
+	"crypto/rsa"
+	"math/big"
+)
+
+// Generate generates a DNSKEY of the given bit size.
+// The public part is put inside the DNSKEY record.
+// The Algorithm in the key must be set as this will define
+// what kind of DNSKEY will be generated.
+// The ECDSA algorithms imply a fixed keysize, in that case
+// bits should be set to the size of the algorithm.
+func (k *DNSKEY) Generate(bits int) (crypto.PrivateKey, error) {
+	switch k.Algorithm {
+	case DSA, DSANSEC3SHA1:
+		if bits != 1024 {
+			return nil, ErrKeySize
+		}
+	case RSAMD5, RSASHA1, RSASHA256, RSASHA1NSEC3SHA1:
+		if bits < 512 || bits > 4096 {
+			return nil, ErrKeySize
+		}
+	case RSASHA512:
+		if bits < 1024 || bits > 4096 {
+			return nil, ErrKeySize
+		}
+	case ECDSAP256SHA256:
+		if bits != 256 {
+			return nil, ErrKeySize
+		}
+	case ECDSAP384SHA384:
+		if bits != 384 {
+			return nil, ErrKeySize
+		}
+	}
+
+	switch k.Algorithm {
+	case DSA, DSANSEC3SHA1:
+		params := new(dsa.Parameters)
+		if err := dsa.GenerateParameters(params, rand.Reader, dsa.L1024N160); err != nil {
+			return nil, err
+		}
+		priv := new(dsa.PrivateKey)
+		priv.PublicKey.Parameters = *params
+		err := dsa.GenerateKey(priv, rand.Reader)
+		if err != nil {
+			return nil, err
+		}
+		k.setPublicKeyDSA(params.Q, params.P, params.G, priv.PublicKey.Y)
+		return priv, nil
+	case RSAMD5, RSASHA1, RSASHA256, RSASHA512, RSASHA1NSEC3SHA1:
+		priv, err := rsa.GenerateKey(rand.Reader, bits)
+		if err != nil {
+			return nil, err
+		}
+		k.setPublicKeyRSA(priv.PublicKey.E, priv.PublicKey.N)
+		return priv, nil
+	case ECDSAP256SHA256, ECDSAP384SHA384:
+		var c elliptic.Curve
+		switch k.Algorithm {
+		case ECDSAP256SHA256:
+			c = elliptic.P256()
+		case ECDSAP384SHA384:
+			c = elliptic.P384()
+		}
+		priv, err := ecdsa.GenerateKey(c, rand.Reader)
+		if err != nil {
+			return nil, err
+		}
+		k.setPublicKeyECDSA(priv.PublicKey.X, priv.PublicKey.Y)
+		return priv, nil
+	default:
+		return nil, ErrAlg
+	}
+}
+
+// Set the public key (the value E and N)
+func (k *DNSKEY) setPublicKeyRSA(_E int, _N *big.Int) bool {
+	if _E == 0 || _N == nil {
+		return false
+	}
+	buf := exponentToBuf(_E)
+	buf = append(buf, _N.Bytes()...)
+	k.PublicKey = toBase64(buf)
+	return true
+}
+
+// Set the public key for Elliptic Curves
+func (k *DNSKEY) setPublicKeyECDSA(_X, _Y *big.Int) bool {
+	if _X == nil || _Y == nil {
+		return false
+	}
+	var intlen int
+	switch k.Algorithm {
+	case ECDSAP256SHA256:
+		intlen = 32
+	case ECDSAP384SHA384:
+		intlen = 48
+	}
+	k.PublicKey = toBase64(curveToBuf(_X, _Y, intlen))
+	return true
+}
+
+// Set the public key for DSA
+func (k *DNSKEY) setPublicKeyDSA(_Q, _P, _G, _Y *big.Int) bool {
+	if _Q == nil || _P == nil || _G == nil || _Y == nil {
+		return false
+	}
+	buf := dsaToBuf(_Q, _P, _G, _Y)
+	k.PublicKey = toBase64(buf)
+	return true
+}
+
+// Set the public key (the values E and N) for RSA
+// RFC 3110: Section 2. RSA Public KEY Resource Records
+func exponentToBuf(_E int) []byte {
+	var buf []byte
+	i := big.NewInt(int64(_E))
+	if len(i.Bytes()) < 256 {
+		buf = make([]byte, 1)
+		buf[0] = uint8(len(i.Bytes()))
+	} else {
+		buf = make([]byte, 3)
+		buf[0] = 0
+		buf[1] = uint8(len(i.Bytes()) >> 8)
+		buf[2] = uint8(len(i.Bytes()))
+	}
+	buf = append(buf, i.Bytes()...)
+	return buf
+}
+
+// Set the public key for X and Y for Curve. The two
+// values are just concatenated.
+func curveToBuf(_X, _Y *big.Int, intlen int) []byte {
+	buf := intToBytes(_X, intlen)
+	buf = append(buf, intToBytes(_Y, intlen)...)
+	return buf
+}
+
+// Set the public key for X and Y for Curve. The two
+// values are just concatenated.
+func dsaToBuf(_Q, _P, _G, _Y *big.Int) []byte {
+	t := divRoundUp(divRoundUp(_G.BitLen(), 8)-64, 8)
+	buf := []byte{byte(t)}
+	buf = append(buf, intToBytes(_Q, 20)...)
+	buf = append(buf, intToBytes(_P, 64+t*8)...)
+	buf = append(buf, intToBytes(_G, 64+t*8)...)
+	buf = append(buf, intToBytes(_Y, 64+t*8)...)
+	return buf
+}
diff --git a/vendor/github.com/miekg/dns/dnssec_keyscan.go b/vendor/github.com/miekg/dns/dnssec_keyscan.go
new file mode 100644
index 000000000..9ff3a617e
--- /dev/null
+++ b/vendor/github.com/miekg/dns/dnssec_keyscan.go
@@ -0,0 +1,249 @@
+package dns
+
+import (
+	"crypto"
+	"crypto/dsa"
+	"crypto/ecdsa"
+	"crypto/rsa"
+	"io"
+	"math/big"
+	"strconv"
+	"strings"
+)
+
+// NewPrivateKey returns a PrivateKey by parsing the string s.
+// s should be in the same form of the BIND private key files.
+func (k *DNSKEY) NewPrivateKey(s string) (crypto.PrivateKey, error) {
+	if s == "" || s[len(s)-1] != '\n' { // We need a closing newline
+		return k.ReadPrivateKey(strings.NewReader(s+"\n"), "")
+	}
+	return k.ReadPrivateKey(strings.NewReader(s), "")
+}
+
+// ReadPrivateKey reads a private key from the io.Reader q. The string file is
+// only used in error reporting.
+// The public key must be known, because some cryptographic algorithms embed
+// the public inside the privatekey.
+func (k *DNSKEY) ReadPrivateKey(q io.Reader, file string) (crypto.PrivateKey, error) {
+	m, err := parseKey(q, file)
+	if m == nil {
+		return nil, err
+	}
+	if _, ok := m["private-key-format"]; !ok {
+		return nil, ErrPrivKey
+	}
+	if m["private-key-format"] != "v1.2" && m["private-key-format"] != "v1.3" {
+		return nil, ErrPrivKey
+	}
+	// TODO(mg): check if the pubkey matches the private key
+	algo, err := strconv.Atoi(strings.SplitN(m["algorithm"], " ", 2)[0])
+	if err != nil {
+		return nil, ErrPrivKey
+	}
+	switch uint8(algo) {
+	case DSA:
+		priv, err := readPrivateKeyDSA(m)
+		if err != nil {
+			return nil, err
+		}
+		pub := k.publicKeyDSA()
+		if pub == nil {
+			return nil, ErrKey
+		}
+		priv.PublicKey = *pub
+		return priv, nil
+	case RSAMD5:
+		fallthrough
+	case RSASHA1:
+		fallthrough
+	case RSASHA1NSEC3SHA1:
+		fallthrough
+	case RSASHA256:
+		fallthrough
+	case RSASHA512:
+		priv, err := readPrivateKeyRSA(m)
+		if err != nil {
+			return nil, err
+		}
+		pub := k.publicKeyRSA()
+		if pub == nil {
+			return nil, ErrKey
+		}
+		priv.PublicKey = *pub
+		return priv, nil
+	case ECCGOST:
+		return nil, ErrPrivKey
+	case ECDSAP256SHA256:
+		fallthrough
+	case ECDSAP384SHA384:
+		priv, err := readPrivateKeyECDSA(m)
+		if err != nil {
+			return nil, err
+		}
+		pub := k.publicKeyECDSA()
+		if pub == nil {
+			return nil, ErrKey
+		}
+		priv.PublicKey = *pub
+		return priv, nil
+	default:
+		return nil, ErrPrivKey
+	}
+}
+
+// Read a private key (file) string and create a public key. Return the private key.
+func readPrivateKeyRSA(m map[string]string) (*rsa.PrivateKey, error) {
+	p := new(rsa.PrivateKey)
+	p.Primes = []*big.Int{nil, nil}
+	for k, v := range m {
+		switch k {
+		case "modulus", "publicexponent", "privateexponent", "prime1", "prime2":
+			v1, err := fromBase64([]byte(v))
+			if err != nil {
+				return nil, err
+			}
+			switch k {
+			case "modulus":
+				p.PublicKey.N = big.NewInt(0)
+				p.PublicKey.N.SetBytes(v1)
+			case "publicexponent":
+				i := big.NewInt(0)
+				i.SetBytes(v1)
+				p.PublicKey.E = int(i.Int64()) // int64 should be large enough
+			case "privateexponent":
+				p.D = big.NewInt(0)
+				p.D.SetBytes(v1)
+			case "prime1":
+				p.Primes[0] = big.NewInt(0)
+				p.Primes[0].SetBytes(v1)
+			case "prime2":
+				p.Primes[1] = big.NewInt(0)
+				p.Primes[1].SetBytes(v1)
+			}
+		case "exponent1", "exponent2", "coefficient":
+			// not used in Go (yet)
+		case "created", "publish", "activate":
+			// not used in Go (yet)
+		}
+	}
+	return p, nil
+}
+
+func readPrivateKeyDSA(m map[string]string) (*dsa.PrivateKey, error) {
+	p := new(dsa.PrivateKey)
+	p.X = big.NewInt(0)
+	for k, v := range m {
+		switch k {
+		case "private_value(x)":
+			v1, err := fromBase64([]byte(v))
+			if err != nil {
+				return nil, err
+			}
+			p.X.SetBytes(v1)
+		case "created", "publish", "activate":
+			/* not used in Go (yet) */
+		}
+	}
+	return p, nil
+}
+
+func readPrivateKeyECDSA(m map[string]string) (*ecdsa.PrivateKey, error) {
+	p := new(ecdsa.PrivateKey)
+	p.D = big.NewInt(0)
+	// TODO: validate that the required flags are present
+	for k, v := range m {
+		switch k {
+		case "privatekey":
+			v1, err := fromBase64([]byte(v))
+			if err != nil {
+				return nil, err
+			}
+			p.D.SetBytes(v1)
+		case "created", "publish", "activate":
+			/* not used in Go (yet) */
+		}
+	}
+	return p, nil
+}
+
+// parseKey reads a private key from r. It returns a map[string]string,
+// with the key-value pairs, or an error when the file is not correct.
+func parseKey(r io.Reader, file string) (map[string]string, error) {
+	s := scanInit(r)
+	m := make(map[string]string)
+	c := make(chan lex)
+	k := ""
+	// Start the lexer
+	go klexer(s, c)
+	for l := range c {
+		// It should alternate
+		switch l.value {
+		case zKey:
+			k = l.token
+		case zValue:
+			if k == "" {
+				return nil, &ParseError{file, "no private key seen", l}
+			}
+			//println("Setting", strings.ToLower(k), "to", l.token, "b")
+			m[strings.ToLower(k)] = l.token
+			k = ""
+		}
+	}
+	return m, nil
+}
+
+// klexer scans the sourcefile and returns tokens on the channel c.
+func klexer(s *scan, c chan lex) {
+	var l lex
+	str := "" // Hold the current read text
+	commt := false
+	key := true
+	x, err := s.tokenText()
+	defer close(c)
+	for err == nil {
+		l.column = s.position.Column
+		l.line = s.position.Line
+		switch x {
+		case ':':
+			if commt {
+				break
+			}
+			l.token = str
+			if key {
+				l.value = zKey
+				c <- l
+				// Next token is a space, eat it
+				s.tokenText()
+				key = false
+				str = ""
+			} else {
+				l.value = zValue
+			}
+		case ';':
+			commt = true
+		case '\n':
+			if commt {
+				// Reset a comment
+				commt = false
+			}
+			l.value = zValue
+			l.token = str
+			c <- l
+			str = ""
+			commt = false
+			key = true
+		default:
+			if commt {
+				break
+			}
+			str += string(x)
+		}
+		x, err = s.tokenText()
+	}
+	if len(str) > 0 {
+		// Send remainder
+		l.token = str
+		l.value = zValue
+		c <- l
+	}
+}
diff --git a/vendor/github.com/miekg/dns/dnssec_privkey.go b/vendor/github.com/miekg/dns/dnssec_privkey.go
new file mode 100644
index 000000000..56f3ea934
--- /dev/null
+++ b/vendor/github.com/miekg/dns/dnssec_privkey.go
@@ -0,0 +1,85 @@
+package dns
+
+import (
+	"crypto"
+	"crypto/dsa"
+	"crypto/ecdsa"
+	"crypto/rsa"
+	"math/big"
+	"strconv"
+)
+
+const format = "Private-key-format: v1.3\n"
+
+// PrivateKeyString converts a PrivateKey to a string. This string has the same
+// format as the private-key-file of BIND9 (Private-key-format: v1.3).
+// It needs some info from the key (the algorithm), so its a method of the DNSKEY
+// It supports rsa.PrivateKey, ecdsa.PrivateKey and dsa.PrivateKey
+func (r *DNSKEY) PrivateKeyString(p crypto.PrivateKey) string {
+	algorithm := strconv.Itoa(int(r.Algorithm))
+	algorithm += " (" + AlgorithmToString[r.Algorithm] + ")"
+
+	switch p := p.(type) {
+	case *rsa.PrivateKey:
+		modulus := toBase64(p.PublicKey.N.Bytes())
+		e := big.NewInt(int64(p.PublicKey.E))
+		publicExponent := toBase64(e.Bytes())
+		privateExponent := toBase64(p.D.Bytes())
+		prime1 := toBase64(p.Primes[0].Bytes())
+		prime2 := toBase64(p.Primes[1].Bytes())
+		// Calculate Exponent1/2 and Coefficient as per: http://en.wikipedia.org/wiki/RSA#Using_the_Chinese_remainder_algorithm
+		// and from: http://code.google.com/p/go/issues/detail?id=987
+		one := big.NewInt(1)
+		p1 := big.NewInt(0).Sub(p.Primes[0], one)
+		q1 := big.NewInt(0).Sub(p.Primes[1], one)
+		exp1 := big.NewInt(0).Mod(p.D, p1)
+		exp2 := big.NewInt(0).Mod(p.D, q1)
+		coeff := big.NewInt(0).ModInverse(p.Primes[1], p.Primes[0])
+
+		exponent1 := toBase64(exp1.Bytes())
+		exponent2 := toBase64(exp2.Bytes())
+		coefficient := toBase64(coeff.Bytes())
+
+		return format +
+			"Algorithm: " + algorithm + "\n" +
+			"Modulus: " + modulus + "\n" +
+			"PublicExponent: " + publicExponent + "\n" +
+			"PrivateExponent: " + privateExponent + "\n" +
+			"Prime1: " + prime1 + "\n" +
+			"Prime2: " + prime2 + "\n" +
+			"Exponent1: " + exponent1 + "\n" +
+			"Exponent2: " + exponent2 + "\n" +
+			"Coefficient: " + coefficient + "\n"
+
+	case *ecdsa.PrivateKey:
+		var intlen int
+		switch r.Algorithm {
+		case ECDSAP256SHA256:
+			intlen = 32
+		case ECDSAP384SHA384:
+			intlen = 48
+		}
+		private := toBase64(intToBytes(p.D, intlen))
+		return format +
+			"Algorithm: " + algorithm + "\n" +
+			"PrivateKey: " + private + "\n"
+
+	case *dsa.PrivateKey:
+		T := divRoundUp(divRoundUp(p.PublicKey.Parameters.G.BitLen(), 8)-64, 8)
+		prime := toBase64(intToBytes(p.PublicKey.Parameters.P, 64+T*8))
+		subprime := toBase64(intToBytes(p.PublicKey.Parameters.Q, 20))
+		base := toBase64(intToBytes(p.PublicKey.Parameters.G, 64+T*8))
+		priv := toBase64(intToBytes(p.X, 20))
+		pub := toBase64(intToBytes(p.PublicKey.Y, 64+T*8))
+		return format +
+			"Algorithm: " + algorithm + "\n" +
+			"Prime(p): " + prime + "\n" +
+			"Subprime(q): " + subprime + "\n" +
+			"Base(g): " + base + "\n" +
+			"Private_value(x): " + priv + "\n" +
+			"Public_value(y): " + pub + "\n"
+
+	default:
+		return ""
+	}
+}
diff --git a/vendor/github.com/miekg/dns/doc.go b/vendor/github.com/miekg/dns/doc.go
new file mode 100644
index 000000000..e38753d7d
--- /dev/null
+++ b/vendor/github.com/miekg/dns/doc.go
@@ -0,0 +1,251 @@
+/*
+Package dns implements a full featured interface to the Domain Name System.
+Server- and client-side programming is supported.
+The package allows complete control over what is send out to the DNS. The package
+API follows the less-is-more principle, by presenting a small, clean interface.
+
+The package dns supports (asynchronous) querying/replying, incoming/outgoing zone transfers,
+TSIG, EDNS0, dynamic updates, notifies and DNSSEC validation/signing.
+Note that domain names MUST be fully qualified, before sending them, unqualified
+names in a message will result in a packing failure.
+
+Resource records are native types. They are not stored in wire format.
+Basic usage pattern for creating a new resource record:
+
+     r := new(dns.MX)
+     r.Hdr = dns.RR_Header{Name: "miek.nl.", Rrtype: dns.TypeMX,
+	Class: dns.ClassINET, Ttl: 3600}
+     r.Preference = 10
+     r.Mx = "mx.miek.nl."
+
+Or directly from a string:
+
+     mx, err := dns.NewRR("miek.nl. 3600 IN MX 10 mx.miek.nl.")
+
+Or when the default TTL (3600) and class (IN) suit you:
+
+     mx, err := dns.NewRR("miek.nl. MX 10 mx.miek.nl.")
+
+Or even:
+
+     mx, err := dns.NewRR("$ORIGIN nl.\nmiek 1H IN MX 10 mx.miek")
+
+In the DNS messages are exchanged, these messages contain resource
+records (sets).  Use pattern for creating a message:
+
+     m := new(dns.Msg)
+     m.SetQuestion("miek.nl.", dns.TypeMX)
+
+Or when not certain if the domain name is fully qualified:
+
+	m.SetQuestion(dns.Fqdn("miek.nl"), dns.TypeMX)
+
+The message m is now a message with the question section set to ask
+the MX records for the miek.nl. zone.
+
+The following is slightly more verbose, but more flexible:
+
+     m1 := new(dns.Msg)
+     m1.Id = dns.Id()
+     m1.RecursionDesired = true
+     m1.Question = make([]dns.Question, 1)
+     m1.Question[0] = dns.Question{"miek.nl.", dns.TypeMX, dns.ClassINET}
+
+After creating a message it can be send.
+Basic use pattern for synchronous querying the DNS at a
+server configured on 127.0.0.1 and port 53:
+
+     c := new(dns.Client)
+     in, rtt, err := c.Exchange(m1, "127.0.0.1:53")
+
+Suppressing multiple outstanding queries (with the same question, type and
+class) is as easy as setting:
+
+	c.SingleInflight = true
+
+If these "advanced" features are not needed, a simple UDP query can be send,
+with:
+
+	in, err := dns.Exchange(m1, "127.0.0.1:53")
+
+When this functions returns you will get dns message. A dns message consists
+out of four sections.
+The question section: in.Question, the answer section: in.Answer,
+the authority section: in.Ns and the additional section: in.Extra.
+
+Each of these sections (except the Question section) contain a []RR. Basic
+use pattern for accessing the rdata of a TXT RR as the first RR in
+the Answer section:
+
+	if t, ok := in.Answer[0].(*dns.TXT); ok {
+		// do something with t.Txt
+	}
+
+Domain Name and TXT Character String Representations
+
+Both domain names and TXT character strings are converted to presentation
+form both when unpacked and when converted to strings.
+
+For TXT character strings, tabs, carriage returns and line feeds will be
+converted to \t, \r and \n respectively. Back slashes and quotations marks
+will be escaped. Bytes below 32 and above 127 will be converted to \DDD
+form.
+
+For domain names, in addition to the above rules brackets, periods,
+spaces, semicolons and the at symbol are escaped.
+
+DNSSEC
+
+DNSSEC (DNS Security Extension) adds a layer of security to the DNS. It
+uses public key cryptography to sign resource records. The
+public keys are stored in DNSKEY records and the signatures in RRSIG records.
+
+Requesting DNSSEC information for a zone is done by adding the DO (DNSSEC OK) bit
+to a request.
+
+     m := new(dns.Msg)
+     m.SetEdns0(4096, true)
+
+Signature generation, signature verification and key generation are all supported.
+
+DYNAMIC UPDATES
+
+Dynamic updates reuses the DNS message format, but renames three of
+the sections. Question is Zone, Answer is Prerequisite, Authority is
+Update, only the Additional is not renamed. See RFC 2136 for the gory details.
+
+You can set a rather complex set of rules for the existence of absence of
+certain resource records or names in a zone to specify if resource records
+should be added or removed. The table from RFC 2136 supplemented with the Go
+DNS function shows which functions exist to specify the prerequisites.
+
+ 3.2.4 - Table Of Metavalues Used In Prerequisite Section
+
+  CLASS    TYPE     RDATA    Meaning                    Function
+  --------------------------------------------------------------
+  ANY      ANY      empty    Name is in use             dns.NameUsed
+  ANY      rrset    empty    RRset exists (value indep) dns.RRsetUsed
+  NONE     ANY      empty    Name is not in use         dns.NameNotUsed
+  NONE     rrset    empty    RRset does not exist       dns.RRsetNotUsed
+  zone     rrset    rr       RRset exists (value dep)   dns.Used
+
+The prerequisite section can also be left empty.
+If you have decided on the prerequisites you can tell what RRs should
+be added or deleted. The next table shows the options you have and
+what functions to call.
+
+ 3.4.2.6 - Table Of Metavalues Used In Update Section
+
+  CLASS    TYPE     RDATA    Meaning                     Function
+  ---------------------------------------------------------------
+  ANY      ANY      empty    Delete all RRsets from name dns.RemoveName
+  ANY      rrset    empty    Delete an RRset             dns.RemoveRRset
+  NONE     rrset    rr       Delete an RR from RRset     dns.Remove
+  zone     rrset    rr       Add to an RRset             dns.Insert
+
+TRANSACTION SIGNATURE
+
+An TSIG or transaction signature adds a HMAC TSIG record to each message sent.
+The supported algorithms include: HmacMD5, HmacSHA1, HmacSHA256 and HmacSHA512.
+
+Basic use pattern when querying with a TSIG name "axfr." (note that these key names
+must be fully qualified - as they are domain names) and the base64 secret
+"so6ZGir4GPAqINNh9U5c3A==":
+
+	c := new(dns.Client)
+	c.TsigSecret = map[string]string{"axfr.": "so6ZGir4GPAqINNh9U5c3A=="}
+	m := new(dns.Msg)
+	m.SetQuestion("miek.nl.", dns.TypeMX)
+	m.SetTsig("axfr.", dns.HmacMD5, 300, time.Now().Unix())
+	...
+	// When sending the TSIG RR is calculated and filled in before sending
+
+When requesting an zone transfer (almost all TSIG usage is when requesting zone transfers), with
+TSIG, this is the basic use pattern. In this example we request an AXFR for
+miek.nl. with TSIG key named "axfr." and secret "so6ZGir4GPAqINNh9U5c3A=="
+and using the server 176.58.119.54:
+
+	t := new(dns.Transfer)
+	m := new(dns.Msg)
+	t.TsigSecret = map[string]string{"axfr.": "so6ZGir4GPAqINNh9U5c3A=="}
+	m.SetAxfr("miek.nl.")
+	m.SetTsig("axfr.", dns.HmacMD5, 300, time.Now().Unix())
+	c, err := t.In(m, "176.58.119.54:53")
+	for r := range c { ... }
+
+You can now read the records from the transfer as they come in. Each envelope is checked with TSIG.
+If something is not correct an error is returned.
+
+Basic use pattern validating and replying to a message that has TSIG set.
+
+	server := &dns.Server{Addr: ":53", Net: "udp"}
+	server.TsigSecret = map[string]string{"axfr.": "so6ZGir4GPAqINNh9U5c3A=="}
+	go server.ListenAndServe()
+	dns.HandleFunc(".", handleRequest)
+
+	func handleRequest(w dns.ResponseWriter, r *dns.Msg) {
+		m := new(dns.Msg)
+		m.SetReply(r)
+		if r.IsTsig() != nil {
+			if w.TsigStatus() == nil {
+				// *Msg r has an TSIG record and it was validated
+				m.SetTsig("axfr.", dns.HmacMD5, 300, time.Now().Unix())
+			} else {
+				// *Msg r has an TSIG records and it was not valided
+			}
+		}
+		w.WriteMsg(m)
+	}
+
+PRIVATE RRS
+
+RFC 6895 sets aside a range of type codes for private use. This range
+is 65,280 - 65,534 (0xFF00 - 0xFFFE). When experimenting with new Resource Records these
+can be used, before requesting an official type code from IANA.
+
+see http://miek.nl/2014/September/21/idn-and-private-rr-in-go-dns/ for more
+information.
+
+EDNS0
+
+EDNS0 is an extension mechanism for the DNS defined in RFC 2671 and updated
+by RFC 6891. It defines an new RR type, the OPT RR, which is then completely
+abused.
+Basic use pattern for creating an (empty) OPT RR:
+
+	o := new(dns.OPT)
+	o.Hdr.Name = "." // MUST be the root zone, per definition.
+	o.Hdr.Rrtype = dns.TypeOPT
+
+The rdata of an OPT RR consists out of a slice of EDNS0 (RFC 6891)
+interfaces. Currently only a few have been standardized: EDNS0_NSID
+(RFC 5001) and EDNS0_SUBNET (draft-vandergaast-edns-client-subnet-02). Note
+that these options may be combined in an OPT RR.
+Basic use pattern for a server to check if (and which) options are set:
+
+	// o is a dns.OPT
+	for _, s := range o.Option {
+		switch e := s.(type) {
+		case *dns.EDNS0_NSID:
+			// do stuff with e.Nsid
+		case *dns.EDNS0_SUBNET:
+			// access e.Family, e.Address, etc.
+		}
+	}
+
+SIG(0)
+
+From RFC 2931:
+
+    SIG(0) provides protection for DNS transactions and requests ....
+    ... protection for glue records, DNS requests, protection for message headers
+    on requests and responses, and protection of the overall integrity of a response.
+
+It works like TSIG, except that SIG(0) uses public key cryptography, instead of the shared
+secret approach in TSIG.
+Supported algorithms: DSA, ECDSAP256SHA256, ECDSAP384SHA384, RSASHA1, RSASHA256 and
+RSASHA512.
+
+Signing subsequent messages in multi-message sessions is not implemented.
+*/
+package dns
diff --git a/vendor/github.com/miekg/dns/edns.go b/vendor/github.com/miekg/dns/edns.go
new file mode 100644
index 000000000..fc0b46925
--- /dev/null
+++ b/vendor/github.com/miekg/dns/edns.go
@@ -0,0 +1,597 @@
+package dns
+
+import (
+	"encoding/binary"
+	"encoding/hex"
+	"errors"
+	"fmt"
+	"net"
+	"strconv"
+)
+
+// EDNS0 Option codes.
+const (
+	EDNS0LLQ          = 0x1     // long lived queries: http://tools.ietf.org/html/draft-sekar-dns-llq-01
+	EDNS0UL           = 0x2     // update lease draft: http://files.dns-sd.org/draft-sekar-dns-ul.txt
+	EDNS0NSID         = 0x3     // nsid (RFC5001)
+	EDNS0DAU          = 0x5     // DNSSEC Algorithm Understood
+	EDNS0DHU          = 0x6     // DS Hash Understood
+	EDNS0N3U          = 0x7     // NSEC3 Hash Understood
+	EDNS0SUBNET       = 0x8     // client-subnet (RFC6891)
+	EDNS0EXPIRE       = 0x9     // EDNS0 expire
+	EDNS0COOKIE       = 0xa     // EDNS0 Cookie
+	EDNS0TCPKEEPALIVE = 0xb     // EDNS0 tcp keep alive (RFC7828)
+	EDNS0SUBNETDRAFT  = 0x50fa  // Don't use! Use EDNS0SUBNET
+	EDNS0LOCALSTART   = 0xFDE9  // Beginning of range reserved for local/experimental use (RFC6891)
+	EDNS0LOCALEND     = 0xFFFE  // End of range reserved for local/experimental use (RFC6891)
+	_DO               = 1 << 15 // dnssec ok
+)
+
+// OPT is the EDNS0 RR appended to messages to convey extra (meta) information.
+// See RFC 6891.
+type OPT struct {
+	Hdr    RR_Header
+	Option []EDNS0 `dns:"opt"`
+}
+
+func (rr *OPT) String() string {
+	s := "\n;; OPT PSEUDOSECTION:\n; EDNS: version " + strconv.Itoa(int(rr.Version())) + "; "
+	if rr.Do() {
+		s += "flags: do; "
+	} else {
+		s += "flags: ; "
+	}
+	s += "udp: " + strconv.Itoa(int(rr.UDPSize()))
+
+	for _, o := range rr.Option {
+		switch o.(type) {
+		case *EDNS0_NSID:
+			s += "\n; NSID: " + o.String()
+			h, e := o.pack()
+			var r string
+			if e == nil {
+				for _, c := range h {
+					r += "(" + string(c) + ")"
+				}
+				s += "  " + r
+			}
+		case *EDNS0_SUBNET:
+			s += "\n; SUBNET: " + o.String()
+			if o.(*EDNS0_SUBNET).DraftOption {
+				s += " (draft)"
+			}
+		case *EDNS0_COOKIE:
+			s += "\n; COOKIE: " + o.String()
+		case *EDNS0_UL:
+			s += "\n; UPDATE LEASE: " + o.String()
+		case *EDNS0_LLQ:
+			s += "\n; LONG LIVED QUERIES: " + o.String()
+		case *EDNS0_DAU:
+			s += "\n; DNSSEC ALGORITHM UNDERSTOOD: " + o.String()
+		case *EDNS0_DHU:
+			s += "\n; DS HASH UNDERSTOOD: " + o.String()
+		case *EDNS0_N3U:
+			s += "\n; NSEC3 HASH UNDERSTOOD: " + o.String()
+		case *EDNS0_LOCAL:
+			s += "\n; LOCAL OPT: " + o.String()
+		}
+	}
+	return s
+}
+
+func (rr *OPT) len() int {
+	l := rr.Hdr.len()
+	for i := 0; i < len(rr.Option); i++ {
+		l += 4 // Account for 2-byte option code and 2-byte option length.
+		lo, _ := rr.Option[i].pack()
+		l += len(lo)
+	}
+	return l
+}
+
+// return the old value -> delete SetVersion?
+
+// Version returns the EDNS version used. Only zero is defined.
+func (rr *OPT) Version() uint8 {
+	return uint8((rr.Hdr.Ttl & 0x00FF0000) >> 16)
+}
+
+// SetVersion sets the version of EDNS. This is usually zero.
+func (rr *OPT) SetVersion(v uint8) {
+	rr.Hdr.Ttl = rr.Hdr.Ttl&0xFF00FFFF | (uint32(v) << 16)
+}
+
+// ExtendedRcode returns the EDNS extended RCODE field (the upper 8 bits of the TTL).
+func (rr *OPT) ExtendedRcode() int {
+	return int((rr.Hdr.Ttl&0xFF000000)>>24) + 15
+}
+
+// SetExtendedRcode sets the EDNS extended RCODE field.
+func (rr *OPT) SetExtendedRcode(v uint8) {
+	if v < RcodeBadVers { // Smaller than 16.. Use the 4 bits you have!
+		return
+	}
+	rr.Hdr.Ttl = rr.Hdr.Ttl&0x00FFFFFF | (uint32(v-15) << 24)
+}
+
+// UDPSize returns the UDP buffer size.
+func (rr *OPT) UDPSize() uint16 {
+	return rr.Hdr.Class
+}
+
+// SetUDPSize sets the UDP buffer size.
+func (rr *OPT) SetUDPSize(size uint16) {
+	rr.Hdr.Class = size
+}
+
+// Do returns the value of the DO (DNSSEC OK) bit.
+func (rr *OPT) Do() bool {
+	return rr.Hdr.Ttl&_DO == _DO
+}
+
+// SetDo sets the DO (DNSSEC OK) bit.
+// If we pass an argument, set the DO bit to that value.
+// It is possible to pass 2 or more arguments. Any arguments after the 1st is silently ignored.
+func (rr *OPT) SetDo(do ...bool) {
+	if len(do) == 1 {
+		if do[0] {
+			rr.Hdr.Ttl |= _DO
+		} else {
+			rr.Hdr.Ttl &^= _DO
+		}
+	} else {
+		rr.Hdr.Ttl |= _DO
+	}
+}
+
+// EDNS0 defines an EDNS0 Option. An OPT RR can have multiple options appended to it.
+type EDNS0 interface {
+	// Option returns the option code for the option.
+	Option() uint16
+	// pack returns the bytes of the option data.
+	pack() ([]byte, error)
+	// unpack sets the data as found in the buffer. Is also sets
+	// the length of the slice as the length of the option data.
+	unpack([]byte) error
+	// String returns the string representation of the option.
+	String() string
+}
+
+// The nsid EDNS0 option is used to retrieve a nameserver
+// identifier. When sending a request Nsid must be set to the empty string
+// The identifier is an opaque string encoded as hex.
+// Basic use pattern for creating an nsid option:
+//
+//	o := new(dns.OPT)
+//	o.Hdr.Name = "."
+//	o.Hdr.Rrtype = dns.TypeOPT
+//	e := new(dns.EDNS0_NSID)
+//	e.Code = dns.EDNS0NSID
+//	e.Nsid = "AA"
+//	o.Option = append(o.Option, e)
+type EDNS0_NSID struct {
+	Code uint16 // Always EDNS0NSID
+	Nsid string // This string needs to be hex encoded
+}
+
+func (e *EDNS0_NSID) pack() ([]byte, error) {
+	h, err := hex.DecodeString(e.Nsid)
+	if err != nil {
+		return nil, err
+	}
+	return h, nil
+}
+
+func (e *EDNS0_NSID) Option() uint16        { return EDNS0NSID }
+func (e *EDNS0_NSID) unpack(b []byte) error { e.Nsid = hex.EncodeToString(b); return nil }
+func (e *EDNS0_NSID) String() string        { return string(e.Nsid) }
+
+// EDNS0_SUBNET is the subnet option that is used to give the remote nameserver
+// an idea of where the client lives. It can then give back a different
+// answer depending on the location or network topology.
+// Basic use pattern for creating an subnet option:
+//
+//	o := new(dns.OPT)
+//	o.Hdr.Name = "."
+//	o.Hdr.Rrtype = dns.TypeOPT
+//	e := new(dns.EDNS0_SUBNET)
+//	e.Code = dns.EDNS0SUBNET
+//	e.Family = 1	// 1 for IPv4 source address, 2 for IPv6
+//	e.NetMask = 32	// 32 for IPV4, 128 for IPv6
+//	e.SourceScope = 0
+//	e.Address = net.ParseIP("127.0.0.1").To4()	// for IPv4
+//	// e.Address = net.ParseIP("2001:7b8:32a::2")	// for IPV6
+//	o.Option = append(o.Option, e)
+//
+// Note: the spec (draft-ietf-dnsop-edns-client-subnet-00) has some insane logic
+// for which netmask applies to the address. This code will parse all the
+// available bits when unpacking (up to optlen). When packing it will apply
+// SourceNetmask. If you need more advanced logic, patches welcome and good luck.
+type EDNS0_SUBNET struct {
+	Code          uint16 // Always EDNS0SUBNET
+	Family        uint16 // 1 for IP, 2 for IP6
+	SourceNetmask uint8
+	SourceScope   uint8
+	Address       net.IP
+	DraftOption   bool // Set to true if using the old (0x50fa) option code
+}
+
+func (e *EDNS0_SUBNET) Option() uint16 {
+	if e.DraftOption {
+		return EDNS0SUBNETDRAFT
+	}
+	return EDNS0SUBNET
+}
+
+func (e *EDNS0_SUBNET) pack() ([]byte, error) {
+	b := make([]byte, 4)
+	binary.BigEndian.PutUint16(b[0:], e.Family)
+	b[2] = e.SourceNetmask
+	b[3] = e.SourceScope
+	switch e.Family {
+	case 1:
+		if e.SourceNetmask > net.IPv4len*8 {
+			return nil, errors.New("dns: bad netmask")
+		}
+		if len(e.Address.To4()) != net.IPv4len {
+			return nil, errors.New("dns: bad address")
+		}
+		ip := e.Address.To4().Mask(net.CIDRMask(int(e.SourceNetmask), net.IPv4len*8))
+		needLength := (e.SourceNetmask + 8 - 1) / 8 // division rounding up
+		b = append(b, ip[:needLength]...)
+	case 2:
+		if e.SourceNetmask > net.IPv6len*8 {
+			return nil, errors.New("dns: bad netmask")
+		}
+		if len(e.Address) != net.IPv6len {
+			return nil, errors.New("dns: bad address")
+		}
+		ip := e.Address.Mask(net.CIDRMask(int(e.SourceNetmask), net.IPv6len*8))
+		needLength := (e.SourceNetmask + 8 - 1) / 8 // division rounding up
+		b = append(b, ip[:needLength]...)
+	default:
+		return nil, errors.New("dns: bad address family")
+	}
+	return b, nil
+}
+
+func (e *EDNS0_SUBNET) unpack(b []byte) error {
+	if len(b) < 4 {
+		return ErrBuf
+	}
+	e.Family = binary.BigEndian.Uint16(b)
+	e.SourceNetmask = b[2]
+	e.SourceScope = b[3]
+	switch e.Family {
+	case 1:
+		if e.SourceNetmask > net.IPv4len*8 || e.SourceScope > net.IPv4len*8 {
+			return errors.New("dns: bad netmask")
+		}
+		addr := make([]byte, net.IPv4len)
+		for i := 0; i < net.IPv4len && 4+i < len(b); i++ {
+			addr[i] = b[4+i]
+		}
+		e.Address = net.IPv4(addr[0], addr[1], addr[2], addr[3])
+	case 2:
+		if e.SourceNetmask > net.IPv6len*8 || e.SourceScope > net.IPv6len*8 {
+			return errors.New("dns: bad netmask")
+		}
+		addr := make([]byte, net.IPv6len)
+		for i := 0; i < net.IPv6len && 4+i < len(b); i++ {
+			addr[i] = b[4+i]
+		}
+		e.Address = net.IP{addr[0], addr[1], addr[2], addr[3], addr[4],
+			addr[5], addr[6], addr[7], addr[8], addr[9], addr[10],
+			addr[11], addr[12], addr[13], addr[14], addr[15]}
+	default:
+		return errors.New("dns: bad address family")
+	}
+	return nil
+}
+
+func (e *EDNS0_SUBNET) String() (s string) {
+	if e.Address == nil {
+		s = "<nil>"
+	} else if e.Address.To4() != nil {
+		s = e.Address.String()
+	} else {
+		s = "[" + e.Address.String() + "]"
+	}
+	s += "/" + strconv.Itoa(int(e.SourceNetmask)) + "/" + strconv.Itoa(int(e.SourceScope))
+	return
+}
+
+// The Cookie EDNS0 option
+//
+//	o := new(dns.OPT)
+//	o.Hdr.Name = "."
+//	o.Hdr.Rrtype = dns.TypeOPT
+//	e := new(dns.EDNS0_COOKIE)
+//	e.Code = dns.EDNS0COOKIE
+//	e.Cookie = "24a5ac.."
+//	o.Option = append(o.Option, e)
+//
+// The Cookie field consists out of a client cookie (RFC 7873 Section 4), that is
+// always 8 bytes. It may then optionally be followed by the server cookie. The server
+// cookie is of variable length, 8 to a maximum of 32 bytes. In other words:
+//
+//	cCookie := o.Cookie[:16]
+//	sCookie := o.Cookie[16:]
+//
+// There is no guarantee that the Cookie string has a specific length.
+type EDNS0_COOKIE struct {
+	Code   uint16 // Always EDNS0COOKIE
+	Cookie string // Hex-encoded cookie data
+}
+
+func (e *EDNS0_COOKIE) pack() ([]byte, error) {
+	h, err := hex.DecodeString(e.Cookie)
+	if err != nil {
+		return nil, err
+	}
+	return h, nil
+}
+
+func (e *EDNS0_COOKIE) Option() uint16        { return EDNS0COOKIE }
+func (e *EDNS0_COOKIE) unpack(b []byte) error { e.Cookie = hex.EncodeToString(b); return nil }
+func (e *EDNS0_COOKIE) String() string        { return e.Cookie }
+
+// The EDNS0_UL (Update Lease) (draft RFC) option is used to tell the server to set
+// an expiration on an update RR. This is helpful for clients that cannot clean
+// up after themselves. This is a draft RFC and more information can be found at
+// http://files.dns-sd.org/draft-sekar-dns-ul.txt
+//
+//	o := new(dns.OPT)
+//	o.Hdr.Name = "."
+//	o.Hdr.Rrtype = dns.TypeOPT
+//	e := new(dns.EDNS0_UL)
+//	e.Code = dns.EDNS0UL
+//	e.Lease = 120 // in seconds
+//	o.Option = append(o.Option, e)
+type EDNS0_UL struct {
+	Code  uint16 // Always EDNS0UL
+	Lease uint32
+}
+
+func (e *EDNS0_UL) Option() uint16 { return EDNS0UL }
+func (e *EDNS0_UL) String() string { return strconv.FormatUint(uint64(e.Lease), 10) }
+
+// Copied: http://golang.org/src/pkg/net/dnsmsg.go
+func (e *EDNS0_UL) pack() ([]byte, error) {
+	b := make([]byte, 4)
+	binary.BigEndian.PutUint32(b, e.Lease)
+	return b, nil
+}
+
+func (e *EDNS0_UL) unpack(b []byte) error {
+	if len(b) < 4 {
+		return ErrBuf
+	}
+	e.Lease = binary.BigEndian.Uint32(b)
+	return nil
+}
+
+// EDNS0_LLQ stands for Long Lived Queries: http://tools.ietf.org/html/draft-sekar-dns-llq-01
+// Implemented for completeness, as the EDNS0 type code is assigned.
+type EDNS0_LLQ struct {
+	Code      uint16 // Always EDNS0LLQ
+	Version   uint16
+	Opcode    uint16
+	Error     uint16
+	Id        uint64
+	LeaseLife uint32
+}
+
+func (e *EDNS0_LLQ) Option() uint16 { return EDNS0LLQ }
+
+func (e *EDNS0_LLQ) pack() ([]byte, error) {
+	b := make([]byte, 18)
+	binary.BigEndian.PutUint16(b[0:], e.Version)
+	binary.BigEndian.PutUint16(b[2:], e.Opcode)
+	binary.BigEndian.PutUint16(b[4:], e.Error)
+	binary.BigEndian.PutUint64(b[6:], e.Id)
+	binary.BigEndian.PutUint32(b[14:], e.LeaseLife)
+	return b, nil
+}
+
+func (e *EDNS0_LLQ) unpack(b []byte) error {
+	if len(b) < 18 {
+		return ErrBuf
+	}
+	e.Version = binary.BigEndian.Uint16(b[0:])
+	e.Opcode = binary.BigEndian.Uint16(b[2:])
+	e.Error = binary.BigEndian.Uint16(b[4:])
+	e.Id = binary.BigEndian.Uint64(b[6:])
+	e.LeaseLife = binary.BigEndian.Uint32(b[14:])
+	return nil
+}
+
+func (e *EDNS0_LLQ) String() string {
+	s := strconv.FormatUint(uint64(e.Version), 10) + " " + strconv.FormatUint(uint64(e.Opcode), 10) +
+		" " + strconv.FormatUint(uint64(e.Error), 10) + " " + strconv.FormatUint(uint64(e.Id), 10) +
+		" " + strconv.FormatUint(uint64(e.LeaseLife), 10)
+	return s
+}
+
+type EDNS0_DAU struct {
+	Code    uint16 // Always EDNS0DAU
+	AlgCode []uint8
+}
+
+func (e *EDNS0_DAU) Option() uint16        { return EDNS0DAU }
+func (e *EDNS0_DAU) pack() ([]byte, error) { return e.AlgCode, nil }
+func (e *EDNS0_DAU) unpack(b []byte) error { e.AlgCode = b; return nil }
+
+func (e *EDNS0_DAU) String() string {
+	s := ""
+	for i := 0; i < len(e.AlgCode); i++ {
+		if a, ok := AlgorithmToString[e.AlgCode[i]]; ok {
+			s += " " + a
+		} else {
+			s += " " + strconv.Itoa(int(e.AlgCode[i]))
+		}
+	}
+	return s
+}
+
+type EDNS0_DHU struct {
+	Code    uint16 // Always EDNS0DHU
+	AlgCode []uint8
+}
+
+func (e *EDNS0_DHU) Option() uint16        { return EDNS0DHU }
+func (e *EDNS0_DHU) pack() ([]byte, error) { return e.AlgCode, nil }
+func (e *EDNS0_DHU) unpack(b []byte) error { e.AlgCode = b; return nil }
+
+func (e *EDNS0_DHU) String() string {
+	s := ""
+	for i := 0; i < len(e.AlgCode); i++ {
+		if a, ok := HashToString[e.AlgCode[i]]; ok {
+			s += " " + a
+		} else {
+			s += " " + strconv.Itoa(int(e.AlgCode[i]))
+		}
+	}
+	return s
+}
+
+type EDNS0_N3U struct {
+	Code    uint16 // Always EDNS0N3U
+	AlgCode []uint8
+}
+
+func (e *EDNS0_N3U) Option() uint16        { return EDNS0N3U }
+func (e *EDNS0_N3U) pack() ([]byte, error) { return e.AlgCode, nil }
+func (e *EDNS0_N3U) unpack(b []byte) error { e.AlgCode = b; return nil }
+
+func (e *EDNS0_N3U) String() string {
+	// Re-use the hash map
+	s := ""
+	for i := 0; i < len(e.AlgCode); i++ {
+		if a, ok := HashToString[e.AlgCode[i]]; ok {
+			s += " " + a
+		} else {
+			s += " " + strconv.Itoa(int(e.AlgCode[i]))
+		}
+	}
+	return s
+}
+
+type EDNS0_EXPIRE struct {
+	Code   uint16 // Always EDNS0EXPIRE
+	Expire uint32
+}
+
+func (e *EDNS0_EXPIRE) Option() uint16 { return EDNS0EXPIRE }
+func (e *EDNS0_EXPIRE) String() string { return strconv.FormatUint(uint64(e.Expire), 10) }
+
+func (e *EDNS0_EXPIRE) pack() ([]byte, error) {
+	b := make([]byte, 4)
+	b[0] = byte(e.Expire >> 24)
+	b[1] = byte(e.Expire >> 16)
+	b[2] = byte(e.Expire >> 8)
+	b[3] = byte(e.Expire)
+	return b, nil
+}
+
+func (e *EDNS0_EXPIRE) unpack(b []byte) error {
+	if len(b) < 4 {
+		return ErrBuf
+	}
+	e.Expire = binary.BigEndian.Uint32(b)
+	return nil
+}
+
+// The EDNS0_LOCAL option is used for local/experimental purposes. The option
+// code is recommended to be within the range [EDNS0LOCALSTART, EDNS0LOCALEND]
+// (RFC6891), although any unassigned code can actually be used.  The content of
+// the option is made available in Data, unaltered.
+// Basic use pattern for creating a local option:
+//
+//	o := new(dns.OPT)
+//	o.Hdr.Name = "."
+//	o.Hdr.Rrtype = dns.TypeOPT
+//	e := new(dns.EDNS0_LOCAL)
+//	e.Code = dns.EDNS0LOCALSTART
+//	e.Data = []byte{72, 82, 74}
+//	o.Option = append(o.Option, e)
+type EDNS0_LOCAL struct {
+	Code uint16
+	Data []byte
+}
+
+func (e *EDNS0_LOCAL) Option() uint16 { return e.Code }
+func (e *EDNS0_LOCAL) String() string {
+	return strconv.FormatInt(int64(e.Code), 10) + ":0x" + hex.EncodeToString(e.Data)
+}
+
+func (e *EDNS0_LOCAL) pack() ([]byte, error) {
+	b := make([]byte, len(e.Data))
+	copied := copy(b, e.Data)
+	if copied != len(e.Data) {
+		return nil, ErrBuf
+	}
+	return b, nil
+}
+
+func (e *EDNS0_LOCAL) unpack(b []byte) error {
+	e.Data = make([]byte, len(b))
+	copied := copy(e.Data, b)
+	if copied != len(b) {
+		return ErrBuf
+	}
+	return nil
+}
+
+type EDNS0_TCP_KEEPALIVE struct {
+	Code    uint16 // Always EDNSTCPKEEPALIVE
+	Length  uint16 // the value 0 if the TIMEOUT is omitted, the value 2 if it is present;
+	Timeout uint16 // an idle timeout value for the TCP connection, specified in units of 100 milliseconds, encoded in network byte order.
+}
+
+func (e *EDNS0_TCP_KEEPALIVE) Option() uint16 {
+	return EDNS0TCPKEEPALIVE
+}
+
+func (e *EDNS0_TCP_KEEPALIVE) pack() ([]byte, error) {
+	if e.Timeout != 0 && e.Length != 2 {
+		return nil, errors.New("dns: timeout specified but length is not 2")
+	}
+	if e.Timeout == 0 && e.Length != 0 {
+		return nil, errors.New("dns: timeout not specified but length is not 0")
+	}
+	b := make([]byte, 4+e.Length)
+	binary.BigEndian.PutUint16(b[0:], e.Code)
+	binary.BigEndian.PutUint16(b[2:], e.Length)
+	if e.Length == 2 {
+		binary.BigEndian.PutUint16(b[4:], e.Timeout)
+	}
+	return b, nil
+}
+
+func (e *EDNS0_TCP_KEEPALIVE) unpack(b []byte) error {
+	if len(b) < 4 {
+		return ErrBuf
+	}
+	e.Length = binary.BigEndian.Uint16(b[2:4])
+	if e.Length != 0 && e.Length != 2 {
+		return errors.New("dns: length mismatch, want 0/2 but got " + strconv.FormatUint(uint64(e.Length), 10))
+	}
+	if e.Length == 2 {
+		if len(b) < 6 {
+			return ErrBuf
+		}
+		e.Timeout = binary.BigEndian.Uint16(b[4:6])
+	}
+	return nil
+}
+
+func (e *EDNS0_TCP_KEEPALIVE) String() (s string) {
+	s = "use tcp keep-alive"
+	if e.Length == 0 {
+		s += ", timeout omitted"
+	} else {
+		s += fmt.Sprintf(", timeout %dms", e.Timeout*100)
+	}
+	return
+}
diff --git a/vendor/github.com/miekg/dns/format.go b/vendor/github.com/miekg/dns/format.go
new file mode 100644
index 000000000..3f5303c20
--- /dev/null
+++ b/vendor/github.com/miekg/dns/format.go
@@ -0,0 +1,87 @@
+package dns
+
+import (
+	"net"
+	"reflect"
+	"strconv"
+)
+
+// NumField returns the number of rdata fields r has.
+func NumField(r RR) int {
+	return reflect.ValueOf(r).Elem().NumField() - 1 // Remove RR_Header
+}
+
+// Field returns the rdata field i as a string. Fields are indexed starting from 1.
+// RR types that holds slice data, for instance the NSEC type bitmap will return a single
+// string where the types are concatenated using a space.
+// Accessing non existing fields will cause a panic.
+func Field(r RR, i int) string {
+	if i == 0 {
+		return ""
+	}
+	d := reflect.ValueOf(r).Elem().Field(i)
+	switch k := d.Kind(); k {
+	case reflect.String:
+		return d.String()
+	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
+		return strconv.FormatInt(d.Int(), 10)
+	case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
+		return strconv.FormatUint(d.Uint(), 10)
+	case reflect.Slice:
+		switch reflect.ValueOf(r).Elem().Type().Field(i).Tag {
+		case `dns:"a"`:
+			// TODO(miek): Hmm store this as 16 bytes
+			if d.Len() < net.IPv6len {
+				return net.IPv4(byte(d.Index(0).Uint()),
+					byte(d.Index(1).Uint()),
+					byte(d.Index(2).Uint()),
+					byte(d.Index(3).Uint())).String()
+			}
+			return net.IPv4(byte(d.Index(12).Uint()),
+				byte(d.Index(13).Uint()),
+				byte(d.Index(14).Uint()),
+				byte(d.Index(15).Uint())).String()
+		case `dns:"aaaa"`:
+			return net.IP{
+				byte(d.Index(0).Uint()),
+				byte(d.Index(1).Uint()),
+				byte(d.Index(2).Uint()),
+				byte(d.Index(3).Uint()),
+				byte(d.Index(4).Uint()),
+				byte(d.Index(5).Uint()),
+				byte(d.Index(6).Uint()),
+				byte(d.Index(7).Uint()),
+				byte(d.Index(8).Uint()),
+				byte(d.Index(9).Uint()),
+				byte(d.Index(10).Uint()),
+				byte(d.Index(11).Uint()),
+				byte(d.Index(12).Uint()),
+				byte(d.Index(13).Uint()),
+				byte(d.Index(14).Uint()),
+				byte(d.Index(15).Uint()),
+			}.String()
+		case `dns:"nsec"`:
+			if d.Len() == 0 {
+				return ""
+			}
+			s := Type(d.Index(0).Uint()).String()
+			for i := 1; i < d.Len(); i++ {
+				s += " " + Type(d.Index(i).Uint()).String()
+			}
+			return s
+		default:
+			// if it does not have a tag its a string slice
+			fallthrough
+		case `dns:"txt"`:
+			if d.Len() == 0 {
+				return ""
+			}
+			s := d.Index(0).String()
+			for i := 1; i < d.Len(); i++ {
+				s += " " + d.Index(i).String()
+			}
+			return s
+		}
+	}
+	return ""
+}
diff --git a/vendor/github.com/miekg/dns/generate.go b/vendor/github.com/miekg/dns/generate.go
new file mode 100644
index 000000000..e4481a4b0
--- /dev/null
+++ b/vendor/github.com/miekg/dns/generate.go
@@ -0,0 +1,159 @@
+package dns
+
+import (
+	"bytes"
+	"errors"
+	"fmt"
+	"strconv"
+	"strings"
+)
+
+// Parse the $GENERATE statement as used in BIND9 zones.
+// See http://www.zytrax.com/books/dns/ch8/generate.html for instance.
+// We are called after '$GENERATE '. After which we expect:
+// * the range (12-24/2)
+// * lhs (ownername)
+// * [[ttl][class]]
+// * type
+// * rhs (rdata)
+// But we are lazy here, only the range is parsed *all* occurrences
+// of $ after that are interpreted.
+// Any error are returned as a string value, the empty string signals
+// "no error".
+func generate(l lex, c chan lex, t chan *Token, o string) string {
+	step := 1
+	if i := strings.IndexAny(l.token, "/"); i != -1 {
+		if i+1 == len(l.token) {
+			return "bad step in $GENERATE range"
+		}
+		if s, err := strconv.Atoi(l.token[i+1:]); err == nil {
+			if s < 0 {
+				return "bad step in $GENERATE range"
+			}
+			step = s
+		} else {
+			return "bad step in $GENERATE range"
+		}
+		l.token = l.token[:i]
+	}
+	sx := strings.SplitN(l.token, "-", 2)
+	if len(sx) != 2 {
+		return "bad start-stop in $GENERATE range"
+	}
+	start, err := strconv.Atoi(sx[0])
+	if err != nil {
+		return "bad start in $GENERATE range"
+	}
+	end, err := strconv.Atoi(sx[1])
+	if err != nil {
+		return "bad stop in $GENERATE range"
+	}
+	if end < 0 || start < 0 || end < start {
+		return "bad range in $GENERATE range"
+	}
+
+	<-c // _BLANK
+	// Create a complete new string, which we then parse again.
+	s := ""
+BuildRR:
+	l = <-c
+	if l.value != zNewline && l.value != zEOF {
+		s += l.token
+		goto BuildRR
+	}
+	for i := start; i <= end; i += step {
+		var (
+			escape bool
+			dom    bytes.Buffer
+			mod    string
+			err    error
+			offset int
+		)
+
+		for j := 0; j < len(s); j++ { // No 'range' because we need to jump around
+			switch s[j] {
+			case '\\':
+				if escape {
+					dom.WriteByte('\\')
+					escape = false
+					continue
+				}
+				escape = true
+			case '$':
+				mod = "%d"
+				offset = 0
+				if escape {
+					dom.WriteByte('$')
+					escape = false
+					continue
+				}
+				escape = false
+				if j+1 >= len(s) { // End of the string
+					dom.WriteString(fmt.Sprintf(mod, i+offset))
+					continue
+				} else {
+					if s[j+1] == '$' {
+						dom.WriteByte('$')
+						j++
+						continue
+					}
+				}
+				// Search for { and }
+				if s[j+1] == '{' { // Modifier block
+					sep := strings.Index(s[j+2:], "}")
+					if sep == -1 {
+						return "bad modifier in $GENERATE"
+					}
+					mod, offset, err = modToPrintf(s[j+2 : j+2+sep])
+					if err != nil {
+						return err.Error()
+					}
+					j += 2 + sep // Jump to it
+				}
+				dom.WriteString(fmt.Sprintf(mod, i+offset))
+			default:
+				if escape { // Pretty useless here
+					escape = false
+					continue
+				}
+				dom.WriteByte(s[j])
+			}
+		}
+		// Re-parse the RR and send it on the current channel t
+		rx, err := NewRR("$ORIGIN " + o + "\n" + dom.String())
+		if err != nil {
+			return err.Error()
+		}
+		t <- &Token{RR: rx}
+		// Its more efficient to first built the rrlist and then parse it in
+		// one go! But is this a problem?
+	}
+	return ""
+}
+
+// Convert a $GENERATE modifier 0,0,d to something Printf can deal with.
+func modToPrintf(s string) (string, int, error) {
+	xs := strings.SplitN(s, ",", 3)
+	if len(xs) != 3 {
+		return "", 0, errors.New("bad modifier in $GENERATE")
+	}
+	// xs[0] is offset, xs[1] is width, xs[2] is base
+	if xs[2] != "o" && xs[2] != "d" && xs[2] != "x" && xs[2] != "X" {
+		return "", 0, errors.New("bad base in $GENERATE")
+	}
+	offset, err := strconv.Atoi(xs[0])
+	if err != nil || offset > 255 {
+		return "", 0, errors.New("bad offset in $GENERATE")
+	}
+	width, err := strconv.Atoi(xs[1])
+	if err != nil || width > 255 {
+		return "", offset, errors.New("bad width in $GENERATE")
+	}
+	switch {
+	case width < 0:
+		return "", offset, errors.New("bad width in $GENERATE")
+	case width == 0:
+		return "%" + xs[1] + xs[2], offset, nil
+	}
+	return "%0" + xs[1] + xs[2], offset, nil
+}
diff --git a/vendor/github.com/miekg/dns/labels.go b/vendor/github.com/miekg/dns/labels.go
new file mode 100644
index 000000000..fca5c7dd2
--- /dev/null
+++ b/vendor/github.com/miekg/dns/labels.go
@@ -0,0 +1,168 @@
+package dns
+
+// Holds a bunch of helper functions for dealing with labels.
+
+// SplitDomainName splits a name string into it's labels.
+// www.miek.nl. returns []string{"www", "miek", "nl"}
+// .www.miek.nl. returns []string{"", "www", "miek", "nl"},
+// The root label (.) returns nil. Note that using
+// strings.Split(s) will work in most cases, but does not handle
+// escaped dots (\.) for instance.
+// s must be a syntactically valid domain name, see IsDomainName.
+func SplitDomainName(s string) (labels []string) {
+	if len(s) == 0 {
+		return nil
+	}
+	fqdnEnd := 0 // offset of the final '.' or the length of the name
+	idx := Split(s)
+	begin := 0
+	if s[len(s)-1] == '.' {
+		fqdnEnd = len(s) - 1
+	} else {
+		fqdnEnd = len(s)
+	}
+
+	switch len(idx) {
+	case 0:
+		return nil
+	case 1:
+		// no-op
+	default:
+		end := 0
+		for i := 1; i < len(idx); i++ {
+			end = idx[i]
+			labels = append(labels, s[begin:end-1])
+			begin = end
+		}
+	}
+
+	labels = append(labels, s[begin:fqdnEnd])
+	return labels
+}
+
+// CompareDomainName compares the names s1 and s2 and
+// returns how many labels they have in common starting from the *right*.
+// The comparison stops at the first inequality. The names are not downcased
+// before the comparison.
+//
+// www.miek.nl. and miek.nl. have two labels in common: miek and nl
+// www.miek.nl. and www.bla.nl. have one label in common: nl
+//
+// s1 and s2 must be syntactically valid domain names.
+func CompareDomainName(s1, s2 string) (n int) {
+	s1 = Fqdn(s1)
+	s2 = Fqdn(s2)
+	l1 := Split(s1)
+	l2 := Split(s2)
+
+	// the first check: root label
+	if l1 == nil || l2 == nil {
+		return
+	}
+
+	j1 := len(l1) - 1 // end
+	i1 := len(l1) - 2 // start
+	j2 := len(l2) - 1
+	i2 := len(l2) - 2
+	// the second check can be done here: last/only label
+	// before we fall through into the for-loop below
+	if s1[l1[j1]:] == s2[l2[j2]:] {
+		n++
+	} else {
+		return
+	}
+	for {
+		if i1 < 0 || i2 < 0 {
+			break
+		}
+		if s1[l1[i1]:l1[j1]] == s2[l2[i2]:l2[j2]] {
+			n++
+		} else {
+			break
+		}
+		j1--
+		i1--
+		j2--
+		i2--
+	}
+	return
+}
+
+// CountLabel counts the the number of labels in the string s.
+// s must be a syntactically valid domain name.
+func CountLabel(s string) (labels int) {
+	if s == "." {
+		return
+	}
+	off := 0
+	end := false
+	for {
+		off, end = NextLabel(s, off)
+		labels++
+		if end {
+			return
+		}
+	}
+}
+
+// Split splits a name s into its label indexes.
+// www.miek.nl. returns []int{0, 4, 9}, www.miek.nl also returns []int{0, 4, 9}.
+// The root name (.) returns nil. Also see SplitDomainName.
+// s must be a syntactically valid domain name.
+func Split(s string) []int {
+	if s == "." {
+		return nil
+	}
+	idx := make([]int, 1, 3)
+	off := 0
+	end := false
+
+	for {
+		off, end = NextLabel(s, off)
+		if end {
+			return idx
+		}
+		idx = append(idx, off)
+	}
+}
+
+// NextLabel returns the index of the start of the next label in the
+// string s starting at offset.
+// The bool end is true when the end of the string has been reached.
+// Also see PrevLabel.
+func NextLabel(s string, offset int) (i int, end bool) {
+	quote := false
+	for i = offset; i < len(s)-1; i++ {
+		switch s[i] {
+		case '\\':
+			quote = !quote
+		default:
+			quote = false
+		case '.':
+			if quote {
+				quote = !quote
+				continue
+			}
+			return i + 1, false
+		}
+	}
+	return i + 1, true
+}
+
+// PrevLabel returns the index of the label when starting from the right and
+// jumping n labels to the left.
+// The bool start is true when the start of the string has been overshot.
+// Also see NextLabel.
+func PrevLabel(s string, n int) (i int, start bool) {
+	if n == 0 {
+		return len(s), false
+	}
+	lab := Split(s)
+	if lab == nil {
+		return 0, true
+	}
+	if n > len(lab) {
+		return 0, true
+	}
+	return lab[len(lab)-n], false
+}
diff --git a/vendor/github.com/miekg/dns/msg.go b/vendor/github.com/miekg/dns/msg.go
new file mode 100644
index 000000000..a9acd1e9f
--- /dev/null
+++ b/vendor/github.com/miekg/dns/msg.go
@@ -0,0 +1,1231 @@
+// DNS packet assembly, see RFC 1035. Converting from - Unpack() -
+// and to - Pack() - wire format.
+// All the packers and unpackers take a (msg []byte, off int)
+// and return (off1 int, ok bool).  If they return ok==false, they
+// also return off1==len(msg), so that the next unpacker will
+// also fail.  This lets us avoid checks of ok until the end of a
+// packing sequence.
+
+package dns
+
+//go:generate go run msg_generate.go
+
+import (
+	crand "crypto/rand"
+	"encoding/binary"
+	"math/big"
+	"math/rand"
+	"strconv"
+)
+
+func init() {
+	// Initialize default math/rand source using crypto/rand to provide better
+	// security without the performance trade-off.
+	buf := make([]byte, 8)
+	_, err := crand.Read(buf)
+	if err != nil {
+		// Failed to read from cryptographic source, fallback to default initial
+		// seed (1) by returning early
+		return
+	}
+	seed := binary.BigEndian.Uint64(buf)
+	rand.Seed(int64(seed))
+}
+
+const maxCompressionOffset = 2 << 13 // We have 14 bits for the compression pointer
+
+var (
+	ErrAlg           error = &Error{err: "bad algorithm"}                  // ErrAlg indicates an error with the (DNSSEC) algorithm.
+	ErrAuth          error = &Error{err: "bad authentication"}             // ErrAuth indicates an error in the TSIG authentication.
+	ErrBuf           error = &Error{err: "buffer size too small"}          // ErrBuf indicates that the buffer used it too small for the message.
+	ErrConnEmpty     error = &Error{err: "conn has no connection"}         // ErrConnEmpty indicates a connection is being uses before it is initialized.
+	ErrExtendedRcode error = &Error{err: "bad extended rcode"}             // ErrExtendedRcode ...
+	ErrFqdn          error = &Error{err: "domain must be fully qualified"} // ErrFqdn indicates that a domain name does not have a closing dot.
+	ErrId            error = &Error{err: "id mismatch"}                    // ErrId indicates there is a mismatch with the message's ID.
+	ErrKeyAlg        error = &Error{err: "bad key algorithm"}              // ErrKeyAlg indicates that the algorithm in the key is not valid.
+	ErrKey           error = &Error{err: "bad key"}
+	ErrKeySize       error = &Error{err: "bad key size"}
+	ErrNoSig         error = &Error{err: "no signature found"}
+	ErrPrivKey       error = &Error{err: "bad private key"}
+	ErrRcode         error = &Error{err: "bad rcode"}
+	ErrRdata         error = &Error{err: "bad rdata"}
+	ErrRRset         error = &Error{err: "bad rrset"}
+	ErrSecret        error = &Error{err: "no secrets defined"}
+	ErrShortRead     error = &Error{err: "short read"}
+	ErrSig           error = &Error{err: "bad signature"}                      // ErrSig indicates that a signature can not be cryptographically validated.
+	ErrSoa           error = &Error{err: "no SOA"}                             // ErrSOA indicates that no SOA RR was seen when doing zone transfers.
+	ErrTime          error = &Error{err: "bad time"}                           // ErrTime indicates a timing error in TSIG authentication.
+	ErrTruncated     error = &Error{err: "failed to unpack truncated message"} // ErrTruncated indicates that we failed to unpack a truncated message. We unpacked as much as we had so Msg can still be used, if desired.
+)
+
+// Id by default, returns a 16 bits random number to be used as a
+// message id. The random provided should be good enough. This being a
+// variable the function can be reassigned to a custom function.
+// For instance, to make it return a static value:
+//
+//	dns.Id = func() uint16 { return 3 }
+var Id func() uint16 = id
+
+// id returns a 16 bits random number to be used as a
+// message id. The random provided should be good enough.
+func id() uint16 {
+	id32 := rand.Uint32()
+	return uint16(id32)
+}
+
+// MsgHdr is a a manually-unpacked version of (id, bits).
+type MsgHdr struct {
+	Id                 uint16
+	Response           bool
+	Opcode             int
+	Authoritative      bool
+	Truncated          bool
+	RecursionDesired   bool
+	RecursionAvailable bool
+	Zero               bool
+	AuthenticatedData  bool
+	CheckingDisabled   bool
+	Rcode              int
+}
+
+// Msg contains the layout of a DNS message.
+type Msg struct {
+	MsgHdr
+	Compress bool       `json:"-"` // If true, the message will be compressed when converted to wire format.
+	Question []Question // Holds the RR(s) of the question section.
+	Answer   []RR       // Holds the RR(s) of the answer section.
+	Ns       []RR       // Holds the RR(s) of the authority section.
+	Extra    []RR       // Holds the RR(s) of the additional section.
+}
+
+// ClassToString is a maps Classes to strings for each CLASS wire type.
+var ClassToString = map[uint16]string{
+	ClassINET:   "IN",
+	ClassCSNET:  "CS",
+	ClassCHAOS:  "CH",
+	ClassHESIOD: "HS",
+	ClassNONE:   "NONE",
+	ClassANY:    "ANY",
+}
+
+// OpcodeToString maps Opcodes to strings.
+var OpcodeToString = map[int]string{
+	OpcodeQuery:  "QUERY",
+	OpcodeIQuery: "IQUERY",
+	OpcodeStatus: "STATUS",
+	OpcodeNotify: "NOTIFY",
+	OpcodeUpdate: "UPDATE",
+}
+
+// RcodeToString maps Rcodes to strings.
+var RcodeToString = map[int]string{
+	RcodeSuccess:        "NOERROR",
+	RcodeFormatError:    "FORMERR",
+	RcodeServerFailure:  "SERVFAIL",
+	RcodeNameError:      "NXDOMAIN",
+	RcodeNotImplemented: "NOTIMPL",
+	RcodeRefused:        "REFUSED",
+	RcodeYXDomain:       "YXDOMAIN", // See RFC 2136
+	RcodeYXRrset:        "YXRRSET",
+	RcodeNXRrset:        "NXRRSET",
+	RcodeNotAuth:        "NOTAUTH",
+	RcodeNotZone:        "NOTZONE",
+	RcodeBadSig:         "BADSIG", // Also known as RcodeBadVers, see RFC 6891
+	//	RcodeBadVers:        "BADVERS",
+	RcodeBadKey:    "BADKEY",
+	RcodeBadTime:   "BADTIME",
+	RcodeBadMode:   "BADMODE",
+	RcodeBadName:   "BADNAME",
+	RcodeBadAlg:    "BADALG",
+	RcodeBadTrunc:  "BADTRUNC",
+	RcodeBadCookie: "BADCOOKIE",
+}
+
+// Domain names are a sequence of counted strings
+// split at the dots. They end with a zero-length string.
+
+// PackDomainName packs a domain name s into msg[off:].
+// If compression is wanted compress must be true and the compression
+// map needs to hold a mapping between domain names and offsets
+// pointing into msg.
+func PackDomainName(s string, msg []byte, off int, compression map[string]int, compress bool) (off1 int, err error) {
+	off1, _, err = packDomainName(s, msg, off, compression, compress)
+	return
+}
+
+func packDomainName(s string, msg []byte, off int, compression map[string]int, compress bool) (off1 int, labels int, err error) {
+	// special case if msg == nil
+	lenmsg := 256
+	if msg != nil {
+		lenmsg = len(msg)
+	}
+	ls := len(s)
+	if ls == 0 { // Ok, for instance when dealing with update RR without any rdata.
+		return off, 0, nil
+	}
+	// If not fully qualified, error out, but only if msg == nil #ugly
+	switch {
+	case msg == nil:
+		if s[ls-1] != '.' {
+			s += "."
+			ls++
+		}
+	case msg != nil:
+		if s[ls-1] != '.' {
+			return lenmsg, 0, ErrFqdn
+		}
+	}
+	// Each dot ends a segment of the name.
+	// We trade each dot byte for a length byte.
+	// Except for escaped dots (\.), which are normal dots.
+	// There is also a trailing zero.
+
+	// Compression
+	nameoffset := -1
+	pointer := -1
+	// Emit sequence of counted strings, chopping at dots.
+	begin := 0
+	bs := []byte(s)
+	roBs, bsFresh, escapedDot := s, true, false
+	for i := 0; i < ls; i++ {
+		if bs[i] == '\\' {
+			for j := i; j < ls-1; j++ {
+				bs[j] = bs[j+1]
+			}
+			ls--
+			if off+1 > lenmsg {
+				return lenmsg, labels, ErrBuf
+			}
+			// check for \DDD
+			if i+2 < ls && isDigit(bs[i]) && isDigit(bs[i+1]) && isDigit(bs[i+2]) {
+				bs[i] = dddToByte(bs[i:])
+				for j := i + 1; j < ls-2; j++ {
+					bs[j] = bs[j+2]
+				}
+				ls -= 2
+			} else if bs[i] == 't' {
+				bs[i] = '\t'
+			} else if bs[i] == 'r' {
+				bs[i] = '\r'
+			} else if bs[i] == 'n' {
+				bs[i] = '\n'
+			}
+			escapedDot = bs[i] == '.'
+			bsFresh = false
+			continue
+		}
+
+		if bs[i] == '.' {
+			if i > 0 && bs[i-1] == '.' && !escapedDot {
+				// two dots back to back is not legal
+				return lenmsg, labels, ErrRdata
+			}
+			if i-begin >= 1<<6 { // top two bits of length must be clear
+				return lenmsg, labels, ErrRdata
+			}
+			// off can already (we're in a loop) be bigger than len(msg)
+			// this happens when a name isn't fully qualified
+			if off+1 > lenmsg {
+				return lenmsg, labels, ErrBuf
+			}
+			if msg != nil {
+				msg[off] = byte(i - begin)
+			}
+			offset := off
+			off++
+			for j := begin; j < i; j++ {
+				if off+1 > lenmsg {
+					return lenmsg, labels, ErrBuf
+				}
+				if msg != nil {
+					msg[off] = bs[j]
+				}
+				off++
+			}
+			if compress && !bsFresh {
+				roBs = string(bs)
+				bsFresh = true
+			}
+			// Don't try to compress '.'
+			if compress && roBs[begin:] != "." {
+				if p, ok := compression[roBs[begin:]]; !ok {
+					// Only offsets smaller than this can be used.
+					if offset < maxCompressionOffset {
+						compression[roBs[begin:]] = offset
+					}
+				} else {
+					// The first hit is the longest matching dname
+					// keep the pointer offset we get back and store
+					// the offset of the current name, because that's
+					// where we need to insert the pointer later
+
+					// If compress is true, we're allowed to compress this dname
+					if pointer == -1 && compress {
+						pointer = p         // Where to point to
+						nameoffset = offset // Where to point from
+						break
+					}
+				}
+			}
+			labels++
+			begin = i + 1
+		}
+		escapedDot = false
+	}
+	// Root label is special
+	if len(bs) == 1 && bs[0] == '.' {
+		return off, labels, nil
+	}
+	// If we did compression and we find something add the pointer here
+	if pointer != -1 {
+		// We have two bytes (14 bits) to put the pointer in
+		// if msg == nil, we will never do compression
+		binary.BigEndian.PutUint16(msg[nameoffset:], uint16(pointer^0xC000))
+		off = nameoffset + 1
+		goto End
+	}
+	if msg != nil && off < len(msg) {
+		msg[off] = 0
+	}
+End:
+	off++
+	return off, labels, nil
+}
+
+// Unpack a domain name.
+// In addition to the simple sequences of counted strings above,
+// domain names are allowed to refer to strings elsewhere in the
+// packet, to avoid repeating common suffixes when returning
+// many entries in a single domain.  The pointers are marked
+// by a length byte with the top two bits set.  Ignoring those
+// two bits, that byte and the next give a 14 bit offset from msg[0]
+// where we should pick up the trail.
+// Note that if we jump elsewhere in the packet,
+// we return off1 == the offset after the first pointer we found,
+// which is where the next record will start.
+// In theory, the pointers are only allowed to jump backward.
+// We let them jump anywhere and stop jumping after a while.
+
+// UnpackDomainName unpacks a domain name into a string.
+func UnpackDomainName(msg []byte, off int) (string, int, error) {
+	s := make([]byte, 0, 64)
+	off1 := 0
+	lenmsg := len(msg)
+	ptr := 0 // number of pointers followed
+Loop:
+	for {
+		if off >= lenmsg {
+			return "", lenmsg, ErrBuf
+		}
+		c := int(msg[off])
+		off++
+		switch c & 0xC0 {
+		case 0x00:
+			if c == 0x00 {
+				// end of name
+				break Loop
+			}
+			// literal string
+			if off+c > lenmsg {
+				return "", lenmsg, ErrBuf
+			}
+			for j := off; j < off+c; j++ {
+				switch b := msg[j]; b {
+				case '.', '(', ')', ';', ' ', '@':
+					fallthrough
+				case '"', '\\':
+					s = append(s, '\\', b)
+				case '\t':
+					s = append(s, '\\', 't')
+				case '\r':
+					s = append(s, '\\', 'r')
+				default:
+					if b < 32 || b >= 127 { // unprintable use \DDD
+						var buf [3]byte
+						bufs := strconv.AppendInt(buf[:0], int64(b), 10)
+						s = append(s, '\\')
+						for i := 0; i < 3-len(bufs); i++ {
+							s = append(s, '0')
+						}
+						for _, r := range bufs {
+							s = append(s, r)
+						}
+					} else {
+						s = append(s, b)
+					}
+				}
+			}
+			s = append(s, '.')
+			off += c
+		case 0xC0:
+			// pointer to somewhere else in msg.
+			// remember location after first ptr,
+			// since that's how many bytes we consumed.
+			// also, don't follow too many pointers --
+			// maybe there's a loop.
+			if off >= lenmsg {
+				return "", lenmsg, ErrBuf
+			}
+			c1 := msg[off]
+			off++
+			if ptr == 0 {
+				off1 = off
+			}
+			if ptr++; ptr > 10 {
+				return "", lenmsg, &Error{err: "too many compression pointers"}
+			}
+			off = (c^0xC0)<<8 | int(c1)
+		default:
+			// 0x80 and 0x40 are reserved
+			return "", lenmsg, ErrRdata
+		}
+	}
+	if ptr == 0 {
+		off1 = off
+	}
+	if len(s) == 0 {
+		s = []byte(".")
+	}
+	return string(s), off1, nil
+}
+
+func packTxt(txt []string, msg []byte, offset int, tmp []byte) (int, error) {
+	if len(txt) == 0 {
+		if offset >= len(msg) {
+			return offset, ErrBuf
+		}
+		msg[offset] = 0
+		return offset, nil
+	}
+	var err error
+	for i := range txt {
+		if len(txt[i]) > len(tmp) {
+			return offset, ErrBuf
+		}
+		offset, err = packTxtString(txt[i], msg, offset, tmp)
+		if err != nil {
+			return offset, err
+		}
+	}
+	return offset, nil
+}
+
+func packTxtString(s string, msg []byte, offset int, tmp []byte) (int, error) {
+	lenByteOffset := offset
+	if offset >= len(msg) || len(s) > len(tmp) {
+		return offset, ErrBuf
+	}
+	offset++
+	bs := tmp[:len(s)]
+	copy(bs, s)
+	for i := 0; i < len(bs); i++ {
+		if len(msg) <= offset {
+			return offset, ErrBuf
+		}
+		if bs[i] == '\\' {
+			i++
+			if i == len(bs) {
+				break
+			}
+			// check for \DDD
+			if i+2 < len(bs) && isDigit(bs[i]) && isDigit(bs[i+1]) && isDigit(bs[i+2]) {
+				msg[offset] = dddToByte(bs[i:])
+				i += 2
+			} else if bs[i] == 't' {
+				msg[offset] = '\t'
+			} else if bs[i] == 'r' {
+				msg[offset] = '\r'
+			} else if bs[i] == 'n' {
+				msg[offset] = '\n'
+			} else {
+				msg[offset] = bs[i]
+			}
+		} else {
+			msg[offset] = bs[i]
+		}
+		offset++
+	}
+	l := offset - lenByteOffset - 1
+	if l > 255 {
+		return offset, &Error{err: "string exceeded 255 bytes in txt"}
+	}
+	msg[lenByteOffset] = byte(l)
+	return offset, nil
+}
+
+func packOctetString(s string, msg []byte, offset int, tmp []byte) (int, error) {
+	if offset >= len(msg) || len(s) > len(tmp) {
+		return offset, ErrBuf
+	}
+	bs := tmp[:len(s)]
+	copy(bs, s)
+	for i := 0; i < len(bs); i++ {
+		if len(msg) <= offset {
+			return offset, ErrBuf
+		}
+		if bs[i] == '\\' {
+			i++
+			if i == len(bs) {
+				break
+			}
+			// check for \DDD
+			if i+2 < len(bs) && isDigit(bs[i]) && isDigit(bs[i+1]) && isDigit(bs[i+2]) {
+				msg[offset] = dddToByte(bs[i:])
+				i += 2
+			} else {
+				msg[offset] = bs[i]
+			}
+		} else {
+			msg[offset] = bs[i]
+		}
+		offset++
+	}
+	return offset, nil
+}
+
+func unpackTxt(msg []byte, off0 int) (ss []string, off int, err error) {
+	off = off0
+	var s string
+	for off < len(msg) && err == nil {
+		s, off, err = unpackTxtString(msg, off)
+		if err == nil {
+			ss = append(ss, s)
+		}
+	}
+	return
+}
+
+func unpackTxtString(msg []byte, offset int) (string, int, error) {
+	if offset+1 > len(msg) {
+		return "", offset, &Error{err: "overflow unpacking txt"}
+	}
+	l := int(msg[offset])
+	if offset+l+1 > len(msg) {
+		return "", offset, &Error{err: "overflow unpacking txt"}
+	}
+	s := make([]byte, 0, l)
+	for _, b := range msg[offset+1 : offset+1+l] {
+		switch b {
+		case '"', '\\':
+			s = append(s, '\\', b)
+		case '\t':
+			s = append(s, `\t`...)
+		case '\r':
+			s = append(s, `\r`...)
+		case '\n':
+			s = append(s, `\n`...)
+		default:
+			if b < 32 || b > 127 { // unprintable
+				var buf [3]byte
+				bufs := strconv.AppendInt(buf[:0], int64(b), 10)
+				s = append(s, '\\')
+				for i := 0; i < 3-len(bufs); i++ {
+					s = append(s, '0')
+				}
+				for _, r := range bufs {
+					s = append(s, r)
+				}
+			} else {
+				s = append(s, b)
+			}
+		}
+	}
+	offset += 1 + l
+	return string(s), offset, nil
+}
+
+// Helpers for dealing with escaped bytes
+func isDigit(b byte) bool { return b >= '0' && b <= '9' }
+
+func dddToByte(s []byte) byte {
+	return byte((s[0]-'0')*100 + (s[1]-'0')*10 + (s[2] - '0'))
+}
+
+// Helper function for packing and unpacking
+func intToBytes(i *big.Int, length int) []byte {
+	buf := i.Bytes()
+	if len(buf) < length {
+		b := make([]byte, length)
+		copy(b[length-len(buf):], buf)
+		return b
+	}
+	return buf
+}
+
+// PackRR packs a resource record rr into msg[off:].
+// See PackDomainName for documentation about the compression.
+func PackRR(rr RR, msg []byte, off int, compression map[string]int, compress bool) (off1 int, err error) {
+	if rr == nil {
+		return len(msg), &Error{err: "nil rr"}
+	}
+
+	off1, err = rr.pack(msg, off, compression, compress)
+	if err != nil {
+		return len(msg), err
+	}
+	// TODO(miek): Not sure if this is needed? If removed we can remove rawmsg.go as well.
+	if rawSetRdlength(msg, off, off1) {
+		return off1, nil
+	}
+	return off, ErrRdata
+}
+
+// UnpackRR unpacks msg[off:] into an RR.
+func UnpackRR(msg []byte, off int) (rr RR, off1 int, err error) {
+	h, off, msg, err := unpackHeader(msg, off)
+	if err != nil {
+		return nil, len(msg), err
+	}
+	end := off + int(h.Rdlength)
+
+	if fn, known := typeToUnpack[h.Rrtype]; !known {
+		rr, off, err = unpackRFC3597(h, msg, off)
+	} else {
+		rr, off, err = fn(h, msg, off)
+	}
+	if off != end {
+		return &h, end, &Error{err: "bad rdlength"}
+	}
+	return rr, off, err
+}
+
+// unpackRRslice unpacks msg[off:] into an []RR.
+// If we cannot unpack the whole array, then it will return nil
+func unpackRRslice(l int, msg []byte, off int) (dst1 []RR, off1 int, err error) {
+	var r RR
+	// Optimistically make dst be the length that was sent
+	dst := make([]RR, 0, l)
+	for i := 0; i < l; i++ {
+		off1 := off
+		r, off, err = UnpackRR(msg, off)
+		if err != nil {
+			off = len(msg)
+			break
+		}
+		// If offset does not increase anymore, l is a lie
+		if off1 == off {
+			l = i
+			break
+		}
+		dst = append(dst, r)
+	}
+	if err != nil && off == len(msg) {
+		dst = nil
+	}
+	return dst, off, err
+}
+
+// Convert a MsgHdr to a string, with dig-like headers:
+//
+//;; opcode: QUERY, status: NOERROR, id: 48404
+//
+//;; flags: qr aa rd ra;
+func (h *MsgHdr) String() string {
+	if h == nil {
+		return "<nil> MsgHdr"
+	}
+
+	s := ";; opcode: " + OpcodeToString[h.Opcode]
+	s += ", status: " + RcodeToString[h.Rcode]
+	s += ", id: " + strconv.Itoa(int(h.Id)) + "\n"
+
+	s += ";; flags:"
+	if h.Response {
+		s += " qr"
+	}
+	if h.Authoritative {
+		s += " aa"
+	}
+	if h.Truncated {
+		s += " tc"
+	}
+	if h.RecursionDesired {
+		s += " rd"
+	}
+	if h.RecursionAvailable {
+		s += " ra"
+	}
+	if h.Zero { // Hmm
+		s += " z"
+	}
+	if h.AuthenticatedData {
+		s += " ad"
+	}
+	if h.CheckingDisabled {
+		s += " cd"
+	}
+
+	s += ";"
+	return s
+}
+
+// Pack packs a Msg: it is converted to to wire format.
+// If the dns.Compress is true the message will be in compressed wire format.
+func (dns *Msg) Pack() (msg []byte, err error) {
+	return dns.PackBuffer(nil)
+}
+
+// PackBuffer packs a Msg, using the given buffer buf. If buf is too small
+// a new buffer is allocated.
+func (dns *Msg) PackBuffer(buf []byte) (msg []byte, err error) {
+	// We use a similar function in tsig.go's stripTsig.
+	var (
+		dh          Header
+		compression map[string]int
+	)
+
+	if dns.Compress {
+		compression = make(map[string]int) // Compression pointer mappings
+	}
+
+	if dns.Rcode < 0 || dns.Rcode > 0xFFF {
+		return nil, ErrRcode
+	}
+	if dns.Rcode > 0xF {
+		// Regular RCODE field is 4 bits
+		opt := dns.IsEdns0()
+		if opt == nil {
+			return nil, ErrExtendedRcode
+		}
+		opt.SetExtendedRcode(uint8(dns.Rcode >> 4))
+		dns.Rcode &= 0xF
+	}
+
+	// Convert convenient Msg into wire-like Header.
+	dh.Id = dns.Id
+	dh.Bits = uint16(dns.Opcode)<<11 | uint16(dns.Rcode)
+	if dns.Response {
+		dh.Bits |= _QR
+	}
+	if dns.Authoritative {
+		dh.Bits |= _AA
+	}
+	if dns.Truncated {
+		dh.Bits |= _TC
+	}
+	if dns.RecursionDesired {
+		dh.Bits |= _RD
+	}
+	if dns.RecursionAvailable {
+		dh.Bits |= _RA
+	}
+	if dns.Zero {
+		dh.Bits |= _Z
+	}
+	if dns.AuthenticatedData {
+		dh.Bits |= _AD
+	}
+	if dns.CheckingDisabled {
+		dh.Bits |= _CD
+	}
+
+	// Prepare variable sized arrays.
+	question := dns.Question
+	answer := dns.Answer
+	ns := dns.Ns
+	extra := dns.Extra
+
+	dh.Qdcount = uint16(len(question))
+	dh.Ancount = uint16(len(answer))
+	dh.Nscount = uint16(len(ns))
+	dh.Arcount = uint16(len(extra))
+
+	// We need the uncompressed length here, because we first pack it and then compress it.
+	msg = buf
+	compress := dns.Compress
+	dns.Compress = false
+	if packLen := dns.Len() + 1; len(msg) < packLen {
+		msg = make([]byte, packLen)
+	}
+	dns.Compress = compress
+
+	// Pack it in: header and then the pieces.
+	off := 0
+	off, err = dh.pack(msg, off, compression, dns.Compress)
+	if err != nil {
+		return nil, err
+	}
+	for i := 0; i < len(question); i++ {
+		off, err = question[i].pack(msg, off, compression, dns.Compress)
+		if err != nil {
+			return nil, err
+		}
+	}
+	for i := 0; i < len(answer); i++ {
+		off, err = PackRR(answer[i], msg, off, compression, dns.Compress)
+		if err != nil {
+			return nil, err
+		}
+	}
+	for i := 0; i < len(ns); i++ {
+		off, err = PackRR(ns[i], msg, off, compression, dns.Compress)
+		if err != nil {
+			return nil, err
+		}
+	}
+	for i := 0; i < len(extra); i++ {
+		off, err = PackRR(extra[i], msg, off, compression, dns.Compress)
+		if err != nil {
+			return nil, err
+		}
+	}
+	return msg[:off], nil
+}
+
+// Unpack unpacks a binary message to a Msg structure.
+func (dns *Msg) Unpack(msg []byte) (err error) {
+	var (
+		dh  Header
+		off int
+	)
+	if dh, off, err = unpackMsgHdr(msg, off); err != nil {
+		return err
+	}
+	if off == len(msg) {
+		return ErrTruncated
+	}
+
+	dns.Id = dh.Id
+	dns.Response = (dh.Bits & _QR) != 0
+	dns.Opcode = int(dh.Bits>>11) & 0xF
+	dns.Authoritative = (dh.Bits & _AA) != 0
+	dns.Truncated = (dh.Bits & _TC) != 0
+	dns.RecursionDesired = (dh.Bits & _RD) != 0
+	dns.RecursionAvailable = (dh.Bits & _RA) != 0
+	dns.Zero = (dh.Bits & _Z) != 0
+	dns.AuthenticatedData = (dh.Bits & _AD) != 0
+	dns.CheckingDisabled = (dh.Bits & _CD) != 0
+	dns.Rcode = int(dh.Bits & 0xF)
+
+	// Optimistically use the count given to us in the header
+	dns.Question = make([]Question, 0, int(dh.Qdcount))
+
+	for i := 0; i < int(dh.Qdcount); i++ {
+		off1 := off
+		var q Question
+		q, off, err = unpackQuestion(msg, off)
+		if err != nil {
+			// Even if Truncated is set, we only will set ErrTruncated if we
+			// actually got the questions
+			return err
+		}
+		if off1 == off { // Offset does not increase anymore, dh.Qdcount is a lie!
+			dh.Qdcount = uint16(i)
+			break
+		}
+		dns.Question = append(dns.Question, q)
+	}
+
+	dns.Answer, off, err = unpackRRslice(int(dh.Ancount), msg, off)
+	// The header counts might have been wrong so we need to update it
+	dh.Ancount = uint16(len(dns.Answer))
+	if err == nil {
+		dns.Ns, off, err = unpackRRslice(int(dh.Nscount), msg, off)
+	}
+	// The header counts might have been wrong so we need to update it
+	dh.Nscount = uint16(len(dns.Ns))
+	if err == nil {
+		dns.Extra, off, err = unpackRRslice(int(dh.Arcount), msg, off)
+	}
+	// The header counts might have been wrong so we need to update it
+	dh.Arcount = uint16(len(dns.Extra))
+
+	if off != len(msg) {
+		// TODO(miek) make this an error?
+		// use PackOpt to let people tell how detailed the error reporting should be?
+		// println("dns: extra bytes in dns packet", off, "<", len(msg))
+	} else if dns.Truncated {
+		// Whether we ran into a an error or not, we want to return that it
+		// was truncated
+		err = ErrTruncated
+	}
+	return err
+}
+
+// Convert a complete message to a string with dig-like output.
+func (dns *Msg) String() string {
+	if dns == nil {
+		return "<nil> MsgHdr"
+	}
+	s := dns.MsgHdr.String() + " "
+	s += "QUERY: " + strconv.Itoa(len(dns.Question)) + ", "
+	s += "ANSWER: " + strconv.Itoa(len(dns.Answer)) + ", "
+	s += "AUTHORITY: " + strconv.Itoa(len(dns.Ns)) + ", "
+	s += "ADDITIONAL: " + strconv.Itoa(len(dns.Extra)) + "\n"
+	if len(dns.Question) > 0 {
+		s += "\n;; QUESTION SECTION:\n"
+		for i := 0; i < len(dns.Question); i++ {
+			s += dns.Question[i].String() + "\n"
+		}
+	}
+	if len(dns.Answer) > 0 {
+		s += "\n;; ANSWER SECTION:\n"
+		for i := 0; i < len(dns.Answer); i++ {
+			if dns.Answer[i] != nil {
+				s += dns.Answer[i].String() + "\n"
+			}
+		}
+	}
+	if len(dns.Ns) > 0 {
+		s += "\n;; AUTHORITY SECTION:\n"
+		for i := 0; i < len(dns.Ns); i++ {
+			if dns.Ns[i] != nil {
+				s += dns.Ns[i].String() + "\n"
+			}
+		}
+	}
+	if len(dns.Extra) > 0 {
+		s += "\n;; ADDITIONAL SECTION:\n"
+		for i := 0; i < len(dns.Extra); i++ {
+			if dns.Extra[i] != nil {
+				s += dns.Extra[i].String() + "\n"
+			}
+		}
+	}
+	return s
+}
+
+// Len returns the message length when in (un)compressed wire format.
+// If dns.Compress is true compression it is taken into account. Len()
+// is provided to be a faster way to get the size of the resulting packet,
+// than packing it, measuring the size and discarding the buffer.
+func (dns *Msg) Len() int {
+	// We always return one more than needed.
+	l := 12 // Message header is always 12 bytes
+	var compression map[string]int
+	if dns.Compress {
+		compression = make(map[string]int)
+	}
+	for i := 0; i < len(dns.Question); i++ {
+		l += dns.Question[i].len()
+		if dns.Compress {
+			compressionLenHelper(compression, dns.Question[i].Name)
+		}
+	}
+	for i := 0; i < len(dns.Answer); i++ {
+		if dns.Answer[i] == nil {
+			continue
+		}
+		l += dns.Answer[i].len()
+		if dns.Compress {
+			k, ok := compressionLenSearch(compression, dns.Answer[i].Header().Name)
+			if ok {
+				l += 1 - k
+			}
+			compressionLenHelper(compression, dns.Answer[i].Header().Name)
+			k, ok = compressionLenSearchType(compression, dns.Answer[i])
+			if ok {
+				l += 1 - k
+			}
+			compressionLenHelperType(compression, dns.Answer[i])
+		}
+	}
+	for i := 0; i < len(dns.Ns); i++ {
+		if dns.Ns[i] == nil {
+			continue
+		}
+		l += dns.Ns[i].len()
+		if dns.Compress {
+			k, ok := compressionLenSearch(compression, dns.Ns[i].Header().Name)
+			if ok {
+				l += 1 - k
+			}
+			compressionLenHelper(compression, dns.Ns[i].Header().Name)
+			k, ok = compressionLenSearchType(compression, dns.Ns[i])
+			if ok {
+				l += 1 - k
+			}
+			compressionLenHelperType(compression, dns.Ns[i])
+		}
+	}
+	for i := 0; i < len(dns.Extra); i++ {
+		if dns.Extra[i] == nil {
+			continue
+		}
+		l += dns.Extra[i].len()
+		if dns.Compress {
+			k, ok := compressionLenSearch(compression, dns.Extra[i].Header().Name)
+			if ok {
+				l += 1 - k
+			}
+			compressionLenHelper(compression, dns.Extra[i].Header().Name)
+			k, ok = compressionLenSearchType(compression, dns.Extra[i])
+			if ok {
+				l += 1 - k
+			}
+			compressionLenHelperType(compression, dns.Extra[i])
+		}
+	}
+	return l
+}
+
+// Put the parts of the name in the compression map.
+func compressionLenHelper(c map[string]int, s string) {
+	pref := ""
+	lbs := Split(s)
+	for j := len(lbs) - 1; j >= 0; j-- {
+		pref = s[lbs[j]:]
+		if _, ok := c[pref]; !ok {
+			c[pref] = len(pref)
+		}
+	}
+}
+
+// Look for each part in the compression map and returns its length,
+// keep on searching so we get the longest match.
+func compressionLenSearch(c map[string]int, s string) (int, bool) {
+	off := 0
+	end := false
+	if s == "" { // don't bork on bogus data
+		return 0, false
+	}
+	for {
+		if _, ok := c[s[off:]]; ok {
+			return len(s[off:]), true
+		}
+		if end {
+			break
+		}
+		off, end = NextLabel(s, off)
+	}
+	return 0, false
+}
+
+// TODO(miek): should add all types, because the all can be *used* for compression. Autogenerate from msg_generate and put in zmsg.go
+func compressionLenHelperType(c map[string]int, r RR) {
+	switch x := r.(type) {
+	case *NS:
+		compressionLenHelper(c, x.Ns)
+	case *MX:
+		compressionLenHelper(c, x.Mx)
+	case *CNAME:
+		compressionLenHelper(c, x.Target)
+	case *PTR:
+		compressionLenHelper(c, x.Ptr)
+	case *SOA:
+		compressionLenHelper(c, x.Ns)
+		compressionLenHelper(c, x.Mbox)
+	case *MB:
+		compressionLenHelper(c, x.Mb)
+	case *MG:
+		compressionLenHelper(c, x.Mg)
+	case *MR:
+		compressionLenHelper(c, x.Mr)
+	case *MF:
+		compressionLenHelper(c, x.Mf)
+	case *MD:
+		compressionLenHelper(c, x.Md)
+	case *RT:
+		compressionLenHelper(c, x.Host)
+	case *RP:
+		compressionLenHelper(c, x.Mbox)
+		compressionLenHelper(c, x.Txt)
+	case *MINFO:
+		compressionLenHelper(c, x.Rmail)
+		compressionLenHelper(c, x.Email)
+	case *AFSDB:
+		compressionLenHelper(c, x.Hostname)
+	case *SRV:
+		compressionLenHelper(c, x.Target)
+	case *NAPTR:
+		compressionLenHelper(c, x.Replacement)
+	case *RRSIG:
+		compressionLenHelper(c, x.SignerName)
+	case *NSEC:
+		compressionLenHelper(c, x.NextDomain)
+		// HIP?
+	}
+}
+
+// Only search on compressing these types.
+func compressionLenSearchType(c map[string]int, r RR) (int, bool) {
+	switch x := r.(type) {
+	case *NS:
+		return compressionLenSearch(c, x.Ns)
+	case *MX:
+		return compressionLenSearch(c, x.Mx)
+	case *CNAME:
+		return compressionLenSearch(c, x.Target)
+	case *DNAME:
+		return compressionLenSearch(c, x.Target)
+	case *PTR:
+		return compressionLenSearch(c, x.Ptr)
+	case *SOA:
+		k, ok := compressionLenSearch(c, x.Ns)
+		k1, ok1 := compressionLenSearch(c, x.Mbox)
+		if !ok && !ok1 {
+			return 0, false
+		}
+		return k + k1, true
+	case *MB:
+		return compressionLenSearch(c, x.Mb)
+	case *MG:
+		return compressionLenSearch(c, x.Mg)
+	case *MR:
+		return compressionLenSearch(c, x.Mr)
+	case *MF:
+		return compressionLenSearch(c, x.Mf)
+	case *MD:
+		return compressionLenSearch(c, x.Md)
+	case *RT:
+		return compressionLenSearch(c, x.Host)
+	case *MINFO:
+		k, ok := compressionLenSearch(c, x.Rmail)
+		k1, ok1 := compressionLenSearch(c, x.Email)
+		if !ok && !ok1 {
+			return 0, false
+		}
+		return k + k1, true
+	case *AFSDB:
+		return compressionLenSearch(c, x.Hostname)
+	}
+	return 0, false
+}
+
+// Copy returns a new RR which is a deep-copy of r.
+func Copy(r RR) RR { r1 := r.copy(); return r1 }
+
+// Len returns the length (in octets) of the uncompressed RR in wire format.
+func Len(r RR) int { return r.len() }
+
+// Copy returns a new *Msg which is a deep-copy of dns.
+func (dns *Msg) Copy() *Msg { return dns.CopyTo(new(Msg)) }
+
+// CopyTo copies the contents to the provided message using a deep-copy and returns the copy.
+func (dns *Msg) CopyTo(r1 *Msg) *Msg {
+	r1.MsgHdr = dns.MsgHdr
+	r1.Compress = dns.Compress
+
+	if len(dns.Question) > 0 {
+		r1.Question = make([]Question, len(dns.Question))
+		copy(r1.Question, dns.Question) // TODO(miek): Question is an immutable value, ok to do a shallow-copy
+	}
+
+	rrArr := make([]RR, len(dns.Answer)+len(dns.Ns)+len(dns.Extra))
+	var rri int
+
+	if len(dns.Answer) > 0 {
+		rrbegin := rri
+		for i := 0; i < len(dns.Answer); i++ {
+			rrArr[rri] = dns.Answer[i].copy()
+			rri++
+		}
+		r1.Answer = rrArr[rrbegin:rri:rri]
+	}
+
+	if len(dns.Ns) > 0 {
+		rrbegin := rri
+		for i := 0; i < len(dns.Ns); i++ {
+			rrArr[rri] = dns.Ns[i].copy()
+			rri++
+		}
+		r1.Ns = rrArr[rrbegin:rri:rri]
+	}
+
+	if len(dns.Extra) > 0 {
+		rrbegin := rri
+		for i := 0; i < len(dns.Extra); i++ {
+			rrArr[rri] = dns.Extra[i].copy()
+			rri++
+		}
+		r1.Extra = rrArr[rrbegin:rri:rri]
+	}
+
+	return r1
+}
+
+func (q *Question) pack(msg []byte, off int, compression map[string]int, compress bool) (int, error) {
+	off, err := PackDomainName(q.Name, msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint16(q.Qtype, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint16(q.Qclass, msg, off)
+	if err != nil {
+		return off, err
+	}
+	return off, nil
+}
+
+func unpackQuestion(msg []byte, off int) (Question, int, error) {
+	var (
+		q   Question
+		err error
+	)
+	q.Name, off, err = UnpackDomainName(msg, off)
+	if err != nil {
+		return q, off, err
+	}
+	if off == len(msg) {
+		return q, off, nil
+	}
+	q.Qtype, off, err = unpackUint16(msg, off)
+	if err != nil {
+		return q, off, err
+	}
+	if off == len(msg) {
+		return q, off, nil
+	}
+	q.Qclass, off, err = unpackUint16(msg, off)
+	if off == len(msg) {
+		return q, off, nil
+	}
+	return q, off, err
+}
+
+func (dh *Header) pack(msg []byte, off int, compression map[string]int, compress bool) (int, error) {
+	off, err := packUint16(dh.Id, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint16(dh.Bits, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint16(dh.Qdcount, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint16(dh.Ancount, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint16(dh.Nscount, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint16(dh.Arcount, msg, off)
+	return off, err
+}
+
+func unpackMsgHdr(msg []byte, off int) (Header, int, error) {
+	var (
+		dh  Header
+		err error
+	)
+	dh.Id, off, err = unpackUint16(msg, off)
+	if err != nil {
+		return dh, off, err
+	}
+	dh.Bits, off, err = unpackUint16(msg, off)
+	if err != nil {
+		return dh, off, err
+	}
+	dh.Qdcount, off, err = unpackUint16(msg, off)
+	if err != nil {
+		return dh, off, err
+	}
+	dh.Ancount, off, err = unpackUint16(msg, off)
+	if err != nil {
+		return dh, off, err
+	}
+	dh.Nscount, off, err = unpackUint16(msg, off)
+	if err != nil {
+		return dh, off, err
+	}
+	dh.Arcount, off, err = unpackUint16(msg, off)
+	return dh, off, err
+}
diff --git a/vendor/github.com/miekg/dns/msg_generate.go b/vendor/github.com/miekg/dns/msg_generate.go
new file mode 100644
index 000000000..35786f22c
--- /dev/null
+++ b/vendor/github.com/miekg/dns/msg_generate.go
@@ -0,0 +1,340 @@
+//+build ignore
+
+// msg_generate.go is meant to run with go generate. It will use
+// go/{importer,types} to track down all the RR struct types. Then for each type
+// it will generate pack/unpack methods based on the struct tags. The generated source is
+// written to zmsg.go, and is meant to be checked into git.
+package main
+
+import (
+	"bytes"
+	"fmt"
+	"go/format"
+	"go/importer"
+	"go/types"
+	"log"
+	"os"
+	"strings"
+)
+
+var packageHdr = `
+// *** DO NOT MODIFY ***
+// AUTOGENERATED BY go generate from msg_generate.go
+
+package dns
+
+`
+
+// getTypeStruct will take a type and the package scope, and return the
+// (innermost) struct if the type is considered a RR type (currently defined as
+// those structs beginning with a RR_Header, could be redefined as implementing
+// the RR interface). The bool return value indicates if embedded structs were
+// resolved.
+func getTypeStruct(t types.Type, scope *types.Scope) (*types.Struct, bool) {
+	st, ok := t.Underlying().(*types.Struct)
+	if !ok {
+		return nil, false
+	}
+	if st.Field(0).Type() == scope.Lookup("RR_Header").Type() {
+		return st, false
+	}
+	if st.Field(0).Anonymous() {
+		st, _ := getTypeStruct(st.Field(0).Type(), scope)
+		return st, true
+	}
+	return nil, false
+}
+
+func main() {
+	// Import and type-check the package
+	pkg, err := importer.Default().Import("github.com/miekg/dns")
+	fatalIfErr(err)
+	scope := pkg.Scope()
+
+	// Collect actual types (*X)
+	var namedTypes []string
+	for _, name := range scope.Names() {
+		o := scope.Lookup(name)
+		if o == nil || !o.Exported() {
+			continue
+		}
+		if st, _ := getTypeStruct(o.Type(), scope); st == nil {
+			continue
+		}
+		if name == "PrivateRR" {
+			continue
+		}
+
+		// Check if corresponding TypeX exists
+		if scope.Lookup("Type"+o.Name()) == nil && o.Name() != "RFC3597" {
+			log.Fatalf("Constant Type%s does not exist.", o.Name())
+		}
+
+		namedTypes = append(namedTypes, o.Name())
+	}
+
+	b := &bytes.Buffer{}
+	b.WriteString(packageHdr)
+
+	fmt.Fprint(b, "// pack*() functions\n\n")
+	for _, name := range namedTypes {
+		o := scope.Lookup(name)
+		st, _ := getTypeStruct(o.Type(), scope)
+
+		fmt.Fprintf(b, "func (rr *%s) pack(msg []byte, off int, compression map[string]int, compress bool) (int, error) {\n", name)
+		fmt.Fprint(b, `off, err := rr.Hdr.pack(msg, off, compression, compress)
+if err != nil {
+	return off, err
+}
+headerEnd := off
+`)
+		for i := 1; i < st.NumFields(); i++ {
+			o := func(s string) {
+				fmt.Fprintf(b, s, st.Field(i).Name())
+				fmt.Fprint(b, `if err != nil {
+return off, err
+}
+`)
+			}
+
+			if _, ok := st.Field(i).Type().(*types.Slice); ok {
+				switch st.Tag(i) {
+				case `dns:"-"`: // ignored
+				case `dns:"txt"`:
+					o("off, err = packStringTxt(rr.%s, msg, off)\n")
+				case `dns:"opt"`:
+					o("off, err = packDataOpt(rr.%s, msg, off)\n")
+				case `dns:"nsec"`:
+					o("off, err = packDataNsec(rr.%s, msg, off)\n")
+				case `dns:"domain-name"`:
+					o("off, err = packDataDomainNames(rr.%s, msg, off, compression, compress)\n")
+				default:
+					log.Fatalln(name, st.Field(i).Name(), st.Tag(i))
+				}
+				continue
+			}
+
+			switch {
+			case st.Tag(i) == `dns:"-"`: // ignored
+			case st.Tag(i) == `dns:"cdomain-name"`:
+				fallthrough
+			case st.Tag(i) == `dns:"domain-name"`:
+				o("off, err = PackDomainName(rr.%s, msg, off, compression, compress)\n")
+			case st.Tag(i) == `dns:"a"`:
+				o("off, err = packDataA(rr.%s, msg, off)\n")
+			case st.Tag(i) == `dns:"aaaa"`:
+				o("off, err = packDataAAAA(rr.%s, msg, off)\n")
+			case st.Tag(i) == `dns:"uint48"`:
+				o("off, err = packUint48(rr.%s, msg, off)\n")
+			case st.Tag(i) == `dns:"txt"`:
+				o("off, err = packString(rr.%s, msg, off)\n")
+
+			case strings.HasPrefix(st.Tag(i), `dns:"size-base32`): // size-base32 can be packed just like base32
+				fallthrough
+			case st.Tag(i) == `dns:"base32"`:
+				o("off, err = packStringBase32(rr.%s, msg, off)\n")
+
+			case strings.HasPrefix(st.Tag(i), `dns:"size-base64`): // size-base64 can be packed just like base64
+				fallthrough
+			case st.Tag(i) == `dns:"base64"`:
+				o("off, err = packStringBase64(rr.%s, msg, off)\n")
+
+			case strings.HasPrefix(st.Tag(i), `dns:"size-hex:SaltLength`): // Hack to fix empty salt length for NSEC3
+				o("if rr.%s == \"-\" { /* do nothing, empty salt */ }\n")
+				continue
+			case strings.HasPrefix(st.Tag(i), `dns:"size-hex`): // size-hex can be packed just like hex
+				fallthrough
+			case st.Tag(i) == `dns:"hex"`:
+				o("off, err = packStringHex(rr.%s, msg, off)\n")
+
+			case st.Tag(i) == `dns:"octet"`:
+				o("off, err = packStringOctet(rr.%s, msg, off)\n")
+			case st.Tag(i) == "":
+				switch st.Field(i).Type().(*types.Basic).Kind() {
+				case types.Uint8:
+					o("off, err = packUint8(rr.%s, msg, off)\n")
+				case types.Uint16:
+					o("off, err = packUint16(rr.%s, msg, off)\n")
+				case types.Uint32:
+					o("off, err = packUint32(rr.%s, msg, off)\n")
+				case types.Uint64:
+					o("off, err = packUint64(rr.%s, msg, off)\n")
+				case types.String:
+					o("off, err = packString(rr.%s, msg, off)\n")
+				default:
+					log.Fatalln(name, st.Field(i).Name())
+				}
+			default:
+				log.Fatalln(name, st.Field(i).Name(), st.Tag(i))
+			}
+		}
+		// We have packed everything, only now we know the rdlength of this RR
+		fmt.Fprintln(b, "rr.Header().Rdlength = uint16(off-headerEnd)")
+		fmt.Fprintln(b, "return off, nil }\n")
+	}
+
+	fmt.Fprint(b, "// unpack*() functions\n\n")
+	for _, name := range namedTypes {
+		o := scope.Lookup(name)
+		st, _ := getTypeStruct(o.Type(), scope)
+
+		fmt.Fprintf(b, "func unpack%s(h RR_Header, msg []byte, off int) (RR, int, error) {\n", name)
+		fmt.Fprintf(b, "rr := new(%s)\n", name)
+		fmt.Fprint(b, "rr.Hdr = h\n")
+		fmt.Fprint(b, `if noRdata(h) {
+return rr, off, nil
+	}
+var err error
+rdStart := off
+_ = rdStart
+
+`)
+		for i := 1; i < st.NumFields(); i++ {
+			o := func(s string) {
+				fmt.Fprintf(b, s, st.Field(i).Name())
+				fmt.Fprint(b, `if err != nil {
+return rr, off, err
+}
+`)
+			}
+
+			// size-* are special, because they reference a struct member we should use for the length.
+			if strings.HasPrefix(st.Tag(i), `dns:"size-`) {
+				structMember := structMember(st.Tag(i))
+				structTag := structTag(st.Tag(i))
+				switch structTag {
+				case "hex":
+					fmt.Fprintf(b, "rr.%s, off, err = unpackStringHex(msg, off, off + int(rr.%s))\n", st.Field(i).Name(), structMember)
+				case "base32":
+					fmt.Fprintf(b, "rr.%s, off, err = unpackStringBase32(msg, off, off + int(rr.%s))\n", st.Field(i).Name(), structMember)
+				case "base64":
+					fmt.Fprintf(b, "rr.%s, off, err = unpackStringBase64(msg, off, off + int(rr.%s))\n", st.Field(i).Name(), structMember)
+				default:
+					log.Fatalln(name, st.Field(i).Name(), st.Tag(i))
+				}
+				fmt.Fprint(b, `if err != nil {
+return rr, off, err
+}
+`)
+				continue
+			}
+
+			if _, ok := st.Field(i).Type().(*types.Slice); ok {
+				switch st.Tag(i) {
+				case `dns:"-"`: // ignored
+				case `dns:"txt"`:
+					o("rr.%s, off, err = unpackStringTxt(msg, off)\n")
+				case `dns:"opt"`:
+					o("rr.%s, off, err = unpackDataOpt(msg, off)\n")
+				case `dns:"nsec"`:
+					o("rr.%s, off, err = unpackDataNsec(msg, off)\n")
+				case `dns:"domain-name"`:
+					o("rr.%s, off, err = unpackDataDomainNames(msg, off, rdStart + int(rr.Hdr.Rdlength))\n")
+				default:
+					log.Fatalln(name, st.Field(i).Name(), st.Tag(i))
+				}
+				continue
+			}
+
+			switch st.Tag(i) {
+			case `dns:"-"`: // ignored
+			case `dns:"cdomain-name"`:
+				fallthrough
+			case `dns:"domain-name"`:
+				o("rr.%s, off, err = UnpackDomainName(msg, off)\n")
+			case `dns:"a"`:
+				o("rr.%s, off, err = unpackDataA(msg, off)\n")
+			case `dns:"aaaa"`:
+				o("rr.%s, off, err = unpackDataAAAA(msg, off)\n")
+			case `dns:"uint48"`:
+				o("rr.%s, off, err = unpackUint48(msg, off)\n")
+			case `dns:"txt"`:
+				o("rr.%s, off, err = unpackString(msg, off)\n")
+			case `dns:"base32"`:
+				o("rr.%s, off, err = unpackStringBase32(msg, off, rdStart + int(rr.Hdr.Rdlength))\n")
+			case `dns:"base64"`:
+				o("rr.%s, off, err = unpackStringBase64(msg, off, rdStart + int(rr.Hdr.Rdlength))\n")
+			case `dns:"hex"`:
+				o("rr.%s, off, err = unpackStringHex(msg, off, rdStart + int(rr.Hdr.Rdlength))\n")
+			case `dns:"octet"`:
+				o("rr.%s, off, err = unpackStringOctet(msg, off)\n")
+			case "":
+				switch st.Field(i).Type().(*types.Basic).Kind() {
+				case types.Uint8:
+					o("rr.%s, off, err = unpackUint8(msg, off)\n")
+				case types.Uint16:
+					o("rr.%s, off, err = unpackUint16(msg, off)\n")
+				case types.Uint32:
+					o("rr.%s, off, err = unpackUint32(msg, off)\n")
+				case types.Uint64:
+					o("rr.%s, off, err = unpackUint64(msg, off)\n")
+				case types.String:
+					o("rr.%s, off, err = unpackString(msg, off)\n")
+				default:
+					log.Fatalln(name, st.Field(i).Name())
+				}
+			default:
+				log.Fatalln(name, st.Field(i).Name(), st.Tag(i))
+			}
+			// If we've hit len(msg) we return without error.
+			if i < st.NumFields()-1 {
+				fmt.Fprintf(b, `if off == len(msg) {
+return rr, off, nil
+	}
+`)
+			}
+		}
+		fmt.Fprintf(b, "return rr, off, err }\n\n")
+	}
+	// Generate typeToUnpack map
+	fmt.Fprintln(b, "var typeToUnpack = map[uint16]func(RR_Header, []byte, int) (RR, int, error){")
+	for _, name := range namedTypes {
+		if name == "RFC3597" {
+			continue
+		}
+		fmt.Fprintf(b, "Type%s: unpack%s,\n", name, name)
+	}
+	fmt.Fprintln(b, "}\n")
+
+	// gofmt
+	res, err := format.Source(b.Bytes())
+	if err != nil {
+		b.WriteTo(os.Stderr)
+		log.Fatal(err)
+	}
+
+	// write result
+	f, err := os.Create("zmsg.go")
+	fatalIfErr(err)
+	defer f.Close()
+	f.Write(res)
+}
+
+// structMember will take a tag like dns:"size-base32:SaltLength" and return the last part of this string.
+func structMember(s string) string {
+	fields := strings.Split(s, ":")
+	if len(fields) == 0 {
+		return ""
+	}
+	f := fields[len(fields)-1]
+	// f should have a closing "
+	if len(f) > 1 {
+		return f[:len(f)-1]
+	}
+	return f
+}
+
+// structTag will take a tag like dns:"size-base32:SaltLength" and return base32.
+func structTag(s string) string {
+	fields := strings.Split(s, ":")
+	if len(fields) < 2 {
+		return ""
+	}
+	return fields[1][len("\"size-"):]
+}
+
+func fatalIfErr(err error) {
+	if err != nil {
+		log.Fatal(err)
+	}
+}
diff --git a/vendor/github.com/miekg/dns/msg_helpers.go b/vendor/github.com/miekg/dns/msg_helpers.go
new file mode 100644
index 000000000..e7a9500cc
--- /dev/null
+++ b/vendor/github.com/miekg/dns/msg_helpers.go
@@ -0,0 +1,630 @@
+package dns
+
+import (
+	"encoding/base32"
+	"encoding/base64"
+	"encoding/binary"
+	"encoding/hex"
+	"net"
+	"strconv"
+)
+
+// helper functions called from the generated zmsg.go
+
+// These function are named after the tag to help pack/unpack, if there is no tag it is the name
+// of the type they pack/unpack (string, int, etc). We prefix all with unpackData or packData, so packDataA or
+// packDataDomainName.
+
+func unpackDataA(msg []byte, off int) (net.IP, int, error) {
+	if off+net.IPv4len > len(msg) {
+		return nil, len(msg), &Error{err: "overflow unpacking a"}
+	}
+	a := append(make(net.IP, 0, net.IPv4len), msg[off:off+net.IPv4len]...)
+	off += net.IPv4len
+	return a, off, nil
+}
+
+func packDataA(a net.IP, msg []byte, off int) (int, error) {
+	// It must be a slice of 4, even if it is 16, we encode only the first 4
+	if off+net.IPv4len > len(msg) {
+		return len(msg), &Error{err: "overflow packing a"}
+	}
+	switch len(a) {
+	case net.IPv4len, net.IPv6len:
+		copy(msg[off:], a.To4())
+		off += net.IPv4len
+	case 0:
+		// Allowed, for dynamic updates.
+	default:
+		return len(msg), &Error{err: "overflow packing a"}
+	}
+	return off, nil
+}
+
+func unpackDataAAAA(msg []byte, off int) (net.IP, int, error) {
+	if off+net.IPv6len > len(msg) {
+		return nil, len(msg), &Error{err: "overflow unpacking aaaa"}
+	}
+	aaaa := append(make(net.IP, 0, net.IPv6len), msg[off:off+net.IPv6len]...)
+	off += net.IPv6len
+	return aaaa, off, nil
+}
+
+func packDataAAAA(aaaa net.IP, msg []byte, off int) (int, error) {
+	if off+net.IPv6len > len(msg) {
+		return len(msg), &Error{err: "overflow packing aaaa"}
+	}
+
+	switch len(aaaa) {
+	case net.IPv6len:
+		copy(msg[off:], aaaa)
+		off += net.IPv6len
+	case 0:
+		// Allowed, dynamic updates.
+	default:
+		return len(msg), &Error{err: "overflow packing aaaa"}
+	}
+	return off, nil
+}
+
+// unpackHeader unpacks an RR header, returning the offset to the end of the header and a
+// re-sliced msg according to the expected length of the RR.
+func unpackHeader(msg []byte, off int) (rr RR_Header, off1 int, truncmsg []byte, err error) {
+	hdr := RR_Header{}
+	if off == len(msg) {
+		return hdr, off, msg, nil
+	}
+
+	hdr.Name, off, err = UnpackDomainName(msg, off)
+	if err != nil {
+		return hdr, len(msg), msg, err
+	}
+	hdr.Rrtype, off, err = unpackUint16(msg, off)
+	if err != nil {
+		return hdr, len(msg), msg, err
+	}
+	hdr.Class, off, err = unpackUint16(msg, off)
+	if err != nil {
+		return hdr, len(msg), msg, err
+	}
+	hdr.Ttl, off, err = unpackUint32(msg, off)
+	if err != nil {
+		return hdr, len(msg), msg, err
+	}
+	hdr.Rdlength, off, err = unpackUint16(msg, off)
+	if err != nil {
+		return hdr, len(msg), msg, err
+	}
+	msg, err = truncateMsgFromRdlength(msg, off, hdr.Rdlength)
+	return hdr, off, msg, nil
+}
+
+// pack packs an RR header, returning the offset to the end of the header.
+// See PackDomainName for documentation about the compression.
+func (hdr RR_Header) pack(msg []byte, off int, compression map[string]int, compress bool) (off1 int, err error) {
+	if off == len(msg) {
+		return off, nil
+	}
+
+	off, err = PackDomainName(hdr.Name, msg, off, compression, compress)
+	if err != nil {
+		return len(msg), err
+	}
+	off, err = packUint16(hdr.Rrtype, msg, off)
+	if err != nil {
+		return len(msg), err
+	}
+	off, err = packUint16(hdr.Class, msg, off)
+	if err != nil {
+		return len(msg), err
+	}
+	off, err = packUint32(hdr.Ttl, msg, off)
+	if err != nil {
+		return len(msg), err
+	}
+	off, err = packUint16(hdr.Rdlength, msg, off)
+	if err != nil {
+		return len(msg), err
+	}
+	return off, nil
+}
+
+// helper helper functions.
+
+// truncateMsgFromRdLength truncates msg to match the expected length of the RR.
+// Returns an error if msg is smaller than the expected size.
+func truncateMsgFromRdlength(msg []byte, off int, rdlength uint16) (truncmsg []byte, err error) {
+	lenrd := off + int(rdlength)
+	if lenrd > len(msg) {
+		return msg, &Error{err: "overflowing header size"}
+	}
+	return msg[:lenrd], nil
+}
+
+func fromBase32(s []byte) (buf []byte, err error) {
+	buflen := base32.HexEncoding.DecodedLen(len(s))
+	buf = make([]byte, buflen)
+	n, err := base32.HexEncoding.Decode(buf, s)
+	buf = buf[:n]
+	return
+}
+
+func toBase32(b []byte) string { return base32.HexEncoding.EncodeToString(b) }
+
+func fromBase64(s []byte) (buf []byte, err error) {
+	buflen := base64.StdEncoding.DecodedLen(len(s))
+	buf = make([]byte, buflen)
+	n, err := base64.StdEncoding.Decode(buf, s)
+	buf = buf[:n]
+	return
+}
+
+func toBase64(b []byte) string { return base64.StdEncoding.EncodeToString(b) }
+
+// dynamicUpdate returns true if the Rdlength is zero.
+func noRdata(h RR_Header) bool { return h.Rdlength == 0 }
+
+func unpackUint8(msg []byte, off int) (i uint8, off1 int, err error) {
+	if off+1 > len(msg) {
+		return 0, len(msg), &Error{err: "overflow unpacking uint8"}
+	}
+	return uint8(msg[off]), off + 1, nil
+}
+
+func packUint8(i uint8, msg []byte, off int) (off1 int, err error) {
+	if off+1 > len(msg) {
+		return len(msg), &Error{err: "overflow packing uint8"}
+	}
+	msg[off] = byte(i)
+	return off + 1, nil
+}
+
+func unpackUint16(msg []byte, off int) (i uint16, off1 int, err error) {
+	if off+2 > len(msg) {
+		return 0, len(msg), &Error{err: "overflow unpacking uint16"}
+	}
+	return binary.BigEndian.Uint16(msg[off:]), off + 2, nil
+}
+
+func packUint16(i uint16, msg []byte, off int) (off1 int, err error) {
+	if off+2 > len(msg) {
+		return len(msg), &Error{err: "overflow packing uint16"}
+	}
+	binary.BigEndian.PutUint16(msg[off:], i)
+	return off + 2, nil
+}
+
+func unpackUint32(msg []byte, off int) (i uint32, off1 int, err error) {
+	if off+4 > len(msg) {
+		return 0, len(msg), &Error{err: "overflow unpacking uint32"}
+	}
+	return binary.BigEndian.Uint32(msg[off:]), off + 4, nil
+}
+
+func packUint32(i uint32, msg []byte, off int) (off1 int, err error) {
+	if off+4 > len(msg) {
+		return len(msg), &Error{err: "overflow packing uint32"}
+	}
+	binary.BigEndian.PutUint32(msg[off:], i)
+	return off + 4, nil
+}
+
+func unpackUint48(msg []byte, off int) (i uint64, off1 int, err error) {
+	if off+6 > len(msg) {
+		return 0, len(msg), &Error{err: "overflow unpacking uint64 as uint48"}
+	}
+	// Used in TSIG where the last 48 bits are occupied, so for now, assume a uint48 (6 bytes)
+	i = (uint64(uint64(msg[off])<<40 | uint64(msg[off+1])<<32 | uint64(msg[off+2])<<24 | uint64(msg[off+3])<<16 |
+		uint64(msg[off+4])<<8 | uint64(msg[off+5])))
+	off += 6
+	return i, off, nil
+}
+
+func packUint48(i uint64, msg []byte, off int) (off1 int, err error) {
+	if off+6 > len(msg) {
+		return len(msg), &Error{err: "overflow packing uint64 as uint48"}
+	}
+	msg[off] = byte(i >> 40)
+	msg[off+1] = byte(i >> 32)
+	msg[off+2] = byte(i >> 24)
+	msg[off+3] = byte(i >> 16)
+	msg[off+4] = byte(i >> 8)
+	msg[off+5] = byte(i)
+	off += 6
+	return off, nil
+}
+
+func unpackUint64(msg []byte, off int) (i uint64, off1 int, err error) {
+	if off+8 > len(msg) {
+		return 0, len(msg), &Error{err: "overflow unpacking uint64"}
+	}
+	return binary.BigEndian.Uint64(msg[off:]), off + 8, nil
+}
+
+func packUint64(i uint64, msg []byte, off int) (off1 int, err error) {
+	if off+8 > len(msg) {
+		return len(msg), &Error{err: "overflow packing uint64"}
+	}
+	binary.BigEndian.PutUint64(msg[off:], i)
+	off += 8
+	return off, nil
+}
+
+func unpackString(msg []byte, off int) (string, int, error) {
+	if off+1 > len(msg) {
+		return "", off, &Error{err: "overflow unpacking txt"}
+	}
+	l := int(msg[off])
+	if off+l+1 > len(msg) {
+		return "", off, &Error{err: "overflow unpacking txt"}
+	}
+	s := make([]byte, 0, l)
+	for _, b := range msg[off+1 : off+1+l] {
+		switch b {
+		case '"', '\\':
+			s = append(s, '\\', b)
+		case '\t', '\r', '\n':
+			s = append(s, b)
+		default:
+			if b < 32 || b > 127 { // unprintable
+				var buf [3]byte
+				bufs := strconv.AppendInt(buf[:0], int64(b), 10)
+				s = append(s, '\\')
+				for i := 0; i < 3-len(bufs); i++ {
+					s = append(s, '0')
+				}
+				for _, r := range bufs {
+					s = append(s, r)
+				}
+			} else {
+				s = append(s, b)
+			}
+		}
+	}
+	off += 1 + l
+	return string(s), off, nil
+}
+
+func packString(s string, msg []byte, off int) (int, error) {
+	txtTmp := make([]byte, 256*4+1)
+	off, err := packTxtString(s, msg, off, txtTmp)
+	if err != nil {
+		return len(msg), err
+	}
+	return off, nil
+}
+
+func unpackStringBase32(msg []byte, off, end int) (string, int, error) {
+	if end > len(msg) {
+		return "", len(msg), &Error{err: "overflow unpacking base32"}
+	}
+	s := toBase32(msg[off:end])
+	return s, end, nil
+}
+
+func packStringBase32(s string, msg []byte, off int) (int, error) {
+	b32, err := fromBase32([]byte(s))
+	if err != nil {
+		return len(msg), err
+	}
+	if off+len(b32) > len(msg) {
+		return len(msg), &Error{err: "overflow packing base32"}
+	}
+	copy(msg[off:off+len(b32)], b32)
+	off += len(b32)
+	return off, nil
+}
+
+func unpackStringBase64(msg []byte, off, end int) (string, int, error) {
+	// Rest of the RR is base64 encoded value, so we don't need an explicit length
+	// to be set. Thus far all RR's that have base64 encoded fields have those as their
+	// last one. What we do need is the end of the RR!
+	if end > len(msg) {
+		return "", len(msg), &Error{err: "overflow unpacking base64"}
+	}
+	s := toBase64(msg[off:end])
+	return s, end, nil
+}
+
+func packStringBase64(s string, msg []byte, off int) (int, error) {
+	b64, err := fromBase64([]byte(s))
+	if err != nil {
+		return len(msg), err
+	}
+	if off+len(b64) > len(msg) {
+		return len(msg), &Error{err: "overflow packing base64"}
+	}
+	copy(msg[off:off+len(b64)], b64)
+	off += len(b64)
+	return off, nil
+}
+
+func unpackStringHex(msg []byte, off, end int) (string, int, error) {
+	// Rest of the RR is hex encoded value, so we don't need an explicit length
+	// to be set. NSEC and TSIG have hex fields with a length field.
+	// What we do need is the end of the RR!
+	if end > len(msg) {
+		return "", len(msg), &Error{err: "overflow unpacking hex"}
+	}
+
+	s := hex.EncodeToString(msg[off:end])
+	return s, end, nil
+}
+
+func packStringHex(s string, msg []byte, off int) (int, error) {
+	h, err := hex.DecodeString(s)
+	if err != nil {
+		return len(msg), err
+	}
+	if off+(len(h)) > len(msg) {
+		return len(msg), &Error{err: "overflow packing hex"}
+	}
+	copy(msg[off:off+len(h)], h)
+	off += len(h)
+	return off, nil
+}
+
+func unpackStringTxt(msg []byte, off int) ([]string, int, error) {
+	txt, off, err := unpackTxt(msg, off)
+	if err != nil {
+		return nil, len(msg), err
+	}
+	return txt, off, nil
+}
+
+func packStringTxt(s []string, msg []byte, off int) (int, error) {
+	txtTmp := make([]byte, 256*4+1) // If the whole string consists out of \DDD we need this many.
+	off, err := packTxt(s, msg, off, txtTmp)
+	if err != nil {
+		return len(msg), err
+	}
+	return off, nil
+}
+
+func unpackDataOpt(msg []byte, off int) ([]EDNS0, int, error) {
+	var edns []EDNS0
+Option:
+	code := uint16(0)
+	if off+4 > len(msg) {
+		return nil, len(msg), &Error{err: "overflow unpacking opt"}
+	}
+	code = binary.BigEndian.Uint16(msg[off:])
+	off += 2
+	optlen := binary.BigEndian.Uint16(msg[off:])
+	off += 2
+	if off+int(optlen) > len(msg) {
+		return nil, len(msg), &Error{err: "overflow unpacking opt"}
+	}
+	switch code {
+	case EDNS0NSID:
+		e := new(EDNS0_NSID)
+		if err := e.unpack(msg[off : off+int(optlen)]); err != nil {
+			return nil, len(msg), err
+		}
+		edns = append(edns, e)
+		off += int(optlen)
+	case EDNS0SUBNET, EDNS0SUBNETDRAFT:
+		e := new(EDNS0_SUBNET)
+		if err := e.unpack(msg[off : off+int(optlen)]); err != nil {
+			return nil, len(msg), err
+		}
+		edns = append(edns, e)
+		off += int(optlen)
+		if code == EDNS0SUBNETDRAFT {
+			e.DraftOption = true
+		}
+	case EDNS0COOKIE:
+		e := new(EDNS0_COOKIE)
+		if err := e.unpack(msg[off : off+int(optlen)]); err != nil {
+			return nil, len(msg), err
+		}
+		edns = append(edns, e)
+		off += int(optlen)
+	case EDNS0UL:
+		e := new(EDNS0_UL)
+		if err := e.unpack(msg[off : off+int(optlen)]); err != nil {
+			return nil, len(msg), err
+		}
+		edns = append(edns, e)
+		off += int(optlen)
+	case EDNS0LLQ:
+		e := new(EDNS0_LLQ)
+		if err := e.unpack(msg[off : off+int(optlen)]); err != nil {
+			return nil, len(msg), err
+		}
+		edns = append(edns, e)
+		off += int(optlen)
+	case EDNS0DAU:
+		e := new(EDNS0_DAU)
+		if err := e.unpack(msg[off : off+int(optlen)]); err != nil {
+			return nil, len(msg), err
+		}
+		edns = append(edns, e)
+		off += int(optlen)
+	case EDNS0DHU:
+		e := new(EDNS0_DHU)
+		if err := e.unpack(msg[off : off+int(optlen)]); err != nil {
+			return nil, len(msg), err
+		}
+		edns = append(edns, e)
+		off += int(optlen)
+	case EDNS0N3U:
+		e := new(EDNS0_N3U)
+		if err := e.unpack(msg[off : off+int(optlen)]); err != nil {
+			return nil, len(msg), err
+		}
+		edns = append(edns, e)
+		off += int(optlen)
+	default:
+		e := new(EDNS0_LOCAL)
+		e.Code = code
+		if err := e.unpack(msg[off : off+int(optlen)]); err != nil {
+			return nil, len(msg), err
+		}
+		edns = append(edns, e)
+		off += int(optlen)
+	}
+
+	if off < len(msg) {
+		goto Option
+	}
+
+	return edns, off, nil
+}
+
+func packDataOpt(options []EDNS0, msg []byte, off int) (int, error) {
+	for _, el := range options {
+		b, err := el.pack()
+		if err != nil || off+3 > len(msg) {
+			return len(msg), &Error{err: "overflow packing opt"}
+		}
+		binary.BigEndian.PutUint16(msg[off:], el.Option())      // Option code
+		binary.BigEndian.PutUint16(msg[off+2:], uint16(len(b))) // Length
+		off += 4
+		if off+len(b) > len(msg) {
+			copy(msg[off:], b)
+			off = len(msg)
+			continue
+		}
+		// Actual data
+		copy(msg[off:off+len(b)], b)
+		off += len(b)
+	}
+	return off, nil
+}
+
+func unpackStringOctet(msg []byte, off int) (string, int, error) {
+	s := string(msg[off:])
+	return s, len(msg), nil
+}
+
+func packStringOctet(s string, msg []byte, off int) (int, error) {
+	txtTmp := make([]byte, 256*4+1)
+	off, err := packOctetString(s, msg, off, txtTmp)
+	if err != nil {
+		return len(msg), err
+	}
+	return off, nil
+}
+
+func unpackDataNsec(msg []byte, off int) ([]uint16, int, error) {
+	var nsec []uint16
+	length, window, lastwindow := 0, 0, -1
+	for off < len(msg) {
+		if off+2 > len(msg) {
+			return nsec, len(msg), &Error{err: "overflow unpacking nsecx"}
+		}
+		window = int(msg[off])
+		length = int(msg[off+1])
+		off += 2
+		if window <= lastwindow {
+			// RFC 4034: Blocks are present in the NSEC RR RDATA in
+			// increasing numerical order.
+			return nsec, len(msg), &Error{err: "out of order NSEC block"}
+		}
+		if length == 0 {
+			// RFC 4034: Blocks with no types present MUST NOT be included.
+			return nsec, len(msg), &Error{err: "empty NSEC block"}
+		}
+		if length > 32 {
+			return nsec, len(msg), &Error{err: "NSEC block too long"}
+		}
+		if off+length > len(msg) {
+			return nsec, len(msg), &Error{err: "overflowing NSEC block"}
+		}
+
+		// Walk the bytes in the window and extract the type bits
+		for j := 0; j < length; j++ {
+			b := msg[off+j]
+			// Check the bits one by one, and set the type
+			if b&0x80 == 0x80 {
+				nsec = append(nsec, uint16(window*256+j*8+0))
+			}
+			if b&0x40 == 0x40 {
+				nsec = append(nsec, uint16(window*256+j*8+1))
+			}
+			if b&0x20 == 0x20 {
+				nsec = append(nsec, uint16(window*256+j*8+2))
+			}
+			if b&0x10 == 0x10 {
+				nsec = append(nsec, uint16(window*256+j*8+3))
+			}
+			if b&0x8 == 0x8 {
+				nsec = append(nsec, uint16(window*256+j*8+4))
+			}
+			if b&0x4 == 0x4 {
+				nsec = append(nsec, uint16(window*256+j*8+5))
+			}
+			if b&0x2 == 0x2 {
+				nsec = append(nsec, uint16(window*256+j*8+6))
+			}
+			if b&0x1 == 0x1 {
+				nsec = append(nsec, uint16(window*256+j*8+7))
+			}
+		}
+		off += length
+		lastwindow = window
+	}
+	return nsec, off, nil
+}
+
+func packDataNsec(bitmap []uint16, msg []byte, off int) (int, error) {
+	if len(bitmap) == 0 {
+		return off, nil
+	}
+	var lastwindow, lastlength uint16
+	for j := 0; j < len(bitmap); j++ {
+		t := bitmap[j]
+		window := t / 256
+		length := (t-window*256)/8 + 1
+		if window > lastwindow && lastlength != 0 { // New window, jump to the new offset
+			off += int(lastlength) + 2
+			lastlength = 0
+		}
+		if window < lastwindow || length < lastlength {
+			return len(msg), &Error{err: "nsec bits out of order"}
+		}
+		if off+2+int(length) > len(msg) {
+			return len(msg), &Error{err: "overflow packing nsec"}
+		}
+		// Setting the window #
+		msg[off] = byte(window)
+		// Setting the octets length
+		msg[off+1] = byte(length)
+		// Setting the bit value for the type in the right octet
+		msg[off+1+int(length)] |= byte(1 << (7 - (t % 8)))
+		lastwindow, lastlength = window, length
+	}
+	off += int(lastlength) + 2
+	return off, nil
+}
+
+func unpackDataDomainNames(msg []byte, off, end int) ([]string, int, error) {
+	var (
+		servers []string
+		s       string
+		err     error
+	)
+	if end > len(msg) {
+		return nil, len(msg), &Error{err: "overflow unpacking domain names"}
+	}
+	for off < end {
+		s, off, err = UnpackDomainName(msg, off)
+		if err != nil {
+			return servers, len(msg), err
+		}
+		servers = append(servers, s)
+	}
+	return servers, off, nil
+}
+
+func packDataDomainNames(names []string, msg []byte, off int, compression map[string]int, compress bool) (int, error) {
+	var err error
+	for j := 0; j < len(names); j++ {
+		off, err = PackDomainName(names[j], msg, off, compression, false && compress)
+		if err != nil {
+			return len(msg), err
+		}
+	}
+	return off, nil
+}
diff --git a/vendor/github.com/miekg/dns/nsecx.go b/vendor/github.com/miekg/dns/nsecx.go
new file mode 100644
index 000000000..6f10f3e65
--- /dev/null
+++ b/vendor/github.com/miekg/dns/nsecx.go
@@ -0,0 +1,119 @@
+package dns
+
+import (
+	"crypto/sha1"
+	"hash"
+	"io"
+	"strings"
+)
+
+type saltWireFmt struct {
+	Salt string `dns:"size-hex"`
+}
+
+// HashName hashes a string (label) according to RFC 5155. It returns the hashed string in uppercase.
+func HashName(label string, ha uint8, iter uint16, salt string) string {
+	saltwire := new(saltWireFmt)
+	saltwire.Salt = salt
+	wire := make([]byte, DefaultMsgSize)
+	n, err := packSaltWire(saltwire, wire)
+	if err != nil {
+		return ""
+	}
+	wire = wire[:n]
+	name := make([]byte, 255)
+	off, err := PackDomainName(strings.ToLower(label), name, 0, nil, false)
+	if err != nil {
+		return ""
+	}
+	name = name[:off]
+	var s hash.Hash
+	switch ha {
+	case SHA1:
+		s = sha1.New()
+	default:
+		return ""
+	}
+
+	// k = 0
+	name = append(name, wire...)
+	io.WriteString(s, string(name))
+	nsec3 := s.Sum(nil)
+	// k > 0
+	for k := uint16(0); k < iter; k++ {
+		s.Reset()
+		nsec3 = append(nsec3, wire...)
+		io.WriteString(s, string(nsec3))
+		nsec3 = s.Sum(nil)
+	}
+	return toBase32(nsec3)
+}
+
+// Denialer is an interface that should be implemented by types that are used to denial
+// answers in DNSSEC.
+type Denialer interface {
+	// Cover will check if the (unhashed) name is being covered by this NSEC or NSEC3.
+	Cover(name string) bool
+	// Match will check if the ownername matches the (unhashed) name for this NSEC3 or NSEC3.
+	Match(name string) bool
+}
+
+// Cover implements the Denialer interface.
+func (rr *NSEC) Cover(name string) bool {
+	return true
+}
+
+// Match implements the Denialer interface.
+func (rr *NSEC) Match(name string) bool {
+	return true
+}
+
+// Cover implements the Denialer interface.
+func (rr *NSEC3) Cover(name string) bool {
+	// FIXME(miek): check if the zones match
+	// FIXME(miek): check if we're not dealing with parent nsec3
+	hname := HashName(name, rr.Hash, rr.Iterations, rr.Salt)
+	labels := Split(rr.Hdr.Name)
+	if len(labels) < 2 {
+		return false
+	}
+	hash := strings.ToUpper(rr.Hdr.Name[labels[0] : labels[1]-1]) // -1 to remove the dot
+	if hash == rr.NextDomain {
+		return false // empty interval
+	}
+	if hash > rr.NextDomain { // last name, points to apex
+		// hname > hash
+		// hname > rr.NextDomain
+		// TODO(miek)
+	}
+	if hname <= hash {
+		return false
+	}
+	if hname >= rr.NextDomain {
+		return false
+	}
+	return true
+}
+
+// Match implements the Denialer interface.
+func (rr *NSEC3) Match(name string) bool {
+	// FIXME(miek): Check if we are in the same zone
+	hname := HashName(name, rr.Hash, rr.Iterations, rr.Salt)
+	labels := Split(rr.Hdr.Name)
+	if len(labels) < 2 {
+		return false
+	}
+	hash := strings.ToUpper(rr.Hdr.Name[labels[0] : labels[1]-1]) // -1 to remove the .
+	if hash == hname {
+		return true
+	}
+	return false
+}
+
+func packSaltWire(sw *saltWireFmt, msg []byte) (int, error) {
+	off, err := packStringHex(sw.Salt, msg, 0)
+	if err != nil {
+		return off, err
+	}
+	return off, nil
+}
diff --git a/vendor/github.com/miekg/dns/privaterr.go b/vendor/github.com/miekg/dns/privaterr.go
new file mode 100644
index 000000000..6b08e6e95
--- /dev/null
+++ b/vendor/github.com/miekg/dns/privaterr.go
@@ -0,0 +1,149 @@
+package dns
+
+import (
+	"fmt"
+	"strings"
+)
+
+// PrivateRdata is an interface used for implementing "Private Use" RR types, see
+// RFC 6895. This allows one to experiment with new RR types, without requesting an
+// official type code. Also see dns.PrivateHandle and dns.PrivateHandleRemove.
+type PrivateRdata interface {
+	// String returns the text presentaton of the Rdata of the Private RR.
+	String() string
+	// Parse parses the Rdata of the private RR.
+	Parse([]string) error
+	// Pack is used when packing a private RR into a buffer.
+	Pack([]byte) (int, error)
+	// Unpack is used when unpacking a private RR from a buffer.
+	// TODO(miek): diff. signature than Pack, see edns0.go for instance.
+	Unpack([]byte) (int, error)
+	// Copy copies the Rdata.
+	Copy(PrivateRdata) error
+	// Len returns the length in octets of the Rdata.
+	Len() int
+}
+
+// PrivateRR represents an RR that uses a PrivateRdata user-defined type.
+// It mocks normal RRs and implements dns.RR interface.
+type PrivateRR struct {
+	Hdr  RR_Header
+	Data PrivateRdata
+}
+
+func mkPrivateRR(rrtype uint16) *PrivateRR {
+	// Panics if RR is not an instance of PrivateRR.
+	rrfunc, ok := TypeToRR[rrtype]
+	if !ok {
+		panic(fmt.Sprintf("dns: invalid operation with Private RR type %d", rrtype))
+	}
+
+	anyrr := rrfunc()
+	switch rr := anyrr.(type) {
+	case *PrivateRR:
+		return rr
+	}
+	panic(fmt.Sprintf("dns: RR is not a PrivateRR, TypeToRR[%d] generator returned %T", rrtype, anyrr))
+}
+
+// Header return the RR header of r.
+func (r *PrivateRR) Header() *RR_Header { return &r.Hdr }
+
+func (r *PrivateRR) String() string { return r.Hdr.String() + r.Data.String() }
+
+// Private len and copy parts to satisfy RR interface.
+func (r *PrivateRR) len() int { return r.Hdr.len() + r.Data.Len() }
+func (r *PrivateRR) copy() RR {
+	// make new RR like this:
+	rr := mkPrivateRR(r.Hdr.Rrtype)
+	newh := r.Hdr.copyHeader()
+	rr.Hdr = *newh
+
+	err := r.Data.Copy(rr.Data)
+	if err != nil {
+		panic("dns: got value that could not be used to copy Private rdata")
+	}
+	return rr
+}
+func (r *PrivateRR) pack(msg []byte, off int, compression map[string]int, compress bool) (int, error) {
+	off, err := r.Hdr.pack(msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	headerEnd := off
+	n, err := r.Data.Pack(msg[off:])
+	if err != nil {
+		return len(msg), err
+	}
+	off += n
+	r.Header().Rdlength = uint16(off - headerEnd)
+	return off, nil
+}
+
+// PrivateHandle registers a private resource record type. It requires
+// string and numeric representation of private RR type and generator function as argument.
+func PrivateHandle(rtypestr string, rtype uint16, generator func() PrivateRdata) {
+	rtypestr = strings.ToUpper(rtypestr)
+
+	TypeToRR[rtype] = func() RR { return &PrivateRR{RR_Header{}, generator()} }
+	TypeToString[rtype] = rtypestr
+	StringToType[rtypestr] = rtype
+
+	typeToUnpack[rtype] = func(h RR_Header, msg []byte, off int) (RR, int, error) {
+		if noRdata(h) {
+			return &h, off, nil
+		}
+		var err error
+
+		rr := mkPrivateRR(h.Rrtype)
+		rr.Hdr = h
+
+		off1, err := rr.Data.Unpack(msg[off:])
+		off += off1
+		if err != nil {
+			return rr, off, err
+		}
+		return rr, off, err
+	}
+
+	setPrivateRR := func(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) {
+		rr := mkPrivateRR(h.Rrtype)
+		rr.Hdr = h
+
+		var l lex
+		text := make([]string, 0, 2) // could be 0..N elements, median is probably 1
+	Fetch:
+		for {
+			// TODO(miek): we could also be returning _QUOTE, this might or might not
+			// be an issue (basically parsing TXT becomes hard)
+			switch l = <-c; l.value {
+			case zNewline, zEOF:
+				break Fetch
+			case zString:
+				text = append(text, l.token)
+			}
+		}
+
+		err := rr.Data.Parse(text)
+		if err != nil {
+			return nil, &ParseError{f, err.Error(), l}, ""
+		}
+
+		return rr, nil, ""
+	}
+
+	typeToparserFunc[rtype] = parserFunc{setPrivateRR, true}
+}
+
+// PrivateHandleRemove removes defenitions required to support private RR type.
+func PrivateHandleRemove(rtype uint16) {
+	rtypestr, ok := TypeToString[rtype]
+	if ok {
+		delete(TypeToRR, rtype)
+		delete(TypeToString, rtype)
+		delete(typeToparserFunc, rtype)
+		delete(StringToType, rtypestr)
+		delete(typeToUnpack, rtype)
+	}
+	return
+}
diff --git a/vendor/github.com/miekg/dns/rawmsg.go b/vendor/github.com/miekg/dns/rawmsg.go
new file mode 100644
index 000000000..6e21fba7e
--- /dev/null
+++ b/vendor/github.com/miekg/dns/rawmsg.go
@@ -0,0 +1,49 @@
+package dns
+
+import "encoding/binary"
+
+// rawSetRdlength sets the rdlength in the header of
+// the RR. The offset 'off' must be positioned at the
+// start of the header of the RR, 'end' must be the
+// end of the RR.
+func rawSetRdlength(msg []byte, off, end int) bool {
+	l := len(msg)
+Loop:
+	for {
+		if off+1 > l {
+			return false
+		}
+		c := int(msg[off])
+		off++
+		switch c & 0xC0 {
+		case 0x00:
+			if c == 0x00 {
+				// End of the domainname
+				break Loop
+			}
+			if off+c > l {
+				return false
+			}
+			off += c
+
+		case 0xC0:
+			// pointer, next byte included, ends domainname
+			off++
+			break Loop
+		}
+	}
+	// The domainname has been seen, we at the start of the fixed part in the header.
+	// Type is 2 bytes, class is 2 bytes, ttl 4 and then 2 bytes for the length.
+	off += 2 + 2 + 4
+	if off+2 > l {
+		return false
+	}
+	//off+1 is the end of the header, 'end' is the end of the rr
+	//so 'end' - 'off+2' is the length of the rdata
+	rdatalen := end - (off + 2)
+	if rdatalen > 0xFFFF {
+		return false
+	}
+	binary.BigEndian.PutUint16(msg[off:], uint16(rdatalen))
+	return true
+}
diff --git a/vendor/github.com/miekg/dns/reverse.go b/vendor/github.com/miekg/dns/reverse.go
new file mode 100644
index 000000000..099dac948
--- /dev/null
+++ b/vendor/github.com/miekg/dns/reverse.go
@@ -0,0 +1,38 @@
+package dns
+
+// StringToType is the reverse of TypeToString, needed for string parsing.
+var StringToType = reverseInt16(TypeToString)
+
+// StringToClass is the reverse of ClassToString, needed for string parsing.
+var StringToClass = reverseInt16(ClassToString)
+
+// Map of opcodes strings.
+var StringToOpcode = reverseInt(OpcodeToString)
+
+// Map of rcodes strings.
+var StringToRcode = reverseInt(RcodeToString)
+
+// Reverse a map
+func reverseInt8(m map[uint8]string) map[string]uint8 {
+	n := make(map[string]uint8, len(m))
+	for u, s := range m {
+		n[s] = u
+	}
+	return n
+}
+
+func reverseInt16(m map[uint16]string) map[string]uint16 {
+	n := make(map[string]uint16, len(m))
+	for u, s := range m {
+		n[s] = u
+	}
+	return n
+}
+
+func reverseInt(m map[int]string) map[string]int {
+	n := make(map[string]int, len(m))
+	for u, s := range m {
+		n[s] = u
+	}
+	return n
+}
diff --git a/vendor/github.com/miekg/dns/sanitize.go b/vendor/github.com/miekg/dns/sanitize.go
new file mode 100644
index 000000000..b489f3f05
--- /dev/null
+++ b/vendor/github.com/miekg/dns/sanitize.go
@@ -0,0 +1,84 @@
+package dns
+
+// Dedup removes identical RRs from rrs. It preserves the original ordering.
+// The lowest TTL of any duplicates is used in the remaining one. Dedup modifies
+// rrs.
+// m is used to store the RRs temporay. If it is nil a new map will be allocated.
+func Dedup(rrs []RR, m map[string]RR) []RR {
+	if m == nil {
+		m = make(map[string]RR)
+	}
+	// Save the keys, so we don't have to call normalizedString twice.
+	keys := make([]*string, 0, len(rrs))
+
+	for _, r := range rrs {
+		key := normalizedString(r)
+		keys = append(keys, &key)
+		if _, ok := m[key]; ok {
+			// Shortest TTL wins.
+			if m[key].Header().Ttl > r.Header().Ttl {
+				m[key].Header().Ttl = r.Header().Ttl
+			}
+			continue
+		}
+
+		m[key] = r
+	}
+	// If the length of the result map equals the amount of RRs we got,
+	// it means they were all different. We can then just return the original rrset.
+	if len(m) == len(rrs) {
+		return rrs
+	}
+
+	j := 0
+	for i, r := range rrs {
+		// If keys[i] lives in the map, we should copy and remove it.
+		if _, ok := m[*keys[i]]; ok {
+			delete(m, *keys[i])
+			rrs[j] = r
+			j++
+		}
+
+		if len(m) == 0 {
+			break
+		}
+	}
+
+	return rrs[:j]
+}
+
+// normalizedString returns a normalized string from r. The TTL
+// is removed and the domain name is lowercased. We go from this:
+// DomainName<TAB>TTL<TAB>CLASS<TAB>TYPE<TAB>RDATA to:
+// lowercasename<TAB>CLASS<TAB>TYPE...
+func normalizedString(r RR) string {
+	// A string Go DNS makes has: domainname<TAB>TTL<TAB>...
+	b := []byte(r.String())
+
+	// find the first non-escaped tab, then another, so we capture where the TTL lives.
+	esc := false
+	ttlStart, ttlEnd := 0, 0
+	for i := 0; i < len(b) && ttlEnd == 0; i++ {
+		switch {
+		case b[i] == '\\':
+			esc = !esc
+		case b[i] == '\t' && !esc:
+			if ttlStart == 0 {
+				ttlStart = i
+				continue
+			}
+			if ttlEnd == 0 {
+				ttlEnd = i
+			}
+		case b[i] >= 'A' && b[i] <= 'Z' && !esc:
+			b[i] += 32
+		default:
+			esc = false
+		}
+	}
+
+	// remove TTL.
+	copy(b[ttlStart:], b[ttlEnd:])
+	cut := ttlEnd - ttlStart
+	return string(b[:len(b)-cut])
+}
diff --git a/vendor/github.com/miekg/dns/scan.go b/vendor/github.com/miekg/dns/scan.go
new file mode 100644
index 000000000..d34597ba3
--- /dev/null
+++ b/vendor/github.com/miekg/dns/scan.go
@@ -0,0 +1,981 @@
+package dns
+
+import (
+	"io"
+	"log"
+	"os"
+	"strconv"
+	"strings"
+)
+
+type debugging bool
+
+const debug debugging = false
+
+func (d debugging) Printf(format string, args ...interface{}) {
+	if d {
+		log.Printf(format, args...)
+	}
+}
+
+const maxTok = 2048 // Largest token we can return.
+const maxUint16 = 1<<16 - 1
+
+// Tokinize a RFC 1035 zone file. The tokenizer will normalize it:
+// * Add ownernames if they are left blank;
+// * Suppress sequences of spaces;
+// * Make each RR fit on one line (_NEWLINE is send as last)
+// * Handle comments: ;
+// * Handle braces - anywhere.
+const (
+	// Zonefile
+	zEOF = iota
+	zString
+	zBlank
+	zQuote
+	zNewline
+	zRrtpe
+	zOwner
+	zClass
+	zDirOrigin   // $ORIGIN
+	zDirTtl      // $TTL
+	zDirInclude  // $INCLUDE
+	zDirGenerate // $GENERATE
+
+	// Privatekey file
+	zValue
+	zKey
+
+	zExpectOwnerDir      // Ownername
+	zExpectOwnerBl       // Whitespace after the ownername
+	zExpectAny           // Expect rrtype, ttl or class
+	zExpectAnyNoClass    // Expect rrtype or ttl
+	zExpectAnyNoClassBl  // The whitespace after _EXPECT_ANY_NOCLASS
+	zExpectAnyNoTtl      // Expect rrtype or class
+	zExpectAnyNoTtlBl    // Whitespace after _EXPECT_ANY_NOTTL
+	zExpectRrtype        // Expect rrtype
+	zExpectRrtypeBl      // Whitespace BEFORE rrtype
+	zExpectRdata         // The first element of the rdata
+	zExpectDirTtlBl      // Space after directive $TTL
+	zExpectDirTtl        // Directive $TTL
+	zExpectDirOriginBl   // Space after directive $ORIGIN
+	zExpectDirOrigin     // Directive $ORIGIN
+	zExpectDirIncludeBl  // Space after directive $INCLUDE
+	zExpectDirInclude    // Directive $INCLUDE
+	zExpectDirGenerate   // Directive $GENERATE
+	zExpectDirGenerateBl // Space after directive $GENERATE
+)
+
+// ParseError is a parsing error. It contains the parse error and the location in the io.Reader
+// where the error occurred.
+type ParseError struct {
+	file string
+	err  string
+	lex  lex
+}
+
+func (e *ParseError) Error() (s string) {
+	if e.file != "" {
+		s = e.file + ": "
+	}
+	s += "dns: " + e.err + ": " + strconv.QuoteToASCII(e.lex.token) + " at line: " +
+		strconv.Itoa(e.lex.line) + ":" + strconv.Itoa(e.lex.column)
+	return
+}
+
+type lex struct {
+	token      string // text of the token
+	tokenUpper string // uppercase text of the token
+	length     int    // length of the token
+	err        bool   // when true, token text has lexer error
+	value      uint8  // value: zString, _BLANK, etc.
+	line       int    // line in the file
+	column     int    // column in the file
+	torc       uint16 // type or class as parsed in the lexer, we only need to look this up in the grammar
+	comment    string // any comment text seen
+}
+
+// Token holds the token that are returned when a zone file is parsed.
+type Token struct {
+	// The scanned resource record when error is not nil.
+	RR
+	// When an error occurred, this has the error specifics.
+	Error *ParseError
+	// A potential comment positioned after the RR and on the same line.
+	Comment string
+}
+
+// NewRR reads the RR contained in the string s. Only the first RR is
+// returned. If s contains no RR, return nil with no error. The class
+// defaults to IN and TTL defaults to 3600. The full zone file syntax
+// like $TTL, $ORIGIN, etc. is supported. All fields of the returned
+// RR are set, except RR.Header().Rdlength which is set to 0.
+func NewRR(s string) (RR, error) {
+	if len(s) > 0 && s[len(s)-1] != '\n' { // We need a closing newline
+		return ReadRR(strings.NewReader(s+"\n"), "")
+	}
+	return ReadRR(strings.NewReader(s), "")
+}
+
+// ReadRR reads the RR contained in q.
+// See NewRR for more documentation.
+func ReadRR(q io.Reader, filename string) (RR, error) {
+	r := <-parseZoneHelper(q, ".", filename, 1)
+	if r == nil {
+		return nil, nil
+	}
+
+	if r.Error != nil {
+		return nil, r.Error
+	}
+	return r.RR, nil
+}
+
+// ParseZone reads a RFC 1035 style zonefile from r. It returns *Tokens on the
+// returned channel, which consist out the parsed RR, a potential comment or an error.
+// If there is an error the RR is nil. The string file is only used
+// in error reporting. The string origin is used as the initial origin, as
+// if the file would start with: $ORIGIN origin .
+// The directives $INCLUDE, $ORIGIN, $TTL and $GENERATE are supported.
+// The channel t is closed by ParseZone when the end of r is reached.
+//
+// Basic usage pattern when reading from a string (z) containing the
+// zone data:
+//
+//	for x := range dns.ParseZone(strings.NewReader(z), "", "") {
+//		if x.Error != nil {
+//                  // log.Println(x.Error)
+//              } else {
+//                  // Do something with x.RR
+//              }
+//	}
+//
+// Comments specified after an RR (and on the same line!) are returned too:
+//
+//	foo. IN A 10.0.0.1 ; this is a comment
+//
+// The text "; this is comment" is returned in Token.Comment. Comments inside the
+// RR are discarded. Comments on a line by themselves are discarded too.
+func ParseZone(r io.Reader, origin, file string) chan *Token {
+	return parseZoneHelper(r, origin, file, 10000)
+}
+
+func parseZoneHelper(r io.Reader, origin, file string, chansize int) chan *Token {
+	t := make(chan *Token, chansize)
+	go parseZone(r, origin, file, t, 0)
+	return t
+}
+
+func parseZone(r io.Reader, origin, f string, t chan *Token, include int) {
+	defer func() {
+		if include == 0 {
+			close(t)
+		}
+	}()
+	s := scanInit(r)
+	c := make(chan lex)
+	// Start the lexer
+	go zlexer(s, c)
+	// 6 possible beginnings of a line, _ is a space
+	// 0. zRRTYPE                              -> all omitted until the rrtype
+	// 1. zOwner _ zRrtype                     -> class/ttl omitted
+	// 2. zOwner _ zString _ zRrtype           -> class omitted
+	// 3. zOwner _ zString _ zClass  _ zRrtype -> ttl/class
+	// 4. zOwner _ zClass  _ zRrtype           -> ttl omitted
+	// 5. zOwner _ zClass  _ zString _ zRrtype -> class/ttl (reversed)
+	// After detecting these, we know the zRrtype so we can jump to functions
+	// handling the rdata for each of these types.
+
+	if origin == "" {
+		origin = "."
+	}
+	origin = Fqdn(origin)
+	if _, ok := IsDomainName(origin); !ok {
+		t <- &Token{Error: &ParseError{f, "bad initial origin name", lex{}}}
+		return
+	}
+
+	st := zExpectOwnerDir // initial state
+	var h RR_Header
+	var defttl uint32 = defaultTtl
+	var prevName string
+	for l := range c {
+		// Lexer spotted an error already
+		if l.err == true {
+			t <- &Token{Error: &ParseError{f, l.token, l}}
+			return
+
+		}
+		switch st {
+		case zExpectOwnerDir:
+			// We can also expect a directive, like $TTL or $ORIGIN
+			h.Ttl = defttl
+			h.Class = ClassINET
+			switch l.value {
+			case zNewline:
+				st = zExpectOwnerDir
+			case zOwner:
+				h.Name = l.token
+				if l.token[0] == '@' {
+					h.Name = origin
+					prevName = h.Name
+					st = zExpectOwnerBl
+					break
+				}
+				if h.Name[l.length-1] != '.' {
+					h.Name = appendOrigin(h.Name, origin)
+				}
+				_, ok := IsDomainName(l.token)
+				if !ok {
+					t <- &Token{Error: &ParseError{f, "bad owner name", l}}
+					return
+				}
+				prevName = h.Name
+				st = zExpectOwnerBl
+			case zDirTtl:
+				st = zExpectDirTtlBl
+			case zDirOrigin:
+				st = zExpectDirOriginBl
+			case zDirInclude:
+				st = zExpectDirIncludeBl
+			case zDirGenerate:
+				st = zExpectDirGenerateBl
+			case zRrtpe:
+				h.Name = prevName
+				h.Rrtype = l.torc
+				st = zExpectRdata
+			case zClass:
+				h.Name = prevName
+				h.Class = l.torc
+				st = zExpectAnyNoClassBl
+			case zBlank:
+				// Discard, can happen when there is nothing on the
+				// line except the RR type
+			case zString:
+				ttl, ok := stringToTtl(l.token)
+				if !ok {
+					t <- &Token{Error: &ParseError{f, "not a TTL", l}}
+					return
+				}
+				h.Ttl = ttl
+				// Don't about the defttl, we should take the $TTL value
+				// defttl = ttl
+				st = zExpectAnyNoTtlBl
+
+			default:
+				t <- &Token{Error: &ParseError{f, "syntax error at beginning", l}}
+				return
+			}
+		case zExpectDirIncludeBl:
+			if l.value != zBlank {
+				t <- &Token{Error: &ParseError{f, "no blank after $INCLUDE-directive", l}}
+				return
+			}
+			st = zExpectDirInclude
+		case zExpectDirInclude:
+			if l.value != zString {
+				t <- &Token{Error: &ParseError{f, "expecting $INCLUDE value, not this...", l}}
+				return
+			}
+			neworigin := origin // There may be optionally a new origin set after the filename, if not use current one
+			l := <-c
+			switch l.value {
+			case zBlank:
+				l := <-c
+				if l.value == zString {
+					if _, ok := IsDomainName(l.token); !ok || l.length == 0 || l.err {
+						t <- &Token{Error: &ParseError{f, "bad origin name", l}}
+						return
+					}
+					// a new origin is specified.
+					if l.token[l.length-1] != '.' {
+						if origin != "." { // Prevent .. endings
+							neworigin = l.token + "." + origin
+						} else {
+							neworigin = l.token + origin
+						}
+					} else {
+						neworigin = l.token
+					}
+				}
+			case zNewline, zEOF:
+				// Ok
+			default:
+				t <- &Token{Error: &ParseError{f, "garbage after $INCLUDE", l}}
+				return
+			}
+			// Start with the new file
+			r1, e1 := os.Open(l.token)
+			if e1 != nil {
+				t <- &Token{Error: &ParseError{f, "failed to open `" + l.token + "'", l}}
+				return
+			}
+			if include+1 > 7 {
+				t <- &Token{Error: &ParseError{f, "too deeply nested $INCLUDE", l}}
+				return
+			}
+			parseZone(r1, l.token, neworigin, t, include+1)
+			st = zExpectOwnerDir
+		case zExpectDirTtlBl:
+			if l.value != zBlank {
+				t <- &Token{Error: &ParseError{f, "no blank after $TTL-directive", l}}
+				return
+			}
+			st = zExpectDirTtl
+		case zExpectDirTtl:
+			if l.value != zString {
+				t <- &Token{Error: &ParseError{f, "expecting $TTL value, not this...", l}}
+				return
+			}
+			if e, _ := slurpRemainder(c, f); e != nil {
+				t <- &Token{Error: e}
+				return
+			}
+			ttl, ok := stringToTtl(l.token)
+			if !ok {
+				t <- &Token{Error: &ParseError{f, "expecting $TTL value, not this...", l}}
+				return
+			}
+			defttl = ttl
+			st = zExpectOwnerDir
+		case zExpectDirOriginBl:
+			if l.value != zBlank {
+				t <- &Token{Error: &ParseError{f, "no blank after $ORIGIN-directive", l}}
+				return
+			}
+			st = zExpectDirOrigin
+		case zExpectDirOrigin:
+			if l.value != zString {
+				t <- &Token{Error: &ParseError{f, "expecting $ORIGIN value, not this...", l}}
+				return
+			}
+			if e, _ := slurpRemainder(c, f); e != nil {
+				t <- &Token{Error: e}
+			}
+			if _, ok := IsDomainName(l.token); !ok {
+				t <- &Token{Error: &ParseError{f, "bad origin name", l}}
+				return
+			}
+			if l.token[l.length-1] != '.' {
+				if origin != "." { // Prevent .. endings
+					origin = l.token + "." + origin
+				} else {
+					origin = l.token + origin
+				}
+			} else {
+				origin = l.token
+			}
+			st = zExpectOwnerDir
+		case zExpectDirGenerateBl:
+			if l.value != zBlank {
+				t <- &Token{Error: &ParseError{f, "no blank after $GENERATE-directive", l}}
+				return
+			}
+			st = zExpectDirGenerate
+		case zExpectDirGenerate:
+			if l.value != zString {
+				t <- &Token{Error: &ParseError{f, "expecting $GENERATE value, not this...", l}}
+				return
+			}
+			if errMsg := generate(l, c, t, origin); errMsg != "" {
+				t <- &Token{Error: &ParseError{f, errMsg, l}}
+				return
+			}
+			st = zExpectOwnerDir
+		case zExpectOwnerBl:
+			if l.value != zBlank {
+				t <- &Token{Error: &ParseError{f, "no blank after owner", l}}
+				return
+			}
+			st = zExpectAny
+		case zExpectAny:
+			switch l.value {
+			case zRrtpe:
+				h.Rrtype = l.torc
+				st = zExpectRdata
+			case zClass:
+				h.Class = l.torc
+				st = zExpectAnyNoClassBl
+			case zString:
+				ttl, ok := stringToTtl(l.token)
+				if !ok {
+					t <- &Token{Error: &ParseError{f, "not a TTL", l}}
+					return
+				}
+				h.Ttl = ttl
+				// defttl = ttl // don't set the defttl here
+				st = zExpectAnyNoTtlBl
+			default:
+				t <- &Token{Error: &ParseError{f, "expecting RR type, TTL or class, not this...", l}}
+				return
+			}
+		case zExpectAnyNoClassBl:
+			if l.value != zBlank {
+				t <- &Token{Error: &ParseError{f, "no blank before class", l}}
+				return
+			}
+			st = zExpectAnyNoClass
+		case zExpectAnyNoTtlBl:
+			if l.value != zBlank {
+				t <- &Token{Error: &ParseError{f, "no blank before TTL", l}}
+				return
+			}
+			st = zExpectAnyNoTtl
+		case zExpectAnyNoTtl:
+			switch l.value {
+			case zClass:
+				h.Class = l.torc
+				st = zExpectRrtypeBl
+			case zRrtpe:
+				h.Rrtype = l.torc
+				st = zExpectRdata
+			default:
+				t <- &Token{Error: &ParseError{f, "expecting RR type or class, not this...", l}}
+				return
+			}
+		case zExpectAnyNoClass:
+			switch l.value {
+			case zString:
+				ttl, ok := stringToTtl(l.token)
+				if !ok {
+					t <- &Token{Error: &ParseError{f, "not a TTL", l}}
+					return
+				}
+				h.Ttl = ttl
+				// defttl = ttl // don't set the def ttl anymore
+				st = zExpectRrtypeBl
+			case zRrtpe:
+				h.Rrtype = l.torc
+				st = zExpectRdata
+			default:
+				t <- &Token{Error: &ParseError{f, "expecting RR type or TTL, not this...", l}}
+				return
+			}
+		case zExpectRrtypeBl:
+			if l.value != zBlank {
+				t <- &Token{Error: &ParseError{f, "no blank before RR type", l}}
+				return
+			}
+			st = zExpectRrtype
+		case zExpectRrtype:
+			if l.value != zRrtpe {
+				t <- &Token{Error: &ParseError{f, "unknown RR type", l}}
+				return
+			}
+			h.Rrtype = l.torc
+			st = zExpectRdata
+		case zExpectRdata:
+			r, e, c1 := setRR(h, c, origin, f)
+			if e != nil {
+				// If e.lex is nil than we have encounter a unknown RR type
+				// in that case we substitute our current lex token
+				if e.lex.token == "" && e.lex.value == 0 {
+					e.lex = l // Uh, dirty
+				}
+				t <- &Token{Error: e}
+				return
+			}
+			t <- &Token{RR: r, Comment: c1}
+			st = zExpectOwnerDir
+		}
+	}
+	// If we get here, we and the h.Rrtype is still zero, we haven't parsed anything, this
+	// is not an error, because an empty zone file is still a zone file.
+}
+
+// zlexer scans the sourcefile and returns tokens on the channel c.
+func zlexer(s *scan, c chan lex) {
+	var l lex
+	str := make([]byte, maxTok) // Should be enough for any token
+	stri := 0                   // Offset in str (0 means empty)
+	com := make([]byte, maxTok) // Hold comment text
+	comi := 0
+	quote := false
+	escape := false
+	space := false
+	commt := false
+	rrtype := false
+	owner := true
+	brace := 0
+	x, err := s.tokenText()
+	defer close(c)
+	for err == nil {
+		l.column = s.position.Column
+		l.line = s.position.Line
+		if stri >= maxTok {
+			l.token = "token length insufficient for parsing"
+			l.err = true
+			debug.Printf("[%+v]", l.token)
+			c <- l
+			return
+		}
+		if comi >= maxTok {
+			l.token = "comment length insufficient for parsing"
+			l.err = true
+			debug.Printf("[%+v]", l.token)
+			c <- l
+			return
+		}
+
+		switch x {
+		case ' ', '\t':
+			if escape {
+				escape = false
+				str[stri] = x
+				stri++
+				break
+			}
+			if quote {
+				// Inside quotes this is legal
+				str[stri] = x
+				stri++
+				break
+			}
+			if commt {
+				com[comi] = x
+				comi++
+				break
+			}
+			if stri == 0 {
+				// Space directly in the beginning, handled in the grammar
+			} else if owner {
+				// If we have a string and its the first, make it an owner
+				l.value = zOwner
+				l.token = string(str[:stri])
+				l.tokenUpper = strings.ToUpper(l.token)
+				l.length = stri
+				// escape $... start with a \ not a $, so this will work
+				switch l.tokenUpper {
+				case "$TTL":
+					l.value = zDirTtl
+				case "$ORIGIN":
+					l.value = zDirOrigin
+				case "$INCLUDE":
+					l.value = zDirInclude
+				case "$GENERATE":
+					l.value = zDirGenerate
+				}
+				debug.Printf("[7 %+v]", l.token)
+				c <- l
+			} else {
+				l.value = zString
+				l.token = string(str[:stri])
+				l.tokenUpper = strings.ToUpper(l.token)
+				l.length = stri
+				if !rrtype {
+					if t, ok := StringToType[l.tokenUpper]; ok {
+						l.value = zRrtpe
+						l.torc = t
+						rrtype = true
+					} else {
+						if strings.HasPrefix(l.tokenUpper, "TYPE") {
+							t, ok := typeToInt(l.token)
+							if !ok {
+								l.token = "unknown RR type"
+								l.err = true
+								c <- l
+								return
+							}
+							l.value = zRrtpe
+							l.torc = t
+						}
+					}
+					if t, ok := StringToClass[l.tokenUpper]; ok {
+						l.value = zClass
+						l.torc = t
+					} else {
+						if strings.HasPrefix(l.tokenUpper, "CLASS") {
+							t, ok := classToInt(l.token)
+							if !ok {
+								l.token = "unknown class"
+								l.err = true
+								c <- l
+								return
+							}
+							l.value = zClass
+							l.torc = t
+						}
+					}
+				}
+				debug.Printf("[6 %+v]", l.token)
+				c <- l
+			}
+			stri = 0
+			// I reverse space stuff here
+			if !space && !commt {
+				l.value = zBlank
+				l.token = " "
+				l.length = 1
+				debug.Printf("[5 %+v]", l.token)
+				c <- l
+			}
+			owner = false
+			space = true
+		case ';':
+			if escape {
+				escape = false
+				str[stri] = x
+				stri++
+				break
+			}
+			if quote {
+				// Inside quotes this is legal
+				str[stri] = x
+				stri++
+				break
+			}
+			if stri > 0 {
+				l.value = zString
+				l.token = string(str[:stri])
+				l.tokenUpper = strings.ToUpper(l.token)
+				l.length = stri
+				debug.Printf("[4 %+v]", l.token)
+				c <- l
+				stri = 0
+			}
+			commt = true
+			com[comi] = ';'
+			comi++
+		case '\r':
+			escape = false
+			if quote {
+				str[stri] = x
+				stri++
+				break
+			}
+			// discard if outside of quotes
+		case '\n':
+			escape = false
+			// Escaped newline
+			if quote {
+				str[stri] = x
+				stri++
+				break
+			}
+			// inside quotes this is legal
+			if commt {
+				// Reset a comment
+				commt = false
+				rrtype = false
+				stri = 0
+				// If not in a brace this ends the comment AND the RR
+				if brace == 0 {
+					owner = true
+					owner = true
+					l.value = zNewline
+					l.token = "\n"
+					l.tokenUpper = l.token
+					l.length = 1
+					l.comment = string(com[:comi])
+					debug.Printf("[3 %+v %+v]", l.token, l.comment)
+					c <- l
+					l.comment = ""
+					comi = 0
+					break
+				}
+				com[comi] = ' ' // convert newline to space
+				comi++
+				break
+			}
+
+			if brace == 0 {
+				// If there is previous text, we should output it here
+				if stri != 0 {
+					l.value = zString
+					l.token = string(str[:stri])
+					l.tokenUpper = strings.ToUpper(l.token)
+
+					l.length = stri
+					if !rrtype {
+						if t, ok := StringToType[l.tokenUpper]; ok {
+							l.value = zRrtpe
+							l.torc = t
+							rrtype = true
+						}
+					}
+					debug.Printf("[2 %+v]", l.token)
+					c <- l
+				}
+				l.value = zNewline
+				l.token = "\n"
+				l.tokenUpper = l.token
+				l.length = 1
+				debug.Printf("[1 %+v]", l.token)
+				c <- l
+				stri = 0
+				commt = false
+				rrtype = false
+				owner = true
+				comi = 0
+			}
+		case '\\':
+			// comments do not get escaped chars, everything is copied
+			if commt {
+				com[comi] = x
+				comi++
+				break
+			}
+			// something already escaped must be in string
+			if escape {
+				str[stri] = x
+				stri++
+				escape = false
+				break
+			}
+			// something escaped outside of string gets added to string
+			str[stri] = x
+			stri++
+			escape = true
+		case '"':
+			if commt {
+				com[comi] = x
+				comi++
+				break
+			}
+			if escape {
+				str[stri] = x
+				stri++
+				escape = false
+				break
+			}
+			space = false
+			// send previous gathered text and the quote
+			if stri != 0 {
+				l.value = zString
+				l.token = string(str[:stri])
+				l.tokenUpper = strings.ToUpper(l.token)
+				l.length = stri
+
+				debug.Printf("[%+v]", l.token)
+				c <- l
+				stri = 0
+			}
+
+			// send quote itself as separate token
+			l.value = zQuote
+			l.token = "\""
+			l.tokenUpper = l.token
+			l.length = 1
+			c <- l
+			quote = !quote
+		case '(', ')':
+			if commt {
+				com[comi] = x
+				comi++
+				break
+			}
+			if escape {
+				str[stri] = x
+				stri++
+				escape = false
+				break
+			}
+			if quote {
+				str[stri] = x
+				stri++
+				break
+			}
+			switch x {
+			case ')':
+				brace--
+				if brace < 0 {
+					l.token = "extra closing brace"
+					l.tokenUpper = l.token
+					l.err = true
+					debug.Printf("[%+v]", l.token)
+					c <- l
+					return
+				}
+			case '(':
+				brace++
+			}
+		default:
+			escape = false
+			if commt {
+				com[comi] = x
+				comi++
+				break
+			}
+			str[stri] = x
+			stri++
+			space = false
+		}
+		x, err = s.tokenText()
+	}
+	if stri > 0 {
+		// Send remainder
+		l.token = string(str[:stri])
+		l.tokenUpper = strings.ToUpper(l.token)
+		l.length = stri
+		l.value = zString
+		debug.Printf("[%+v]", l.token)
+		c <- l
+	}
+}
+
+// Extract the class number from CLASSxx
+func classToInt(token string) (uint16, bool) {
+	offset := 5
+	if len(token) < offset+1 {
+		return 0, false
+	}
+	class, ok := strconv.Atoi(token[offset:])
+	if ok != nil || class > maxUint16 {
+		return 0, false
+	}
+	return uint16(class), true
+}
+
+// Extract the rr number from TYPExxx
+func typeToInt(token string) (uint16, bool) {
+	offset := 4
+	if len(token) < offset+1 {
+		return 0, false
+	}
+	typ, ok := strconv.Atoi(token[offset:])
+	if ok != nil || typ > maxUint16 {
+		return 0, false
+	}
+	return uint16(typ), true
+}
+
+// Parse things like 2w, 2m, etc, Return the time in seconds.
+func stringToTtl(token string) (uint32, bool) {
+	s := uint32(0)
+	i := uint32(0)
+	for _, c := range token {
+		switch c {
+		case 's', 'S':
+			s += i
+			i = 0
+		case 'm', 'M':
+			s += i * 60
+			i = 0
+		case 'h', 'H':
+			s += i * 60 * 60
+			i = 0
+		case 'd', 'D':
+			s += i * 60 * 60 * 24
+			i = 0
+		case 'w', 'W':
+			s += i * 60 * 60 * 24 * 7
+			i = 0
+		case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':
+			i *= 10
+			i += uint32(c) - '0'
+		default:
+			return 0, false
+		}
+	}
+	return s + i, true
+}
+
+// Parse LOC records' <digits>[.<digits>][mM] into a
+// mantissa exponent format. Token should contain the entire
+// string (i.e. no spaces allowed)
+func stringToCm(token string) (e, m uint8, ok bool) {
+	if token[len(token)-1] == 'M' || token[len(token)-1] == 'm' {
+		token = token[0 : len(token)-1]
+	}
+	s := strings.SplitN(token, ".", 2)
+	var meters, cmeters, val int
+	var err error
+	switch len(s) {
+	case 2:
+		if cmeters, err = strconv.Atoi(s[1]); err != nil {
+			return
+		}
+		fallthrough
+	case 1:
+		if meters, err = strconv.Atoi(s[0]); err != nil {
+			return
+		}
+	case 0:
+		// huh?
+		return 0, 0, false
+	}
+	ok = true
+	if meters > 0 {
+		e = 2
+		val = meters
+	} else {
+		e = 0
+		val = cmeters
+	}
+	for val > 10 {
+		e++
+		val /= 10
+	}
+	if e > 9 {
+		ok = false
+	}
+	m = uint8(val)
+	return
+}
+
+func appendOrigin(name, origin string) string {
+	if origin == "." {
+		return name + origin
+	}
+	return name + "." + origin
+}
+
+// LOC record helper function
+func locCheckNorth(token string, latitude uint32) (uint32, bool) {
+	switch token {
+	case "n", "N":
+		return LOC_EQUATOR + latitude, true
+	case "s", "S":
+		return LOC_EQUATOR - latitude, true
+	}
+	return latitude, false
+}
+
+// LOC record helper function
+func locCheckEast(token string, longitude uint32) (uint32, bool) {
+	switch token {
+	case "e", "E":
+		return LOC_EQUATOR + longitude, true
+	case "w", "W":
+		return LOC_EQUATOR - longitude, true
+	}
+	return longitude, false
+}
+
+// "Eat" the rest of the "line". Return potential comments
+func slurpRemainder(c chan lex, f string) (*ParseError, string) {
+	l := <-c
+	com := ""
+	switch l.value {
+	case zBlank:
+		l = <-c
+		com = l.comment
+		if l.value != zNewline && l.value != zEOF {
+			return &ParseError{f, "garbage after rdata", l}, ""
+		}
+	case zNewline:
+		com = l.comment
+	case zEOF:
+	default:
+		return &ParseError{f, "garbage after rdata", l}, ""
+	}
+	return nil, com
+}
+
+// Parse a 64 bit-like ipv6 address: "0014:4fff:ff20:ee64"
+// Used for NID and L64 record.
+func stringToNodeID(l lex) (uint64, *ParseError) {
+	if len(l.token) < 19 {
+		return 0, &ParseError{l.token, "bad NID/L64 NodeID/Locator64", l}
+	}
+	// There must be three colons at fixes postitions, if not its a parse error
+	if l.token[4] != ':' && l.token[9] != ':' && l.token[14] != ':' {
+		return 0, &ParseError{l.token, "bad NID/L64 NodeID/Locator64", l}
+	}
+	s := l.token[0:4] + l.token[5:9] + l.token[10:14] + l.token[15:19]
+	u, err := strconv.ParseUint(s, 16, 64)
+	if err != nil {
+		return 0, &ParseError{l.token, "bad NID/L64 NodeID/Locator64", l}
+	}
+	return u, nil
+}
diff --git a/vendor/github.com/miekg/dns/scan_rr.go b/vendor/github.com/miekg/dns/scan_rr.go
new file mode 100644
index 000000000..675fc80d8
--- /dev/null
+++ b/vendor/github.com/miekg/dns/scan_rr.go
@@ -0,0 +1,2179 @@
+package dns
+
+import (
+	"encoding/base64"
+	"net"
+	"strconv"
+	"strings"
+)
+
+type parserFunc struct {
+	// Func defines the function that parses the tokens and returns the RR
+	// or an error. The last string contains any comments in the line as
+	// they returned by the lexer as well.
+	Func func(h RR_Header, c chan lex, origin string, file string) (RR, *ParseError, string)
+	// Signals if the RR ending is of variable length, like TXT or records
+	// that have Hexadecimal or Base64 as their last element in the Rdata. Records
+	// that have a fixed ending or for instance A, AAAA, SOA and etc.
+	Variable bool
+}
+
+// Parse the rdata of each rrtype.
+// All data from the channel c is either zString or zBlank.
+// After the rdata there may come a zBlank and then a zNewline
+// or immediately a zNewline. If this is not the case we flag
+// an *ParseError: garbage after rdata.
+func setRR(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) {
+	parserfunc, ok := typeToparserFunc[h.Rrtype]
+	if ok {
+		r, e, cm := parserfunc.Func(h, c, o, f)
+		if parserfunc.Variable {
+			return r, e, cm
+		}
+		if e != nil {
+			return nil, e, ""
+		}
+		e, cm = slurpRemainder(c, f)
+		if e != nil {
+			return nil, e, ""
+		}
+		return r, nil, cm
+	}
+	// RFC3957 RR (Unknown RR handling)
+	return setRFC3597(h, c, o, f)
+}
+
+// A remainder of the rdata with embedded spaces, return the parsed string (sans the spaces)
+// or an error
+func endingToString(c chan lex, errstr, f string) (string, *ParseError, string) {
+	s := ""
+	l := <-c // zString
+	for l.value != zNewline && l.value != zEOF {
+		if l.err {
+			return s, &ParseError{f, errstr, l}, ""
+		}
+		switch l.value {
+		case zString:
+			s += l.token
+		case zBlank: // Ok
+		default:
+			return "", &ParseError{f, errstr, l}, ""
+		}
+		l = <-c
+	}
+	return s, nil, l.comment
+}
+
+// A remainder of the rdata with embedded spaces, return the parsed string slice (sans the spaces)
+// or an error
+func endingToTxtSlice(c chan lex, errstr, f string) ([]string, *ParseError, string) {
+	// Get the remaining data until we see a zNewline
+	quote := false
+	l := <-c
+	var s []string
+	if l.err {
+		return s, &ParseError{f, errstr, l}, ""
+	}
+	switch l.value == zQuote {
+	case true: // A number of quoted string
+		s = make([]string, 0)
+		empty := true
+		for l.value != zNewline && l.value != zEOF {
+			if l.err {
+				return nil, &ParseError{f, errstr, l}, ""
+			}
+			switch l.value {
+			case zString:
+				empty = false
+				if len(l.token) > 255 {
+					// split up tokens that are larger than 255 into 255-chunks
+					sx := []string{}
+					p, i := 0, 255
+					for {
+						if i <= len(l.token) {
+							sx = append(sx, l.token[p:i])
+						} else {
+							sx = append(sx, l.token[p:])
+							break
+
+						}
+						p, i = p+255, i+255
+					}
+					s = append(s, sx...)
+					break
+				}
+
+				s = append(s, l.token)
+			case zBlank:
+				if quote {
+					// zBlank can only be seen in between txt parts.
+					return nil, &ParseError{f, errstr, l}, ""
+				}
+			case zQuote:
+				if empty && quote {
+					s = append(s, "")
+				}
+				quote = !quote
+				empty = true
+			default:
+				return nil, &ParseError{f, errstr, l}, ""
+			}
+			l = <-c
+		}
+		if quote {
+			return nil, &ParseError{f, errstr, l}, ""
+		}
+	case false: // Unquoted text record
+		s = make([]string, 1)
+		for l.value != zNewline && l.value != zEOF {
+			if l.err {
+				return s, &ParseError{f, errstr, l}, ""
+			}
+			s[0] += l.token
+			l = <-c
+		}
+	}
+	return s, nil, l.comment
+}
+
+func setA(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) {
+	rr := new(A)
+	rr.Hdr = h
+
+	l := <-c
+	if l.length == 0 { // Dynamic updates.
+		return rr, nil, ""
+	}
+	rr.A = net.ParseIP(l.token)
+	if rr.A == nil || l.err {
+		return nil, &ParseError{f, "bad A A", l}, ""
+	}
+	return rr, nil, ""
+}
+
+func setAAAA(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) {
+	rr := new(AAAA)
+	rr.Hdr = h
+
+	l := <-c
+	if l.length == 0 {
+		return rr, nil, ""
+	}
+	rr.AAAA = net.ParseIP(l.token)
+	if rr.AAAA == nil || l.err {
+		return nil, &ParseError{f, "bad AAAA AAAA", l}, ""
+	}
+	return rr, nil, ""
+}
+
+func setNS(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) {
+	rr := new(NS)
+	rr.Hdr = h
+
+	l := <-c
+	rr.Ns = l.token
+	if l.length == 0 {
+		return rr, nil, ""
+	}
+	if l.token == "@" {
+		rr.Ns = o
+		return rr, nil, ""
+	}
+	_, ok := IsDomainName(l.token)
+	if !ok || l.length == 0 || l.err {
+		return nil, &ParseError{f, "bad NS Ns", l}, ""
+	}
+	if rr.Ns[l.length-1] != '.' {
+		rr.Ns = appendOrigin(rr.Ns, o)
+	}
+	return rr, nil, ""
+}
+
+func setPTR(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) {
+	rr := new(PTR)
+	rr.Hdr = h
+
+	l := <-c
+	rr.Ptr = l.token
+	if l.length == 0 { // dynamic update rr.
+		return rr, nil, ""
+	}
+	if l.token == "@" {
+		rr.Ptr = o
+		return rr, nil, ""
+	}
+	_, ok := IsDomainName(l.token)
+	if !ok || l.length == 0 || l.err {
+		return nil, &ParseError{f, "bad PTR Ptr", l}, ""
+	}
+	if rr.Ptr[l.length-1] != '.' {
+		rr.Ptr = appendOrigin(rr.Ptr, o)
+	}
+	return rr, nil, ""
+}
+
+func setNSAPPTR(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) {
+	rr := new(NSAPPTR)
+	rr.Hdr = h
+
+	l := <-c
+	rr.Ptr = l.token
+	if l.length == 0 {
+		return rr, nil, ""
+	}
+	if l.token == "@" {
+		rr.Ptr = o
+		return rr, nil, ""
+	}
+	_, ok := IsDomainName(l.token)
+	if !ok || l.length == 0 || l.err {
+		return nil, &ParseError{f, "bad NSAP-PTR Ptr", l}, ""
+	}
+	if rr.Ptr[l.length-1] != '.' {
+		rr.Ptr = appendOrigin(rr.Ptr, o)
+	}
+	return rr, nil, ""
+}
+
+func setRP(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) {
+	rr := new(RP)
+	rr.Hdr = h
+
+	l := <-c
+	rr.Mbox = l.token
+	if l.length == 0 {
+		return rr, nil, ""
+	}
+	if l.token == "@" {
+		rr.Mbox = o
+	} else {
+		_, ok := IsDomainName(l.token)
+		if !ok || l.length == 0 || l.err {
+			return nil, &ParseError{f, "bad RP Mbox", l}, ""
+		}
+		if rr.Mbox[l.length-1] != '.' {
+			rr.Mbox = appendOrigin(rr.Mbox, o)
+		}
+	}
+	<-c // zBlank
+	l = <-c
+	rr.Txt = l.token
+	if l.token == "@" {
+		rr.Txt = o
+		return rr, nil, ""
+	}
+	_, ok := IsDomainName(l.token)
+	if !ok || l.length == 0 || l.err {
+		return nil, &ParseError{f, "bad RP Txt", l}, ""
+	}
+	if rr.Txt[l.length-1] != '.' {
+		rr.Txt = appendOrigin(rr.Txt, o)
+	}
+	return rr, nil, ""
+}
+
+func setMR(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) {
+	rr := new(MR)
+	rr.Hdr = h
+
+	l := <-c
+	rr.Mr = l.token
+	if l.length == 0 {
+		return rr, nil, ""
+	}
+	if l.token == "@" {
+		rr.Mr = o
+		return rr, nil, ""
+	}
+	_, ok := IsDomainName(l.token)
+	if !ok || l.length == 0 || l.err {
+		return nil, &ParseError{f, "bad MR Mr", l}, ""
+	}
+	if rr.Mr[l.length-1] != '.' {
+		rr.Mr = appendOrigin(rr.Mr, o)
+	}
+	return rr, nil, ""
+}
+
+func setMB(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) {
+	rr := new(MB)
+	rr.Hdr = h
+
+	l := <-c
+	rr.Mb = l.token
+	if l.length == 0 {
+		return rr, nil, ""
+	}
+	if l.token == "@" {
+		rr.Mb = o
+		return rr, nil, ""
+	}
+	_, ok := IsDomainName(l.token)
+	if !ok || l.length == 0 || l.err {
+		return nil, &ParseError{f, "bad MB Mb", l}, ""
+	}
+	if rr.Mb[l.length-1] != '.' {
+		rr.Mb = appendOrigin(rr.Mb, o)
+	}
+	return rr, nil, ""
+}
+
+func setMG(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) {
+	rr := new(MG)
+	rr.Hdr = h
+
+	l := <-c
+	rr.Mg = l.token
+	if l.length == 0 {
+		return rr, nil, ""
+	}
+	if l.token == "@" {
+		rr.Mg = o
+		return rr, nil, ""
+	}
+	_, ok := IsDomainName(l.token)
+	if !ok || l.length == 0 || l.err {
+		return nil, &ParseError{f, "bad MG Mg", l}, ""
+	}
+	if rr.Mg[l.length-1] != '.' {
+		rr.Mg = appendOrigin(rr.Mg, o)
+	}
+	return rr, nil, ""
+}
+
+func setHINFO(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) {
+	rr := new(HINFO)
+	rr.Hdr = h
+
+	chunks, e, c1 := endingToTxtSlice(c, "bad HINFO Fields", f)
+	if e != nil {
+		return nil, e, c1
+	}
+
+	if ln := len(chunks); ln == 0 {
+		return rr, nil, ""
+	} else if ln == 1 {
+		// Can we split it?
+		if out := strings.Fields(chunks[0]); len(out) > 1 {
+			chunks = out
+		} else {
+			chunks = append(chunks, "")
+		}
+	}
+
+	rr.Cpu = chunks[0]
+	rr.Os = strings.Join(chunks[1:], " ")
+
+	return rr, nil, ""
+}
+
+func setMINFO(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) {
+	rr := new(MINFO)
+	rr.Hdr = h
+
+	l := <-c
+	rr.Rmail = l.token
+	if l.length == 0 {
+		return rr, nil, ""
+	}
+	if l.token == "@" {
+		rr.Rmail = o
+	} else {
+		_, ok := IsDomainName(l.token)
+		if !ok || l.length == 0 || l.err {
+			return nil, &ParseError{f, "bad MINFO Rmail", l}, ""
+		}
+		if rr.Rmail[l.length-1] != '.' {
+			rr.Rmail = appendOrigin(rr.Rmail, o)
+		}
+	}
+	<-c // zBlank
+	l = <-c
+	rr.Email = l.token
+	if l.token == "@" {
+		rr.Email = o
+		return rr, nil, ""
+	}
+	_, ok := IsDomainName(l.token)
+	if !ok || l.length == 0 || l.err {
+		return nil, &ParseError{f, "bad MINFO Email", l}, ""
+	}
+	if rr.Email[l.length-1] != '.' {
+		rr.Email = appendOrigin(rr.Email, o)
+	}
+	return rr, nil, ""
+}
+
+func setMF(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) {
+	rr := new(MF)
+	rr.Hdr = h
+
+	l := <-c
+	rr.Mf = l.token
+	if l.length == 0 {
+		return rr, nil, ""
+	}
+	if l.token == "@" {
+		rr.Mf = o
+		return rr, nil, ""
+	}
+	_, ok := IsDomainName(l.token)
+	if !ok || l.length == 0 || l.err {
+		return nil, &ParseError{f, "bad MF Mf", l}, ""
+	}
+	if rr.Mf[l.length-1] != '.' {
+		rr.Mf = appendOrigin(rr.Mf, o)
+	}
+	return rr, nil, ""
+}
+
+func setMD(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) {
+	rr := new(MD)
+	rr.Hdr = h
+
+	l := <-c
+	rr.Md = l.token
+	if l.length == 0 {
+		return rr, nil, ""
+	}
+	if l.token == "@" {
+		rr.Md = o
+		return rr, nil, ""
+	}
+	_, ok := IsDomainName(l.token)
+	if !ok || l.length == 0 || l.err {
+		return nil, &ParseError{f, "bad MD Md", l}, ""
+	}
+	if rr.Md[l.length-1] != '.' {
+		rr.Md = appendOrigin(rr.Md, o)
+	}
+	return rr, nil, ""
+}
+
+func setMX(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) {
+	rr := new(MX)
+	rr.Hdr = h
+
+	l := <-c
+	if l.length == 0 {
+		return rr, nil, ""
+	}
+	i, e := strconv.Atoi(l.token)
+	if e != nil || l.err {
+		return nil, &ParseError{f, "bad MX Pref", l}, ""
+	}
+	rr.Preference = uint16(i)
+	<-c     // zBlank
+	l = <-c // zString
+	rr.Mx = l.token
+	if l.token == "@" {
+		rr.Mx = o
+		return rr, nil, ""
+	}
+	_, ok := IsDomainName(l.token)
+	if !ok || l.length == 0 || l.err {
+		return nil, &ParseError{f, "bad MX Mx", l}, ""
+	}
+	if rr.Mx[l.length-1] != '.' {
+		rr.Mx = appendOrigin(rr.Mx, o)
+	}
+	return rr, nil, ""
+}
+
+func setRT(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) {
+	rr := new(RT)
+	rr.Hdr = h
+	l := <-c
+	if l.length == 0 {
+		return rr, nil, ""
+	}
+	i, e := strconv.Atoi(l.token)
+	if e != nil {
+		return nil, &ParseError{f, "bad RT Preference", l}, ""
+	}
+	rr.Preference = uint16(i)
+	<-c     // zBlank
+	l = <-c // zString
+	rr.Host = l.token
+	if l.token == "@" {
+		rr.Host = o
+		return rr, nil, ""
+	}
+	_, ok := IsDomainName(l.token)
+	if !ok || l.length == 0 || l.err {
+		return nil, &ParseError{f, "bad RT Host", l}, ""
+	}
+	if rr.Host[l.length-1] != '.' {
+		rr.Host = appendOrigin(rr.Host, o)
+	}
+	return rr, nil, ""
+}
+
+func setAFSDB(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) {
+	rr := new(AFSDB)
+	rr.Hdr = h
+
+	l := <-c
+	if l.length == 0 {
+		return rr, nil, ""
+	}
+	i, e := strconv.Atoi(l.token)
+	if e != nil || l.err {
+		return nil, &ParseError{f, "bad AFSDB Subtype", l}, ""
+	}
+	rr.Subtype = uint16(i)
+	<-c     // zBlank
+	l = <-c // zString
+	rr.Hostname = l.token
+	if l.token == "@" {
+		rr.Hostname = o
+		return rr, nil, ""
+	}
+	_, ok := IsDomainName(l.token)
+	if !ok || l.length == 0 || l.err {
+		return nil, &ParseError{f, "bad AFSDB Hostname", l}, ""
+	}
+	if rr.Hostname[l.length-1] != '.' {
+		rr.Hostname = appendOrigin(rr.Hostname, o)
+	}
+	return rr, nil, ""
+}
+
+func setX25(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) {
+	rr := new(X25)
+	rr.Hdr = h
+
+	l := <-c
+	if l.length == 0 {
+		return rr, nil, ""
+	}
+	if l.err {
+		return nil, &ParseError{f, "bad X25 PSDNAddress", l}, ""
+	}
+	rr.PSDNAddress = l.token
+	return rr, nil, ""
+}
+
+func setKX(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) {
+	rr := new(KX)
+	rr.Hdr = h
+
+	l := <-c
+	if l.length == 0 {
+		return rr, nil, ""
+	}
+	i, e := strconv.Atoi(l.token)
+	if e != nil || l.err {
+		return nil, &ParseError{f, "bad KX Pref", l}, ""
+	}
+	rr.Preference = uint16(i)
+	<-c     // zBlank
+	l = <-c // zString
+	rr.Exchanger = l.token
+	if l.token == "@" {
+		rr.Exchanger = o
+		return rr, nil, ""
+	}
+	_, ok := IsDomainName(l.token)
+	if !ok || l.length == 0 || l.err {
+		return nil, &ParseError{f, "bad KX Exchanger", l}, ""
+	}
+	if rr.Exchanger[l.length-1] != '.' {
+		rr.Exchanger = appendOrigin(rr.Exchanger, o)
+	}
+	return rr, nil, ""
+}
+
+func setCNAME(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) {
+	rr := new(CNAME)
+	rr.Hdr = h
+
+	l := <-c
+	rr.Target = l.token
+	if l.length == 0 {
+		return rr, nil, ""
+	}
+	if l.token == "@" {
+		rr.Target = o
+		return rr, nil, ""
+	}
+	_, ok := IsDomainName(l.token)
+	if !ok || l.length == 0 || l.err {
+		return nil, &ParseError{f, "bad CNAME Target", l}, ""
+	}
+	if rr.Target[l.length-1] != '.' {
+		rr.Target = appendOrigin(rr.Target, o)
+	}
+	return rr, nil, ""
+}
+
+func setDNAME(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) {
+	rr := new(DNAME)
+	rr.Hdr = h
+
+	l := <-c
+	rr.Target = l.token
+	if l.length == 0 {
+		return rr, nil, ""
+	}
+	if l.token == "@" {
+		rr.Target = o
+		return rr, nil, ""
+	}
+	_, ok := IsDomainName(l.token)
+	if !ok || l.length == 0 || l.err {
+		return nil, &ParseError{f, "bad CNAME Target", l}, ""
+	}
+	if rr.Target[l.length-1] != '.' {
+		rr.Target = appendOrigin(rr.Target, o)
+	}
+	return rr, nil, ""
+}
+
+func setSOA(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) {
+	rr := new(SOA)
+	rr.Hdr = h
+
+	l := <-c
+	rr.Ns = l.token
+	if l.length == 0 {
+		return rr, nil, ""
+	}
+	<-c // zBlank
+	if l.token == "@" {
+		rr.Ns = o
+	} else {
+		_, ok := IsDomainName(l.token)
+		if !ok || l.length == 0 || l.err {
+			return nil, &ParseError{f, "bad SOA Ns", l}, ""
+		}
+		if rr.Ns[l.length-1] != '.' {
+			rr.Ns = appendOrigin(rr.Ns, o)
+		}
+	}
+
+	l = <-c
+	rr.Mbox = l.token
+	if l.token == "@" {
+		rr.Mbox = o
+	} else {
+		_, ok := IsDomainName(l.token)
+		if !ok || l.length == 0 || l.err {
+			return nil, &ParseError{f, "bad SOA Mbox", l}, ""
+		}
+		if rr.Mbox[l.length-1] != '.' {
+			rr.Mbox = appendOrigin(rr.Mbox, o)
+		}
+	}
+	<-c // zBlank
+
+	var (
+		v  uint32
+		ok bool
+	)
+	for i := 0; i < 5; i++ {
+		l = <-c
+		if l.err {
+			return nil, &ParseError{f, "bad SOA zone parameter", l}, ""
+		}
+		if j, e := strconv.Atoi(l.token); e != nil {
+			if i == 0 {
+				// Serial should be a number
+				return nil, &ParseError{f, "bad SOA zone parameter", l}, ""
+			}
+			if v, ok = stringToTtl(l.token); !ok {
+				return nil, &ParseError{f, "bad SOA zone parameter", l}, ""
+
+			}
+		} else {
+			v = uint32(j)
+		}
+		switch i {
+		case 0:
+			rr.Serial = v
+			<-c // zBlank
+		case 1:
+			rr.Refresh = v
+			<-c // zBlank
+		case 2:
+			rr.Retry = v
+			<-c // zBlank
+		case 3:
+			rr.Expire = v
+			<-c // zBlank
+		case 4:
+			rr.Minttl = v
+		}
+	}
+	return rr, nil, ""
+}
+
+func setSRV(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) {
+	rr := new(SRV)
+	rr.Hdr = h
+
+	l := <-c
+	if l.length == 0 {
+		return rr, nil, ""
+	}
+	i, e := strconv.Atoi(l.token)
+	if e != nil || l.err {
+		return nil, &ParseError{f, "bad SRV Priority", l}, ""
+	}
+	rr.Priority = uint16(i)
+	<-c     // zBlank
+	l = <-c // zString
+	i, e = strconv.Atoi(l.token)
+	if e != nil || l.err {
+		return nil, &ParseError{f, "bad SRV Weight", l}, ""
+	}
+	rr.Weight = uint16(i)
+	<-c     // zBlank
+	l = <-c // zString
+	i, e = strconv.Atoi(l.token)
+	if e != nil || l.err {
+		return nil, &ParseError{f, "bad SRV Port", l}, ""
+	}
+	rr.Port = uint16(i)
+	<-c     // zBlank
+	l = <-c // zString
+	rr.Target = l.token
+	if l.token == "@" {
+		rr.Target = o
+		return rr, nil, ""
+	}
+	_, ok := IsDomainName(l.token)
+	if !ok || l.length == 0 || l.err {
+		return nil, &ParseError{f, "bad SRV Target", l}, ""
+	}
+	if rr.Target[l.length-1] != '.' {
+		rr.Target = appendOrigin(rr.Target, o)
+	}
+	return rr, nil, ""
+}
+
+func setNAPTR(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) {
+	rr := new(NAPTR)
+	rr.Hdr = h
+
+	l := <-c
+	if l.length == 0 {
+		return rr, nil, ""
+	}
+	i, e := strconv.Atoi(l.token)
+	if e != nil || l.err {
+		return nil, &ParseError{f, "bad NAPTR Order", l}, ""
+	}
+	rr.Order = uint16(i)
+	<-c     // zBlank
+	l = <-c // zString
+	i, e = strconv.Atoi(l.token)
+	if e != nil || l.err {
+		return nil, &ParseError{f, "bad NAPTR Preference", l}, ""
+	}
+	rr.Preference = uint16(i)
+	// Flags
+	<-c     // zBlank
+	l = <-c // _QUOTE
+	if l.value != zQuote {
+		return nil, &ParseError{f, "bad NAPTR Flags", l}, ""
+	}
+	l = <-c // Either String or Quote
+	if l.value == zString {
+		rr.Flags = l.token
+		l = <-c // _QUOTE
+		if l.value != zQuote {
+			return nil, &ParseError{f, "bad NAPTR Flags", l}, ""
+		}
+	} else if l.value == zQuote {
+		rr.Flags = ""
+	} else {
+		return nil, &ParseError{f, "bad NAPTR Flags", l}, ""
+	}
+
+	// Service
+	<-c     // zBlank
+	l = <-c // _QUOTE
+	if l.value != zQuote {
+		return nil, &ParseError{f, "bad NAPTR Service", l}, ""
+	}
+	l = <-c // Either String or Quote
+	if l.value == zString {
+		rr.Service = l.token
+		l = <-c // _QUOTE
+		if l.value != zQuote {
+			return nil, &ParseError{f, "bad NAPTR Service", l}, ""
+		}
+	} else if l.value == zQuote {
+		rr.Service = ""
+	} else {
+		return nil, &ParseError{f, "bad NAPTR Service", l}, ""
+	}
+
+	// Regexp
+	<-c     // zBlank
+	l = <-c // _QUOTE
+	if l.value != zQuote {
+		return nil, &ParseError{f, "bad NAPTR Regexp", l}, ""
+	}
+	l = <-c // Either String or Quote
+	if l.value == zString {
+		rr.Regexp = l.token
+		l = <-c // _QUOTE
+		if l.value != zQuote {
+			return nil, &ParseError{f, "bad NAPTR Regexp", l}, ""
+		}
+	} else if l.value == zQuote {
+		rr.Regexp = ""
+	} else {
+		return nil, &ParseError{f, "bad NAPTR Regexp", l}, ""
+	}
+	// After quote no space??
+	<-c     // zBlank
+	l = <-c // zString
+	rr.Replacement = l.token
+	if l.token == "@" {
+		rr.Replacement = o
+		return rr, nil, ""
+	}
+	_, ok := IsDomainName(l.token)
+	if !ok || l.length == 0 || l.err {
+		return nil, &ParseError{f, "bad NAPTR Replacement", l}, ""
+	}
+	if rr.Replacement[l.length-1] != '.' {
+		rr.Replacement = appendOrigin(rr.Replacement, o)
+	}
+	return rr, nil, ""
+}
+
+func setTALINK(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) {
+	rr := new(TALINK)
+	rr.Hdr = h
+
+	l := <-c
+	rr.PreviousName = l.token
+	if l.length == 0 {
+		return rr, nil, ""
+	}
+	if l.token == "@" {
+		rr.PreviousName = o
+	} else {
+		_, ok := IsDomainName(l.token)
+		if !ok || l.length == 0 || l.err {
+			return nil, &ParseError{f, "bad TALINK PreviousName", l}, ""
+		}
+		if rr.PreviousName[l.length-1] != '.' {
+			rr.PreviousName = appendOrigin(rr.PreviousName, o)
+		}
+	}
+	<-c // zBlank
+	l = <-c
+	rr.NextName = l.token
+	if l.token == "@" {
+		rr.NextName = o
+		return rr, nil, ""
+	}
+	_, ok := IsDomainName(l.token)
+	if !ok || l.length == 0 || l.err {
+		return nil, &ParseError{f, "bad TALINK NextName", l}, ""
+	}
+	if rr.NextName[l.length-1] != '.' {
+		rr.NextName = appendOrigin(rr.NextName, o)
+	}
+	return rr, nil, ""
+}
+
+func setLOC(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) {
+	rr := new(LOC)
+	rr.Hdr = h
+	// Non zero defaults for LOC record, see RFC 1876, Section 3.
+	rr.HorizPre = 165 // 10000
+	rr.VertPre = 162  // 10
+	rr.Size = 18      // 1
+	ok := false
+	// North
+	l := <-c
+	if l.length == 0 {
+		return rr, nil, ""
+	}
+	i, e := strconv.Atoi(l.token)
+	if e != nil || l.err {
+		return nil, &ParseError{f, "bad LOC Latitude", l}, ""
+	}
+	rr.Latitude = 1000 * 60 * 60 * uint32(i)
+
+	<-c // zBlank
+	// Either number, 'N' or 'S'
+	l = <-c
+	if rr.Latitude, ok = locCheckNorth(l.token, rr.Latitude); ok {
+		goto East
+	}
+	i, e = strconv.Atoi(l.token)
+	if e != nil || l.err {
+		return nil, &ParseError{f, "bad LOC Latitude minutes", l}, ""
+	}
+	rr.Latitude += 1000 * 60 * uint32(i)
+
+	<-c // zBlank
+	l = <-c
+	if i, e := strconv.ParseFloat(l.token, 32); e != nil || l.err {
+		return nil, &ParseError{f, "bad LOC Latitude seconds", l}, ""
+	} else {
+		rr.Latitude += uint32(1000 * i)
+	}
+	<-c // zBlank
+	// Either number, 'N' or 'S'
+	l = <-c
+	if rr.Latitude, ok = locCheckNorth(l.token, rr.Latitude); ok {
+		goto East
+	}
+	// If still alive, flag an error
+	return nil, &ParseError{f, "bad LOC Latitude North/South", l}, ""
+
+East:
+	// East
+	<-c // zBlank
+	l = <-c
+	if i, e := strconv.Atoi(l.token); e != nil || l.err {
+		return nil, &ParseError{f, "bad LOC Longitude", l}, ""
+	} else {
+		rr.Longitude = 1000 * 60 * 60 * uint32(i)
+	}
+	<-c // zBlank
+	// Either number, 'E' or 'W'
+	l = <-c
+	if rr.Longitude, ok = locCheckEast(l.token, rr.Longitude); ok {
+		goto Altitude
+	}
+	if i, e := strconv.Atoi(l.token); e != nil || l.err {
+		return nil, &ParseError{f, "bad LOC Longitude minutes", l}, ""
+	} else {
+		rr.Longitude += 1000 * 60 * uint32(i)
+	}
+	<-c // zBlank
+	l = <-c
+	if i, e := strconv.ParseFloat(l.token, 32); e != nil || l.err {
+		return nil, &ParseError{f, "bad LOC Longitude seconds", l}, ""
+	} else {
+		rr.Longitude += uint32(1000 * i)
+	}
+	<-c // zBlank
+	// Either number, 'E' or 'W'
+	l = <-c
+	if rr.Longitude, ok = locCheckEast(l.token, rr.Longitude); ok {
+		goto Altitude
+	}
+	// If still alive, flag an error
+	return nil, &ParseError{f, "bad LOC Longitude East/West", l}, ""
+
+Altitude:
+	<-c // zBlank
+	l = <-c
+	if l.length == 0 || l.err {
+		return nil, &ParseError{f, "bad LOC Altitude", l}, ""
+	}
+	if l.token[len(l.token)-1] == 'M' || l.token[len(l.token)-1] == 'm' {
+		l.token = l.token[0 : len(l.token)-1]
+	}
+	if i, e := strconv.ParseFloat(l.token, 32); e != nil {
+		return nil, &ParseError{f, "bad LOC Altitude", l}, ""
+	} else {
+		rr.Altitude = uint32(i*100.0 + 10000000.0 + 0.5)
+	}
+
+	// And now optionally the other values
+	l = <-c
+	count := 0
+	for l.value != zNewline && l.value != zEOF {
+		switch l.value {
+		case zString:
+			switch count {
+			case 0: // Size
+				e, m, ok := stringToCm(l.token)
+				if !ok {
+					return nil, &ParseError{f, "bad LOC Size", l}, ""
+				}
+				rr.Size = (e & 0x0f) | (m << 4 & 0xf0)
+			case 1: // HorizPre
+				e, m, ok := stringToCm(l.token)
+				if !ok {
+					return nil, &ParseError{f, "bad LOC HorizPre", l}, ""
+				}
+				rr.HorizPre = (e & 0x0f) | (m << 4 & 0xf0)
+			case 2: // VertPre
+				e, m, ok := stringToCm(l.token)
+				if !ok {
+					return nil, &ParseError{f, "bad LOC VertPre", l}, ""
+				}
+				rr.VertPre = (e & 0x0f) | (m << 4 & 0xf0)
+			}
+			count++
+		case zBlank:
+			// Ok
+		default:
+			return nil, &ParseError{f, "bad LOC Size, HorizPre or VertPre", l}, ""
+		}
+		l = <-c
+	}
+	return rr, nil, ""
+}
+
+func setHIP(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) {
+	rr := new(HIP)
+	rr.Hdr = h
+
+	// HitLength is not represented
+	l := <-c
+	if l.length == 0 {
+		return rr, nil, l.comment
+	}
+	i, e := strconv.Atoi(l.token)
+	if e != nil || l.err {
+		return nil, &ParseError{f, "bad HIP PublicKeyAlgorithm", l}, ""
+	}
+	rr.PublicKeyAlgorithm = uint8(i)
+	<-c     // zBlank
+	l = <-c // zString
+	if l.length == 0 || l.err {
+		return nil, &ParseError{f, "bad HIP Hit", l}, ""
+	}
+	rr.Hit = l.token // This can not contain spaces, see RFC 5205 Section 6.
+	rr.HitLength = uint8(len(rr.Hit)) / 2
+
+	<-c     // zBlank
+	l = <-c // zString
+	if l.length == 0 || l.err {
+		return nil, &ParseError{f, "bad HIP PublicKey", l}, ""
+	}
+	rr.PublicKey = l.token // This cannot contain spaces
+	rr.PublicKeyLength = uint16(base64.StdEncoding.DecodedLen(len(rr.PublicKey)))
+
+	// RendezvousServers (if any)
+	l = <-c
+	var xs []string
+	for l.value != zNewline && l.value != zEOF {
+		switch l.value {
+		case zString:
+			if l.token == "@" {
+				xs = append(xs, o)
+				l = <-c
+				continue
+			}
+			_, ok := IsDomainName(l.token)
+			if !ok || l.length == 0 || l.err {
+				return nil, &ParseError{f, "bad HIP RendezvousServers", l}, ""
+			}
+			if l.token[l.length-1] != '.' {
+				l.token = appendOrigin(l.token, o)
+			}
+			xs = append(xs, l.token)
+		case zBlank:
+			// Ok
+		default:
+			return nil, &ParseError{f, "bad HIP RendezvousServers", l}, ""
+		}
+		l = <-c
+	}
+	rr.RendezvousServers = xs
+	return rr, nil, l.comment
+}
+
+func setCERT(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) {
+	rr := new(CERT)
+	rr.Hdr = h
+
+	l := <-c
+	if l.length == 0 {
+		return rr, nil, l.comment
+	}
+	if v, ok := StringToCertType[l.token]; ok {
+		rr.Type = v
+	} else if i, e := strconv.Atoi(l.token); e != nil {
+		return nil, &ParseError{f, "bad CERT Type", l}, ""
+	} else {
+		rr.Type = uint16(i)
+	}
+	<-c     // zBlank
+	l = <-c // zString
+	i, e := strconv.Atoi(l.token)
+	if e != nil || l.err {
+		return nil, &ParseError{f, "bad CERT KeyTag", l}, ""
+	}
+	rr.KeyTag = uint16(i)
+	<-c     // zBlank
+	l = <-c // zString
+	if v, ok := StringToAlgorithm[l.token]; ok {
+		rr.Algorithm = v
+	} else if i, e := strconv.Atoi(l.token); e != nil {
+		return nil, &ParseError{f, "bad CERT Algorithm", l}, ""
+	} else {
+		rr.Algorithm = uint8(i)
+	}
+	s, e1, c1 := endingToString(c, "bad CERT Certificate", f)
+	if e1 != nil {
+		return nil, e1, c1
+	}
+	rr.Certificate = s
+	return rr, nil, c1
+}
+
+func setOPENPGPKEY(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) {
+	rr := new(OPENPGPKEY)
+	rr.Hdr = h
+
+	s, e, c1 := endingToString(c, "bad OPENPGPKEY PublicKey", f)
+	if e != nil {
+		return nil, e, c1
+	}
+	rr.PublicKey = s
+	return rr, nil, c1
+}
+
+func setSIG(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) {
+	r, e, s := setRRSIG(h, c, o, f)
+	if r != nil {
+		return &SIG{*r.(*RRSIG)}, e, s
+	}
+	return nil, e, s
+}
+
+func setRRSIG(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) {
+	rr := new(RRSIG)
+	rr.Hdr = h
+	l := <-c
+	if l.length == 0 {
+		return rr, nil, l.comment
+	}
+	if t, ok := StringToType[l.tokenUpper]; !ok {
+		if strings.HasPrefix(l.tokenUpper, "TYPE") {
+			t, ok = typeToInt(l.tokenUpper)
+			if !ok {
+				return nil, &ParseError{f, "bad RRSIG Typecovered", l}, ""
+			}
+			rr.TypeCovered = t
+		} else {
+			return nil, &ParseError{f, "bad RRSIG Typecovered", l}, ""
+		}
+	} else {
+		rr.TypeCovered = t
+	}
+	<-c // zBlank
+	l = <-c
+	i, err := strconv.Atoi(l.token)
+	if err != nil || l.err {
+		return nil, &ParseError{f, "bad RRSIG Algorithm", l}, ""
+	}
+	rr.Algorithm = uint8(i)
+	<-c // zBlank
+	l = <-c
+	i, err = strconv.Atoi(l.token)
+	if err != nil || l.err {
+		return nil, &ParseError{f, "bad RRSIG Labels", l}, ""
+	}
+	rr.Labels = uint8(i)
+	<-c // zBlank
+	l = <-c
+	i, err = strconv.Atoi(l.token)
+	if err != nil || l.err {
+		return nil, &ParseError{f, "bad RRSIG OrigTtl", l}, ""
+	}
+	rr.OrigTtl = uint32(i)
+	<-c // zBlank
+	l = <-c
+	if i, err := StringToTime(l.token); err != nil {
+		// Try to see if all numeric and use it as epoch
+		if i, err := strconv.ParseInt(l.token, 10, 64); err == nil {
+			// TODO(miek): error out on > MAX_UINT32, same below
+			rr.Expiration = uint32(i)
+		} else {
+			return nil, &ParseError{f, "bad RRSIG Expiration", l}, ""
+		}
+	} else {
+		rr.Expiration = i
+	}
+	<-c // zBlank
+	l = <-c
+	if i, err := StringToTime(l.token); err != nil {
+		if i, err := strconv.ParseInt(l.token, 10, 64); err == nil {
+			rr.Inception = uint32(i)
+		} else {
+			return nil, &ParseError{f, "bad RRSIG Inception", l}, ""
+		}
+	} else {
+		rr.Inception = i
+	}
+	<-c // zBlank
+	l = <-c
+	i, err = strconv.Atoi(l.token)
+	if err != nil || l.err {
+		return nil, &ParseError{f, "bad RRSIG KeyTag", l}, ""
+	}
+	rr.KeyTag = uint16(i)
+	<-c // zBlank
+	l = <-c
+	rr.SignerName = l.token
+	if l.token == "@" {
+		rr.SignerName = o
+	} else {
+		_, ok := IsDomainName(l.token)
+		if !ok || l.length == 0 || l.err {
+			return nil, &ParseError{f, "bad RRSIG SignerName", l}, ""
+		}
+		if rr.SignerName[l.length-1] != '.' {
+			rr.SignerName = appendOrigin(rr.SignerName, o)
+		}
+	}
+	s, e, c1 := endingToString(c, "bad RRSIG Signature", f)
+	if e != nil {
+		return nil, e, c1
+	}
+	rr.Signature = s
+	return rr, nil, c1
+}
+
+func setNSEC(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) {
+	rr := new(NSEC)
+	rr.Hdr = h
+
+	l := <-c
+	rr.NextDomain = l.token
+	if l.length == 0 {
+		return rr, nil, l.comment
+	}
+	if l.token == "@" {
+		rr.NextDomain = o
+	} else {
+		_, ok := IsDomainName(l.token)
+		if !ok || l.length == 0 || l.err {
+			return nil, &ParseError{f, "bad NSEC NextDomain", l}, ""
+		}
+		if rr.NextDomain[l.length-1] != '.' {
+			rr.NextDomain = appendOrigin(rr.NextDomain, o)
+		}
+	}
+
+	rr.TypeBitMap = make([]uint16, 0)
+	var (
+		k  uint16
+		ok bool
+	)
+	l = <-c
+	for l.value != zNewline && l.value != zEOF {
+		switch l.value {
+		case zBlank:
+			// Ok
+		case zString:
+			if k, ok = StringToType[l.tokenUpper]; !ok {
+				if k, ok = typeToInt(l.tokenUpper); !ok {
+					return nil, &ParseError{f, "bad NSEC TypeBitMap", l}, ""
+				}
+			}
+			rr.TypeBitMap = append(rr.TypeBitMap, k)
+		default:
+			return nil, &ParseError{f, "bad NSEC TypeBitMap", l}, ""
+		}
+		l = <-c
+	}
+	return rr, nil, l.comment
+}
+
+func setNSEC3(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) {
+	rr := new(NSEC3)
+	rr.Hdr = h
+
+	l := <-c
+	if l.length == 0 {
+		return rr, nil, l.comment
+	}
+	i, e := strconv.Atoi(l.token)
+	if e != nil || l.err {
+		return nil, &ParseError{f, "bad NSEC3 Hash", l}, ""
+	}
+	rr.Hash = uint8(i)
+	<-c // zBlank
+	l = <-c
+	i, e = strconv.Atoi(l.token)
+	if e != nil || l.err {
+		return nil, &ParseError{f, "bad NSEC3 Flags", l}, ""
+	}
+	rr.Flags = uint8(i)
+	<-c // zBlank
+	l = <-c
+	i, e = strconv.Atoi(l.token)
+	if e != nil || l.err {
+		return nil, &ParseError{f, "bad NSEC3 Iterations", l}, ""
+	}
+	rr.Iterations = uint16(i)
+	<-c
+	l = <-c
+	if len(l.token) == 0 || l.err {
+		return nil, &ParseError{f, "bad NSEC3 Salt", l}, ""
+	}
+	rr.SaltLength = uint8(len(l.token)) / 2
+	rr.Salt = l.token
+
+	<-c
+	l = <-c
+	if len(l.token) == 0 || l.err {
+		return nil, &ParseError{f, "bad NSEC3 NextDomain", l}, ""
+	}
+	rr.HashLength = 20 // Fix for NSEC3 (sha1 160 bits)
+	rr.NextDomain = l.token
+
+	rr.TypeBitMap = make([]uint16, 0)
+	var (
+		k  uint16
+		ok bool
+	)
+	l = <-c
+	for l.value != zNewline && l.value != zEOF {
+		switch l.value {
+		case zBlank:
+			// Ok
+		case zString:
+			if k, ok = StringToType[l.tokenUpper]; !ok {
+				if k, ok = typeToInt(l.tokenUpper); !ok {
+					return nil, &ParseError{f, "bad NSEC3 TypeBitMap", l}, ""
+				}
+			}
+			rr.TypeBitMap = append(rr.TypeBitMap, k)
+		default:
+			return nil, &ParseError{f, "bad NSEC3 TypeBitMap", l}, ""
+		}
+		l = <-c
+	}
+	return rr, nil, l.comment
+}
+
+func setNSEC3PARAM(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) {
+	rr := new(NSEC3PARAM)
+	rr.Hdr = h
+
+	l := <-c
+	if l.length == 0 {
+		return rr, nil, ""
+	}
+	i, e := strconv.Atoi(l.token)
+	if e != nil || l.err {
+		return nil, &ParseError{f, "bad NSEC3PARAM Hash", l}, ""
+	}
+	rr.Hash = uint8(i)
+	<-c // zBlank
+	l = <-c
+	i, e = strconv.Atoi(l.token)
+	if e != nil || l.err {
+		return nil, &ParseError{f, "bad NSEC3PARAM Flags", l}, ""
+	}
+	rr.Flags = uint8(i)
+	<-c // zBlank
+	l = <-c
+	i, e = strconv.Atoi(l.token)
+	if e != nil || l.err {
+		return nil, &ParseError{f, "bad NSEC3PARAM Iterations", l}, ""
+	}
+	rr.Iterations = uint16(i)
+	<-c
+	l = <-c
+	rr.SaltLength = uint8(len(l.token))
+	rr.Salt = l.token
+	return rr, nil, ""
+}
+
+func setEUI48(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) {
+	rr := new(EUI48)
+	rr.Hdr = h
+
+	l := <-c
+	if l.length == 0 {
+		return rr, nil, ""
+	}
+	if l.length != 17 || l.err {
+		return nil, &ParseError{f, "bad EUI48 Address", l}, ""
+	}
+	addr := make([]byte, 12)
+	dash := 0
+	for i := 0; i < 10; i += 2 {
+		addr[i] = l.token[i+dash]
+		addr[i+1] = l.token[i+1+dash]
+		dash++
+		if l.token[i+1+dash] != '-' {
+			return nil, &ParseError{f, "bad EUI48 Address", l}, ""
+		}
+	}
+	addr[10] = l.token[15]
+	addr[11] = l.token[16]
+
+	i, e := strconv.ParseUint(string(addr), 16, 48)
+	if e != nil {
+		return nil, &ParseError{f, "bad EUI48 Address", l}, ""
+	}
+	rr.Address = i
+	return rr, nil, ""
+}
+
+func setEUI64(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) {
+	rr := new(EUI64)
+	rr.Hdr = h
+
+	l := <-c
+	if l.length == 0 {
+		return rr, nil, ""
+	}
+	if l.length != 23 || l.err {
+		return nil, &ParseError{f, "bad EUI64 Address", l}, ""
+	}
+	addr := make([]byte, 16)
+	dash := 0
+	for i := 0; i < 14; i += 2 {
+		addr[i] = l.token[i+dash]
+		addr[i+1] = l.token[i+1+dash]
+		dash++
+		if l.token[i+1+dash] != '-' {
+			return nil, &ParseError{f, "bad EUI64 Address", l}, ""
+		}
+	}
+	addr[14] = l.token[21]
+	addr[15] = l.token[22]
+
+	i, e := strconv.ParseUint(string(addr), 16, 64)
+	if e != nil {
+		return nil, &ParseError{f, "bad EUI68 Address", l}, ""
+	}
+	rr.Address = uint64(i)
+	return rr, nil, ""
+}
+
+func setSSHFP(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) {
+	rr := new(SSHFP)
+	rr.Hdr = h
+
+	l := <-c
+	if l.length == 0 {
+		return rr, nil, ""
+	}
+	i, e := strconv.Atoi(l.token)
+	if e != nil || l.err {
+		return nil, &ParseError{f, "bad SSHFP Algorithm", l}, ""
+	}
+	rr.Algorithm = uint8(i)
+	<-c // zBlank
+	l = <-c
+	i, e = strconv.Atoi(l.token)
+	if e != nil || l.err {
+		return nil, &ParseError{f, "bad SSHFP Type", l}, ""
+	}
+	rr.Type = uint8(i)
+	<-c // zBlank
+	s, e1, c1 := endingToString(c, "bad SSHFP Fingerprint", f)
+	if e1 != nil {
+		return nil, e1, c1
+	}
+	rr.FingerPrint = s
+	return rr, nil, ""
+}
+
+func setDNSKEYs(h RR_Header, c chan lex, o, f, typ string) (RR, *ParseError, string) {
+	rr := new(DNSKEY)
+	rr.Hdr = h
+
+	l := <-c
+	if l.length == 0 {
+		return rr, nil, l.comment
+	}
+	i, e := strconv.Atoi(l.token)
+	if e != nil || l.err {
+		return nil, &ParseError{f, "bad " + typ + " Flags", l}, ""
+	}
+	rr.Flags = uint16(i)
+	<-c     // zBlank
+	l = <-c // zString
+	i, e = strconv.Atoi(l.token)
+	if e != nil || l.err {
+		return nil, &ParseError{f, "bad " + typ + " Protocol", l}, ""
+	}
+	rr.Protocol = uint8(i)
+	<-c     // zBlank
+	l = <-c // zString
+	i, e = strconv.Atoi(l.token)
+	if e != nil || l.err {
+		return nil, &ParseError{f, "bad " + typ + " Algorithm", l}, ""
+	}
+	rr.Algorithm = uint8(i)
+	s, e1, c1 := endingToString(c, "bad "+typ+" PublicKey", f)
+	if e1 != nil {
+		return nil, e1, c1
+	}
+	rr.PublicKey = s
+	return rr, nil, c1
+}
+
+func setKEY(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) {
+	r, e, s := setDNSKEYs(h, c, o, f, "KEY")
+	if r != nil {
+		return &KEY{*r.(*DNSKEY)}, e, s
+	}
+	return nil, e, s
+}
+
+func setDNSKEY(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) {
+	r, e, s := setDNSKEYs(h, c, o, f, "DNSKEY")
+	return r, e, s
+}
+
+func setCDNSKEY(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) {
+	r, e, s := setDNSKEYs(h, c, o, f, "CDNSKEY")
+	if r != nil {
+		return &CDNSKEY{*r.(*DNSKEY)}, e, s
+	}
+	return nil, e, s
+}
+
+func setRKEY(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) {
+	rr := new(RKEY)
+	rr.Hdr = h
+
+	l := <-c
+	if l.length == 0 {
+		return rr, nil, l.comment
+	}
+	i, e := strconv.Atoi(l.token)
+	if e != nil || l.err {
+		return nil, &ParseError{f, "bad RKEY Flags", l}, ""
+	}
+	rr.Flags = uint16(i)
+	<-c     // zBlank
+	l = <-c // zString
+	i, e = strconv.Atoi(l.token)
+	if e != nil || l.err {
+		return nil, &ParseError{f, "bad RKEY Protocol", l}, ""
+	}
+	rr.Protocol = uint8(i)
+	<-c     // zBlank
+	l = <-c // zString
+	i, e = strconv.Atoi(l.token)
+	if e != nil || l.err {
+		return nil, &ParseError{f, "bad RKEY Algorithm", l}, ""
+	}
+	rr.Algorithm = uint8(i)
+	s, e1, c1 := endingToString(c, "bad RKEY PublicKey", f)
+	if e1 != nil {
+		return nil, e1, c1
+	}
+	rr.PublicKey = s
+	return rr, nil, c1
+}
+
+func setEID(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) {
+	rr := new(EID)
+	rr.Hdr = h
+	s, e, c1 := endingToString(c, "bad EID Endpoint", f)
+	if e != nil {
+		return nil, e, c1
+	}
+	rr.Endpoint = s
+	return rr, nil, c1
+}
+
+func setNIMLOC(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) {
+	rr := new(NIMLOC)
+	rr.Hdr = h
+	s, e, c1 := endingToString(c, "bad NIMLOC Locator", f)
+	if e != nil {
+		return nil, e, c1
+	}
+	rr.Locator = s
+	return rr, nil, c1
+}
+
+func setGPOS(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) {
+	rr := new(GPOS)
+	rr.Hdr = h
+	l := <-c
+	if l.length == 0 {
+		return rr, nil, ""
+	}
+	_, e := strconv.ParseFloat(l.token, 64)
+	if e != nil || l.err {
+		return nil, &ParseError{f, "bad GPOS Longitude", l}, ""
+	}
+	rr.Longitude = l.token
+	<-c // zBlank
+	l = <-c
+	_, e = strconv.ParseFloat(l.token, 64)
+	if e != nil || l.err {
+		return nil, &ParseError{f, "bad GPOS Latitude", l}, ""
+	}
+	rr.Latitude = l.token
+	<-c // zBlank
+	l = <-c
+	_, e = strconv.ParseFloat(l.token, 64)
+	if e != nil || l.err {
+		return nil, &ParseError{f, "bad GPOS Altitude", l}, ""
+	}
+	rr.Altitude = l.token
+	return rr, nil, ""
+}
+
+func setDSs(h RR_Header, c chan lex, o, f, typ string) (RR, *ParseError, string) {
+	rr := new(DS)
+	rr.Hdr = h
+	l := <-c
+	if l.length == 0 {
+		return rr, nil, l.comment
+	}
+	i, e := strconv.Atoi(l.token)
+	if e != nil || l.err {
+		return nil, &ParseError{f, "bad " + typ + " KeyTag", l}, ""
+	}
+	rr.KeyTag = uint16(i)
+	<-c // zBlank
+	l = <-c
+	if i, e := strconv.Atoi(l.token); e != nil {
+		i, ok := StringToAlgorithm[l.tokenUpper]
+		if !ok || l.err {
+			return nil, &ParseError{f, "bad " + typ + " Algorithm", l}, ""
+		}
+		rr.Algorithm = i
+	} else {
+		rr.Algorithm = uint8(i)
+	}
+	<-c // zBlank
+	l = <-c
+	i, e = strconv.Atoi(l.token)
+	if e != nil || l.err {
+		return nil, &ParseError{f, "bad " + typ + " DigestType", l}, ""
+	}
+	rr.DigestType = uint8(i)
+	s, e1, c1 := endingToString(c, "bad "+typ+" Digest", f)
+	if e1 != nil {
+		return nil, e1, c1
+	}
+	rr.Digest = s
+	return rr, nil, c1
+}
+
+func setDS(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) {
+	r, e, s := setDSs(h, c, o, f, "DS")
+	return r, e, s
+}
+
+func setDLV(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) {
+	r, e, s := setDSs(h, c, o, f, "DLV")
+	if r != nil {
+		return &DLV{*r.(*DS)}, e, s
+	}
+	return nil, e, s
+}
+
+func setCDS(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) {
+	r, e, s := setDSs(h, c, o, f, "CDS")
+	if r != nil {
+		return &CDS{*r.(*DS)}, e, s
+	}
+	return nil, e, s
+}
+
+func setTA(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) {
+	rr := new(TA)
+	rr.Hdr = h
+	l := <-c
+	if l.length == 0 {
+		return rr, nil, l.comment
+	}
+	i, e := strconv.Atoi(l.token)
+	if e != nil || l.err {
+		return nil, &ParseError{f, "bad TA KeyTag", l}, ""
+	}
+	rr.KeyTag = uint16(i)
+	<-c // zBlank
+	l = <-c
+	if i, e := strconv.Atoi(l.token); e != nil {
+		i, ok := StringToAlgorithm[l.tokenUpper]
+		if !ok || l.err {
+			return nil, &ParseError{f, "bad TA Algorithm", l}, ""
+		}
+		rr.Algorithm = i
+	} else {
+		rr.Algorithm = uint8(i)
+	}
+	<-c // zBlank
+	l = <-c
+	i, e = strconv.Atoi(l.token)
+	if e != nil || l.err {
+		return nil, &ParseError{f, "bad TA DigestType", l}, ""
+	}
+	rr.DigestType = uint8(i)
+	s, e, c1 := endingToString(c, "bad TA Digest", f)
+	if e != nil {
+		return nil, e.(*ParseError), c1
+	}
+	rr.Digest = s
+	return rr, nil, c1
+}
+
+func setTLSA(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) {
+	rr := new(TLSA)
+	rr.Hdr = h
+	l := <-c
+	if l.length == 0 {
+		return rr, nil, l.comment
+	}
+	i, e := strconv.Atoi(l.token)
+	if e != nil || l.err {
+		return nil, &ParseError{f, "bad TLSA Usage", l}, ""
+	}
+	rr.Usage = uint8(i)
+	<-c // zBlank
+	l = <-c
+	i, e = strconv.Atoi(l.token)
+	if e != nil || l.err {
+		return nil, &ParseError{f, "bad TLSA Selector", l}, ""
+	}
+	rr.Selector = uint8(i)
+	<-c // zBlank
+	l = <-c
+	i, e = strconv.Atoi(l.token)
+	if e != nil || l.err {
+		return nil, &ParseError{f, "bad TLSA MatchingType", l}, ""
+	}
+	rr.MatchingType = uint8(i)
+	// So this needs be e2 (i.e. different than e), because...??t
+	s, e2, c1 := endingToString(c, "bad TLSA Certificate", f)
+	if e2 != nil {
+		return nil, e2, c1
+	}
+	rr.Certificate = s
+	return rr, nil, c1
+}
+
+func setSMIMEA(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) {
+	rr := new(SMIMEA)
+	rr.Hdr = h
+	l := <-c
+	if l.length == 0 {
+		return rr, nil, l.comment
+	}
+	i, e := strconv.Atoi(l.token)
+	if e != nil || l.err {
+		return nil, &ParseError{f, "bad SMIMEA Usage", l}, ""
+	}
+	rr.Usage = uint8(i)
+	<-c // zBlank
+	l = <-c
+	i, e = strconv.Atoi(l.token)
+	if e != nil || l.err {
+		return nil, &ParseError{f, "bad SMIMEA Selector", l}, ""
+	}
+	rr.Selector = uint8(i)
+	<-c // zBlank
+	l = <-c
+	i, e = strconv.Atoi(l.token)
+	if e != nil || l.err {
+		return nil, &ParseError{f, "bad SMIMEA MatchingType", l}, ""
+	}
+	rr.MatchingType = uint8(i)
+	// So this needs be e2 (i.e. different than e), because...??t
+	s, e2, c1 := endingToString(c, "bad SMIMEA Certificate", f)
+	if e2 != nil {
+		return nil, e2, c1
+	}
+	rr.Certificate = s
+	return rr, nil, c1
+}
+
+func setRFC3597(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) {
+	rr := new(RFC3597)
+	rr.Hdr = h
+	l := <-c
+	if l.token != "\\#" {
+		return nil, &ParseError{f, "bad RFC3597 Rdata", l}, ""
+	}
+	<-c // zBlank
+	l = <-c
+	rdlength, e := strconv.Atoi(l.token)
+	if e != nil || l.err {
+		return nil, &ParseError{f, "bad RFC3597 Rdata ", l}, ""
+	}
+
+	s, e1, c1 := endingToString(c, "bad RFC3597 Rdata", f)
+	if e1 != nil {
+		return nil, e1, c1
+	}
+	if rdlength*2 != len(s) {
+		return nil, &ParseError{f, "bad RFC3597 Rdata", l}, ""
+	}
+	rr.Rdata = s
+	return rr, nil, c1
+}
+
+func setSPF(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) {
+	rr := new(SPF)
+	rr.Hdr = h
+
+	s, e, c1 := endingToTxtSlice(c, "bad SPF Txt", f)
+	if e != nil {
+		return nil, e, ""
+	}
+	rr.Txt = s
+	return rr, nil, c1
+}
+
+func setTXT(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) {
+	rr := new(TXT)
+	rr.Hdr = h
+
+	// no zBlank reading here, because all this rdata is TXT
+	s, e, c1 := endingToTxtSlice(c, "bad TXT Txt", f)
+	if e != nil {
+		return nil, e, ""
+	}
+	rr.Txt = s
+	return rr, nil, c1
+}
+
+// identical to setTXT
+func setNINFO(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) {
+	rr := new(NINFO)
+	rr.Hdr = h
+
+	s, e, c1 := endingToTxtSlice(c, "bad NINFO ZSData", f)
+	if e != nil {
+		return nil, e, ""
+	}
+	rr.ZSData = s
+	return rr, nil, c1
+}
+
+func setURI(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) {
+	rr := new(URI)
+	rr.Hdr = h
+
+	l := <-c
+	if l.length == 0 { // Dynamic updates.
+		return rr, nil, ""
+	}
+
+	i, e := strconv.Atoi(l.token)
+	if e != nil || l.err {
+		return nil, &ParseError{f, "bad URI Priority", l}, ""
+	}
+	rr.Priority = uint16(i)
+	<-c // zBlank
+	l = <-c
+	i, e = strconv.Atoi(l.token)
+	if e != nil || l.err {
+		return nil, &ParseError{f, "bad URI Weight", l}, ""
+	}
+	rr.Weight = uint16(i)
+
+	<-c // zBlank
+	s, err, c1 := endingToTxtSlice(c, "bad URI Target", f)
+	if err != nil {
+		return nil, err, ""
+	}
+	if len(s) > 1 {
+		return nil, &ParseError{f, "bad URI Target", l}, ""
+	}
+	rr.Target = s[0]
+	return rr, nil, c1
+}
+
+func setDHCID(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) {
+	// awesome record to parse!
+	rr := new(DHCID)
+	rr.Hdr = h
+
+	s, e, c1 := endingToString(c, "bad DHCID Digest", f)
+	if e != nil {
+		return nil, e, c1
+	}
+	rr.Digest = s
+	return rr, nil, c1
+}
+
+func setNID(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) {
+	rr := new(NID)
+	rr.Hdr = h
+
+	l := <-c
+	if l.length == 0 {
+		return rr, nil, ""
+	}
+	i, e := strconv.Atoi(l.token)
+	if e != nil || l.err {
+		return nil, &ParseError{f, "bad NID Preference", l}, ""
+	}
+	rr.Preference = uint16(i)
+	<-c     // zBlank
+	l = <-c // zString
+	u, err := stringToNodeID(l)
+	if err != nil || l.err {
+		return nil, err, ""
+	}
+	rr.NodeID = u
+	return rr, nil, ""
+}
+
+func setL32(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) {
+	rr := new(L32)
+	rr.Hdr = h
+
+	l := <-c
+	if l.length == 0 {
+		return rr, nil, ""
+	}
+	i, e := strconv.Atoi(l.token)
+	if e != nil || l.err {
+		return nil, &ParseError{f, "bad L32 Preference", l}, ""
+	}
+	rr.Preference = uint16(i)
+	<-c     // zBlank
+	l = <-c // zString
+	rr.Locator32 = net.ParseIP(l.token)
+	if rr.Locator32 == nil || l.err {
+		return nil, &ParseError{f, "bad L32 Locator", l}, ""
+	}
+	return rr, nil, ""
+}
+
+func setLP(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) {
+	rr := new(LP)
+	rr.Hdr = h
+
+	l := <-c
+	if l.length == 0 {
+		return rr, nil, ""
+	}
+	i, e := strconv.Atoi(l.token)
+	if e != nil || l.err {
+		return nil, &ParseError{f, "bad LP Preference", l}, ""
+	}
+	rr.Preference = uint16(i)
+	<-c     // zBlank
+	l = <-c // zString
+	rr.Fqdn = l.token
+	if l.length == 0 {
+		return rr, nil, ""
+	}
+	if l.token == "@" {
+		rr.Fqdn = o
+		return rr, nil, ""
+	}
+	_, ok := IsDomainName(l.token)
+	if !ok || l.length == 0 || l.err {
+		return nil, &ParseError{f, "bad LP Fqdn", l}, ""
+	}
+	if rr.Fqdn[l.length-1] != '.' {
+		rr.Fqdn = appendOrigin(rr.Fqdn, o)
+	}
+	return rr, nil, ""
+}
+
+func setL64(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) {
+	rr := new(L64)
+	rr.Hdr = h
+
+	l := <-c
+	if l.length == 0 {
+		return rr, nil, ""
+	}
+	i, e := strconv.Atoi(l.token)
+	if e != nil || l.err {
+		return nil, &ParseError{f, "bad L64 Preference", l}, ""
+	}
+	rr.Preference = uint16(i)
+	<-c     // zBlank
+	l = <-c // zString
+	u, err := stringToNodeID(l)
+	if err != nil || l.err {
+		return nil, err, ""
+	}
+	rr.Locator64 = u
+	return rr, nil, ""
+}
+
+func setUID(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) {
+	rr := new(UID)
+	rr.Hdr = h
+	l := <-c
+	if l.length == 0 {
+		return rr, nil, ""
+	}
+	i, e := strconv.Atoi(l.token)
+	if e != nil || l.err {
+		return nil, &ParseError{f, "bad UID Uid", l}, ""
+	}
+	rr.Uid = uint32(i)
+	return rr, nil, ""
+}
+
+func setGID(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) {
+	rr := new(GID)
+	rr.Hdr = h
+	l := <-c
+	if l.length == 0 {
+		return rr, nil, ""
+	}
+	i, e := strconv.Atoi(l.token)
+	if e != nil || l.err {
+		return nil, &ParseError{f, "bad GID Gid", l}, ""
+	}
+	rr.Gid = uint32(i)
+	return rr, nil, ""
+}
+
+func setUINFO(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) {
+	rr := new(UINFO)
+	rr.Hdr = h
+	s, e, c1 := endingToTxtSlice(c, "bad UINFO Uinfo", f)
+	if e != nil {
+		return nil, e, ""
+	}
+	rr.Uinfo = s[0] // silently discard anything above
+	return rr, nil, c1
+}
+
+func setPX(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) {
+	rr := new(PX)
+	rr.Hdr = h
+
+	l := <-c
+	if l.length == 0 {
+		return rr, nil, ""
+	}
+	i, e := strconv.Atoi(l.token)
+	if e != nil || l.err {
+		return nil, &ParseError{f, "bad PX Preference", l}, ""
+	}
+	rr.Preference = uint16(i)
+	<-c     // zBlank
+	l = <-c // zString
+	rr.Map822 = l.token
+	if l.length == 0 {
+		return rr, nil, ""
+	}
+	if l.token == "@" {
+		rr.Map822 = o
+		return rr, nil, ""
+	}
+	_, ok := IsDomainName(l.token)
+	if !ok || l.length == 0 || l.err {
+		return nil, &ParseError{f, "bad PX Map822", l}, ""
+	}
+	if rr.Map822[l.length-1] != '.' {
+		rr.Map822 = appendOrigin(rr.Map822, o)
+	}
+	<-c     // zBlank
+	l = <-c // zString
+	rr.Mapx400 = l.token
+	if l.token == "@" {
+		rr.Mapx400 = o
+		return rr, nil, ""
+	}
+	_, ok = IsDomainName(l.token)
+	if !ok || l.length == 0 || l.err {
+		return nil, &ParseError{f, "bad PX Mapx400", l}, ""
+	}
+	if rr.Mapx400[l.length-1] != '.' {
+		rr.Mapx400 = appendOrigin(rr.Mapx400, o)
+	}
+	return rr, nil, ""
+}
+
+func setCAA(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) {
+	rr := new(CAA)
+	rr.Hdr = h
+	l := <-c
+	if l.length == 0 {
+		return rr, nil, l.comment
+	}
+	i, err := strconv.Atoi(l.token)
+	if err != nil || l.err {
+		return nil, &ParseError{f, "bad CAA Flag", l}, ""
+	}
+	rr.Flag = uint8(i)
+
+	<-c     // zBlank
+	l = <-c // zString
+	if l.value != zString {
+		return nil, &ParseError{f, "bad CAA Tag", l}, ""
+	}
+	rr.Tag = l.token
+
+	<-c // zBlank
+	s, e, c1 := endingToTxtSlice(c, "bad CAA Value", f)
+	if e != nil {
+		return nil, e, ""
+	}
+	if len(s) > 1 {
+		return nil, &ParseError{f, "bad CAA Value", l}, ""
+	}
+	rr.Value = s[0]
+	return rr, nil, c1
+}
+
+var typeToparserFunc = map[uint16]parserFunc{
+	TypeAAAA:       {setAAAA, false},
+	TypeAFSDB:      {setAFSDB, false},
+	TypeA:          {setA, false},
+	TypeCAA:        {setCAA, true},
+	TypeCDS:        {setCDS, true},
+	TypeCDNSKEY:    {setCDNSKEY, true},
+	TypeCERT:       {setCERT, true},
+	TypeCNAME:      {setCNAME, false},
+	TypeDHCID:      {setDHCID, true},
+	TypeDLV:        {setDLV, true},
+	TypeDNAME:      {setDNAME, false},
+	TypeKEY:        {setKEY, true},
+	TypeDNSKEY:     {setDNSKEY, true},
+	TypeDS:         {setDS, true},
+	TypeEID:        {setEID, true},
+	TypeEUI48:      {setEUI48, false},
+	TypeEUI64:      {setEUI64, false},
+	TypeGID:        {setGID, false},
+	TypeGPOS:       {setGPOS, false},
+	TypeHINFO:      {setHINFO, true},
+	TypeHIP:        {setHIP, true},
+	TypeKX:         {setKX, false},
+	TypeL32:        {setL32, false},
+	TypeL64:        {setL64, false},
+	TypeLOC:        {setLOC, true},
+	TypeLP:         {setLP, false},
+	TypeMB:         {setMB, false},
+	TypeMD:         {setMD, false},
+	TypeMF:         {setMF, false},
+	TypeMG:         {setMG, false},
+	TypeMINFO:      {setMINFO, false},
+	TypeMR:         {setMR, false},
+	TypeMX:         {setMX, false},
+	TypeNAPTR:      {setNAPTR, false},
+	TypeNID:        {setNID, false},
+	TypeNIMLOC:     {setNIMLOC, true},
+	TypeNINFO:      {setNINFO, true},
+	TypeNSAPPTR:    {setNSAPPTR, false},
+	TypeNSEC3PARAM: {setNSEC3PARAM, false},
+	TypeNSEC3:      {setNSEC3, true},
+	TypeNSEC:       {setNSEC, true},
+	TypeNS:         {setNS, false},
+	TypeOPENPGPKEY: {setOPENPGPKEY, true},
+	TypePTR:        {setPTR, false},
+	TypePX:         {setPX, false},
+	TypeSIG:        {setSIG, true},
+	TypeRKEY:       {setRKEY, true},
+	TypeRP:         {setRP, false},
+	TypeRRSIG:      {setRRSIG, true},
+	TypeRT:         {setRT, false},
+	TypeSMIMEA:     {setSMIMEA, true},
+	TypeSOA:        {setSOA, false},
+	TypeSPF:        {setSPF, true},
+	TypeSRV:        {setSRV, false},
+	TypeSSHFP:      {setSSHFP, true},
+	TypeTALINK:     {setTALINK, false},
+	TypeTA:         {setTA, true},
+	TypeTLSA:       {setTLSA, true},
+	TypeTXT:        {setTXT, true},
+	TypeUID:        {setUID, false},
+	TypeUINFO:      {setUINFO, true},
+	TypeURI:        {setURI, true},
+	TypeX25:        {setX25, false},
+}
diff --git a/vendor/github.com/miekg/dns/scanner.go b/vendor/github.com/miekg/dns/scanner.go
new file mode 100644
index 000000000..c29bc2f38
--- /dev/null
+++ b/vendor/github.com/miekg/dns/scanner.go
@@ -0,0 +1,43 @@
+package dns
+
+// Implement a simple scanner, return a byte stream from an io reader.
+
+import (
+	"bufio"
+	"io"
+	"text/scanner"
+)
+
+type scan struct {
+	src      *bufio.Reader
+	position scanner.Position
+	eof      bool // Have we just seen a eof
+}
+
+func scanInit(r io.Reader) *scan {
+	s := new(scan)
+	s.src = bufio.NewReader(r)
+	s.position.Line = 1
+	return s
+}
+
+// tokenText returns the next byte from the input
+func (s *scan) tokenText() (byte, error) {
+	c, err := s.src.ReadByte()
+	if err != nil {
+		return c, err
+	}
+	// delay the newline handling until the next token is delivered,
+	// fixes off-by-one errors when reporting a parse error.
+	if s.eof == true {
+		s.position.Line++
+		s.position.Column = 0
+		s.eof = false
+	}
+	if c == '\n' {
+		s.eof = true
+		return c, nil
+	}
+	s.position.Column++
+	return c, nil
+}
diff --git a/vendor/github.com/miekg/dns/server.go b/vendor/github.com/miekg/dns/server.go
new file mode 100644
index 000000000..1d40ee56d
--- /dev/null
+++ b/vendor/github.com/miekg/dns/server.go
@@ -0,0 +1,734 @@
+// DNS server implementation.
+
+package dns
+
+import (
+	"bytes"
+	"crypto/tls"
+	"encoding/binary"
+	"io"
+	"net"
+	"sync"
+	"time"
+)
+
+// Maximum number of TCP queries before we close the socket.
+const maxTCPQueries = 128
+
+// Handler is implemented by any value that implements ServeDNS.
+type Handler interface {
+	ServeDNS(w ResponseWriter, r *Msg)
+}
+
+// A ResponseWriter interface is used by an DNS handler to
+// construct an DNS response.
+type ResponseWriter interface {
+	// LocalAddr returns the net.Addr of the server
+	LocalAddr() net.Addr
+	// RemoteAddr returns the net.Addr of the client that sent the current request.
+	RemoteAddr() net.Addr
+	// WriteMsg writes a reply back to the client.
+	WriteMsg(*Msg) error
+	// Write writes a raw buffer back to the client.
+	Write([]byte) (int, error)
+	// Close closes the connection.
+	Close() error
+	// TsigStatus returns the status of the Tsig.
+	TsigStatus() error
+	// TsigTimersOnly sets the tsig timers only boolean.
+	TsigTimersOnly(bool)
+	// Hijack lets the caller take over the connection.
+	// After a call to Hijack(), the DNS package will not do anything with the connection.
+	Hijack()
+}
+
+type response struct {
+	hijacked       bool // connection has been hijacked by handler
+	tsigStatus     error
+	tsigTimersOnly bool
+	tsigRequestMAC string
+	tsigSecret     map[string]string // the tsig secrets
+	udp            *net.UDPConn      // i/o connection if UDP was used
+	tcp            net.Conn          // i/o connection if TCP was used
+	udpSession     *SessionUDP       // oob data to get egress interface right
+	remoteAddr     net.Addr          // address of the client
+	writer         Writer            // writer to output the raw DNS bits
+}
+
+// ServeMux is an DNS request multiplexer. It matches the
+// zone name of each incoming request against a list of
+// registered patterns add calls the handler for the pattern
+// that most closely matches the zone name. ServeMux is DNSSEC aware, meaning
+// that queries for the DS record are redirected to the parent zone (if that
+// is also registered), otherwise the child gets the query.
+// ServeMux is also safe for concurrent access from multiple goroutines.
+type ServeMux struct {
+	z map[string]Handler
+	m *sync.RWMutex
+}
+
+// NewServeMux allocates and returns a new ServeMux.
+func NewServeMux() *ServeMux { return &ServeMux{z: make(map[string]Handler), m: new(sync.RWMutex)} }
+
+// DefaultServeMux is the default ServeMux used by Serve.
+var DefaultServeMux = NewServeMux()
+
+// The HandlerFunc type is an adapter to allow the use of
+// ordinary functions as DNS handlers.  If f is a function
+// with the appropriate signature, HandlerFunc(f) is a
+// Handler object that calls f.
+type HandlerFunc func(ResponseWriter, *Msg)
+
+// ServeDNS calls f(w, r).
+func (f HandlerFunc) ServeDNS(w ResponseWriter, r *Msg) {
+	f(w, r)
+}
+
+// HandleFailed returns a HandlerFunc that returns SERVFAIL for every request it gets.
+func HandleFailed(w ResponseWriter, r *Msg) {
+	m := new(Msg)
+	m.SetRcode(r, RcodeServerFailure)
+	// does not matter if this write fails
+	w.WriteMsg(m)
+}
+
+func failedHandler() Handler { return HandlerFunc(HandleFailed) }
+
+// ListenAndServe Starts a server on address and network specified Invoke handler
+// for incoming queries.
+func ListenAndServe(addr string, network string, handler Handler) error {
+	server := &Server{Addr: addr, Net: network, Handler: handler}
+	return server.ListenAndServe()
+}
+
+// ListenAndServeTLS acts like http.ListenAndServeTLS, more information in
+// http://golang.org/pkg/net/http/#ListenAndServeTLS
+func ListenAndServeTLS(addr, certFile, keyFile string, handler Handler) error {
+	cert, err := tls.LoadX509KeyPair(certFile, keyFile)
+	if err != nil {
+		return err
+	}
+
+	config := tls.Config{
+		Certificates: []tls.Certificate{cert},
+	}
+
+	server := &Server{
+		Addr:      addr,
+		Net:       "tcp-tls",
+		TLSConfig: &config,
+		Handler:   handler,
+	}
+
+	return server.ListenAndServe()
+}
+
+// ActivateAndServe activates a server with a listener from systemd,
+// l and p should not both be non-nil.
+// If both l and p are not nil only p will be used.
+// Invoke handler for incoming queries.
+func ActivateAndServe(l net.Listener, p net.PacketConn, handler Handler) error {
+	server := &Server{Listener: l, PacketConn: p, Handler: handler}
+	return server.ActivateAndServe()
+}
+
+func (mux *ServeMux) match(q string, t uint16) Handler {
+	mux.m.RLock()
+	defer mux.m.RUnlock()
+	var handler Handler
+	b := make([]byte, len(q)) // worst case, one label of length q
+	off := 0
+	end := false
+	for {
+		l := len(q[off:])
+		for i := 0; i < l; i++ {
+			b[i] = q[off+i]
+			if b[i] >= 'A' && b[i] <= 'Z' {
+				b[i] |= ('a' - 'A')
+			}
+		}
+		if h, ok := mux.z[string(b[:l])]; ok { // causes garbage, might want to change the map key
+			if t != TypeDS {
+				return h
+			}
+			// Continue for DS to see if we have a parent too, if so delegeate to the parent
+			handler = h
+		}
+		off, end = NextLabel(q, off)
+		if end {
+			break
+		}
+	}
+	// Wildcard match, if we have found nothing try the root zone as a last resort.
+	if h, ok := mux.z["."]; ok {
+		return h
+	}
+	return handler
+}
+
+// Handle adds a handler to the ServeMux for pattern.
+func (mux *ServeMux) Handle(pattern string, handler Handler) {
+	if pattern == "" {
+		panic("dns: invalid pattern " + pattern)
+	}
+	mux.m.Lock()
+	mux.z[Fqdn(pattern)] = handler
+	mux.m.Unlock()
+}
+
+// HandleFunc adds a handler function to the ServeMux for pattern.
+func (mux *ServeMux) HandleFunc(pattern string, handler func(ResponseWriter, *Msg)) {
+	mux.Handle(pattern, HandlerFunc(handler))
+}
+
+// HandleRemove deregistrars the handler specific for pattern from the ServeMux.
+func (mux *ServeMux) HandleRemove(pattern string) {
+	if pattern == "" {
+		panic("dns: invalid pattern " + pattern)
+	}
+	mux.m.Lock()
+	delete(mux.z, Fqdn(pattern))
+	mux.m.Unlock()
+}
+
+// ServeDNS dispatches the request to the handler whose
+// pattern most closely matches the request message. If DefaultServeMux
+// is used the correct thing for DS queries is done: a possible parent
+// is sought.
+// If no handler is found a standard SERVFAIL message is returned
+// If the request message does not have exactly one question in the
+// question section a SERVFAIL is returned, unlesss Unsafe is true.
+func (mux *ServeMux) ServeDNS(w ResponseWriter, request *Msg) {
+	var h Handler
+	if len(request.Question) < 1 { // allow more than one question
+		h = failedHandler()
+	} else {
+		if h = mux.match(request.Question[0].Name, request.Question[0].Qtype); h == nil {
+			h = failedHandler()
+		}
+	}
+	h.ServeDNS(w, request)
+}
+
+// Handle registers the handler with the given pattern
+// in the DefaultServeMux. The documentation for
+// ServeMux explains how patterns are matched.
+func Handle(pattern string, handler Handler) { DefaultServeMux.Handle(pattern, handler) }
+
+// HandleRemove deregisters the handle with the given pattern
+// in the DefaultServeMux.
+func HandleRemove(pattern string) { DefaultServeMux.HandleRemove(pattern) }
+
+// HandleFunc registers the handler function with the given pattern
+// in the DefaultServeMux.
+func HandleFunc(pattern string, handler func(ResponseWriter, *Msg)) {
+	DefaultServeMux.HandleFunc(pattern, handler)
+}
+
+// Writer writes raw DNS messages; each call to Write should send an entire message.
+type Writer interface {
+	io.Writer
+}
+
+// Reader reads raw DNS messages; each call to ReadTCP or ReadUDP should return an entire message.
+type Reader interface {
+	// ReadTCP reads a raw message from a TCP connection. Implementations may alter
+	// connection properties, for example the read-deadline.
+	ReadTCP(conn net.Conn, timeout time.Duration) ([]byte, error)
+	// ReadUDP reads a raw message from a UDP connection. Implementations may alter
+	// connection properties, for example the read-deadline.
+	ReadUDP(conn *net.UDPConn, timeout time.Duration) ([]byte, *SessionUDP, error)
+}
+
+// defaultReader is an adapter for the Server struct that implements the Reader interface
+// using the readTCP and readUDP func of the embedded Server.
+type defaultReader struct {
+	*Server
+}
+
+func (dr *defaultReader) ReadTCP(conn net.Conn, timeout time.Duration) ([]byte, error) {
+	return dr.readTCP(conn, timeout)
+}
+
+func (dr *defaultReader) ReadUDP(conn *net.UDPConn, timeout time.Duration) ([]byte, *SessionUDP, error) {
+	return dr.readUDP(conn, timeout)
+}
+
+// DecorateReader is a decorator hook for extending or supplanting the functionality of a Reader.
+// Implementations should never return a nil Reader.
+type DecorateReader func(Reader) Reader
+
+// DecorateWriter is a decorator hook for extending or supplanting the functionality of a Writer.
+// Implementations should never return a nil Writer.
+type DecorateWriter func(Writer) Writer
+
+// A Server defines parameters for running an DNS server.
+type Server struct {
+	// Address to listen on, ":dns" if empty.
+	Addr string
+	// if "tcp" or "tcp-tls" (DNS over TLS) it will invoke a TCP listener, otherwise an UDP one
+	Net string
+	// TCP Listener to use, this is to aid in systemd's socket activation.
+	Listener net.Listener
+	// TLS connection configuration
+	TLSConfig *tls.Config
+	// UDP "Listener" to use, this is to aid in systemd's socket activation.
+	PacketConn net.PacketConn
+	// Handler to invoke, dns.DefaultServeMux if nil.
+	Handler Handler
+	// Default buffer size to use to read incoming UDP messages. If not set
+	// it defaults to MinMsgSize (512 B).
+	UDPSize int
+	// The net.Conn.SetReadTimeout value for new connections, defaults to 2 * time.Second.
+	ReadTimeout time.Duration
+	// The net.Conn.SetWriteTimeout value for new connections, defaults to 2 * time.Second.
+	WriteTimeout time.Duration
+	// TCP idle timeout for multiple queries, if nil, defaults to 8 * time.Second (RFC 5966).
+	IdleTimeout func() time.Duration
+	// Secret(s) for Tsig map[<zonename>]<base64 secret>.
+	TsigSecret map[string]string
+	// Unsafe instructs the server to disregard any sanity checks and directly hand the message to
+	// the handler. It will specifically not check if the query has the QR bit not set.
+	Unsafe bool
+	// If NotifyStartedFunc is set it is called once the server has started listening.
+	NotifyStartedFunc func()
+	// DecorateReader is optional, allows customization of the process that reads raw DNS messages.
+	DecorateReader DecorateReader
+	// DecorateWriter is optional, allows customization of the process that writes raw DNS messages.
+	DecorateWriter DecorateWriter
+
+	// Graceful shutdown handling
+
+	inFlight sync.WaitGroup
+
+	lock    sync.RWMutex
+	started bool
+}
+
+// ListenAndServe starts a nameserver on the configured address in *Server.
+func (srv *Server) ListenAndServe() error {
+	srv.lock.Lock()
+	defer srv.lock.Unlock()
+	if srv.started {
+		return &Error{err: "server already started"}
+	}
+	addr := srv.Addr
+	if addr == "" {
+		addr = ":domain"
+	}
+	if srv.UDPSize == 0 {
+		srv.UDPSize = MinMsgSize
+	}
+	switch srv.Net {
+	case "tcp", "tcp4", "tcp6":
+		a, err := net.ResolveTCPAddr(srv.Net, addr)
+		if err != nil {
+			return err
+		}
+		l, err := net.ListenTCP(srv.Net, a)
+		if err != nil {
+			return err
+		}
+		srv.Listener = l
+		srv.started = true
+		srv.lock.Unlock()
+		err = srv.serveTCP(l)
+		srv.lock.Lock() // to satisfy the defer at the top
+		return err
+	case "tcp-tls", "tcp4-tls", "tcp6-tls":
+		network := "tcp"
+		if srv.Net == "tcp4-tls" {
+			network = "tcp4"
+		} else if srv.Net == "tcp6" {
+			network = "tcp6"
+		}
+
+		l, err := tls.Listen(network, addr, srv.TLSConfig)
+		if err != nil {
+			return err
+		}
+		srv.Listener = l
+		srv.started = true
+		srv.lock.Unlock()
+		err = srv.serveTCP(l)
+		srv.lock.Lock() // to satisfy the defer at the top
+		return err
+	case "udp", "udp4", "udp6":
+		a, err := net.ResolveUDPAddr(srv.Net, addr)
+		if err != nil {
+			return err
+		}
+		l, err := net.ListenUDP(srv.Net, a)
+		if err != nil {
+			return err
+		}
+		if e := setUDPSocketOptions(l); e != nil {
+			return e
+		}
+		srv.PacketConn = l
+		srv.started = true
+		srv.lock.Unlock()
+		err = srv.serveUDP(l)
+		srv.lock.Lock() // to satisfy the defer at the top
+		return err
+	}
+	return &Error{err: "bad network"}
+}
+
+// ActivateAndServe starts a nameserver with the PacketConn or Listener
+// configured in *Server. Its main use is to start a server from systemd.
+func (srv *Server) ActivateAndServe() error {
+	srv.lock.Lock()
+	defer srv.lock.Unlock()
+	if srv.started {
+		return &Error{err: "server already started"}
+	}
+	pConn := srv.PacketConn
+	l := srv.Listener
+	if pConn != nil {
+		if srv.UDPSize == 0 {
+			srv.UDPSize = MinMsgSize
+		}
+		// Check PacketConn interface's type is valid and value
+		// is not nil
+		if t, ok := pConn.(*net.UDPConn); ok && t != nil {
+			if e := setUDPSocketOptions(t); e != nil {
+				return e
+			}
+			srv.started = true
+			srv.lock.Unlock()
+			e := srv.serveUDP(t)
+			srv.lock.Lock() // to satisfy the defer at the top
+			return e
+		}
+	}
+	if l != nil {
+		srv.started = true
+		srv.lock.Unlock()
+		e := srv.serveTCP(l)
+		srv.lock.Lock() // to satisfy the defer at the top
+		return e
+	}
+	return &Error{err: "bad listeners"}
+}
+
+// Shutdown gracefully shuts down a server. After a call to Shutdown, ListenAndServe and
+// ActivateAndServe will return. All in progress queries are completed before the server
+// is taken down. If the Shutdown is taking longer than the reading timeout an error
+// is returned.
+func (srv *Server) Shutdown() error {
+	srv.lock.Lock()
+	if !srv.started {
+		srv.lock.Unlock()
+		return &Error{err: "server not started"}
+	}
+	srv.started = false
+	srv.lock.Unlock()
+
+	if srv.PacketConn != nil {
+		srv.PacketConn.Close()
+	}
+	if srv.Listener != nil {
+		srv.Listener.Close()
+	}
+
+	fin := make(chan bool)
+	go func() {
+		srv.inFlight.Wait()
+		fin <- true
+	}()
+
+	select {
+	case <-time.After(srv.getReadTimeout()):
+		return &Error{err: "server shutdown is pending"}
+	case <-fin:
+		return nil
+	}
+}
+
+// getReadTimeout is a helper func to use system timeout if server did not intend to change it.
+func (srv *Server) getReadTimeout() time.Duration {
+	rtimeout := dnsTimeout
+	if srv.ReadTimeout != 0 {
+		rtimeout = srv.ReadTimeout
+	}
+	return rtimeout
+}
+
+// serveTCP starts a TCP listener for the server.
+// Each request is handled in a separate goroutine.
+func (srv *Server) serveTCP(l net.Listener) error {
+	defer l.Close()
+
+	if srv.NotifyStartedFunc != nil {
+		srv.NotifyStartedFunc()
+	}
+
+	reader := Reader(&defaultReader{srv})
+	if srv.DecorateReader != nil {
+		reader = srv.DecorateReader(reader)
+	}
+
+	handler := srv.Handler
+	if handler == nil {
+		handler = DefaultServeMux
+	}
+	rtimeout := srv.getReadTimeout()
+	// deadline is not used here
+	for {
+		rw, err := l.Accept()
+		if err != nil {
+			if neterr, ok := err.(net.Error); ok && neterr.Temporary() {
+				continue
+			}
+			return err
+		}
+		m, err := reader.ReadTCP(rw, rtimeout)
+		srv.lock.RLock()
+		if !srv.started {
+			srv.lock.RUnlock()
+			return nil
+		}
+		srv.lock.RUnlock()
+		if err != nil {
+			continue
+		}
+		srv.inFlight.Add(1)
+		go srv.serve(rw.RemoteAddr(), handler, m, nil, nil, rw)
+	}
+}
+
+// serveUDP starts a UDP listener for the server.
+// Each request is handled in a separate goroutine.
+func (srv *Server) serveUDP(l *net.UDPConn) error {
+	defer l.Close()
+
+	if srv.NotifyStartedFunc != nil {
+		srv.NotifyStartedFunc()
+	}
+
+	reader := Reader(&defaultReader{srv})
+	if srv.DecorateReader != nil {
+		reader = srv.DecorateReader(reader)
+	}
+
+	handler := srv.Handler
+	if handler == nil {
+		handler = DefaultServeMux
+	}
+	rtimeout := srv.getReadTimeout()
+	// deadline is not used here
+	for {
+		m, s, err := reader.ReadUDP(l, rtimeout)
+		srv.lock.RLock()
+		if !srv.started {
+			srv.lock.RUnlock()
+			return nil
+		}
+		srv.lock.RUnlock()
+		if err != nil {
+			continue
+		}
+		srv.inFlight.Add(1)
+		go srv.serve(s.RemoteAddr(), handler, m, l, s, nil)
+	}
+}
+
+// Serve a new connection.
+func (srv *Server) serve(a net.Addr, h Handler, m []byte, u *net.UDPConn, s *SessionUDP, t net.Conn) {
+	defer srv.inFlight.Done()
+
+	w := &response{tsigSecret: srv.TsigSecret, udp: u, tcp: t, remoteAddr: a, udpSession: s}
+	if srv.DecorateWriter != nil {
+		w.writer = srv.DecorateWriter(w)
+	} else {
+		w.writer = w
+	}
+
+	q := 0 // counter for the amount of TCP queries we get
+
+	reader := Reader(&defaultReader{srv})
+	if srv.DecorateReader != nil {
+		reader = srv.DecorateReader(reader)
+	}
+Redo:
+	req := new(Msg)
+	err := req.Unpack(m)
+	if err != nil { // Send a FormatError back
+		x := new(Msg)
+		x.SetRcodeFormatError(req)
+		w.WriteMsg(x)
+		goto Exit
+	}
+	if !srv.Unsafe && req.Response {
+		goto Exit
+	}
+
+	w.tsigStatus = nil
+	if w.tsigSecret != nil {
+		if t := req.IsTsig(); t != nil {
+			secret := t.Hdr.Name
+			if _, ok := w.tsigSecret[secret]; !ok {
+				w.tsigStatus = ErrKeyAlg
+			}
+			w.tsigStatus = TsigVerify(m, w.tsigSecret[secret], "", false)
+			w.tsigTimersOnly = false
+			w.tsigRequestMAC = req.Extra[len(req.Extra)-1].(*TSIG).MAC
+		}
+	}
+	h.ServeDNS(w, req) // Writes back to the client
+
+Exit:
+	if w.tcp == nil {
+		return
+	}
+	// TODO(miek): make this number configurable?
+	if q > maxTCPQueries { // close socket after this many queries
+		w.Close()
+		return
+	}
+
+	if w.hijacked {
+		return // client calls Close()
+	}
+	if u != nil { // UDP, "close" and return
+		w.Close()
+		return
+	}
+	idleTimeout := tcpIdleTimeout
+	if srv.IdleTimeout != nil {
+		idleTimeout = srv.IdleTimeout()
+	}
+	m, err = reader.ReadTCP(w.tcp, idleTimeout)
+	if err == nil {
+		q++
+		goto Redo
+	}
+	w.Close()
+	return
+}
+
+func (srv *Server) readTCP(conn net.Conn, timeout time.Duration) ([]byte, error) {
+	conn.SetReadDeadline(time.Now().Add(timeout))
+	l := make([]byte, 2)
+	n, err := conn.Read(l)
+	if err != nil || n != 2 {
+		if err != nil {
+			return nil, err
+		}
+		return nil, ErrShortRead
+	}
+	length := binary.BigEndian.Uint16(l)
+	if length == 0 {
+		return nil, ErrShortRead
+	}
+	m := make([]byte, int(length))
+	n, err = conn.Read(m[:int(length)])
+	if err != nil || n == 0 {
+		if err != nil {
+			return nil, err
+		}
+		return nil, ErrShortRead
+	}
+	i := n
+	for i < int(length) {
+		j, err := conn.Read(m[i:int(length)])
+		if err != nil {
+			return nil, err
+		}
+		i += j
+	}
+	n = i
+	m = m[:n]
+	return m, nil
+}
+
+func (srv *Server) readUDP(conn *net.UDPConn, timeout time.Duration) ([]byte, *SessionUDP, error) {
+	conn.SetReadDeadline(time.Now().Add(timeout))
+	m := make([]byte, srv.UDPSize)
+	n, s, err := ReadFromSessionUDP(conn, m)
+	if err != nil || n == 0 {
+		if err != nil {
+			return nil, nil, err
+		}
+		return nil, nil, ErrShortRead
+	}
+	m = m[:n]
+	return m, s, nil
+}
+
+// WriteMsg implements the ResponseWriter.WriteMsg method.
+func (w *response) WriteMsg(m *Msg) (err error) {
+	var data []byte
+	if w.tsigSecret != nil { // if no secrets, dont check for the tsig (which is a longer check)
+		if t := m.IsTsig(); t != nil {
+			data, w.tsigRequestMAC, err = TsigGenerate(m, w.tsigSecret[t.Hdr.Name], w.tsigRequestMAC, w.tsigTimersOnly)
+			if err != nil {
+				return err
+			}
+			_, err = w.writer.Write(data)
+			return err
+		}
+	}
+	data, err = m.Pack()
+	if err != nil {
+		return err
+	}
+	_, err = w.writer.Write(data)
+	return err
+}
+
+// Write implements the ResponseWriter.Write method.
+func (w *response) Write(m []byte) (int, error) {
+	switch {
+	case w.udp != nil:
+		n, err := WriteToSessionUDP(w.udp, m, w.udpSession)
+		return n, err
+	case w.tcp != nil:
+		lm := len(m)
+		if lm < 2 {
+			return 0, io.ErrShortBuffer
+		}
+		if lm > MaxMsgSize {
+			return 0, &Error{err: "message too large"}
+		}
+		l := make([]byte, 2, 2+lm)
+		binary.BigEndian.PutUint16(l, uint16(lm))
+		m = append(l, m...)
+
+		n, err := io.Copy(w.tcp, bytes.NewReader(m))
+		return int(n), err
+	}
+	panic("not reached")
+}
+
+// LocalAddr implements the ResponseWriter.LocalAddr method.
+func (w *response) LocalAddr() net.Addr {
+	if w.tcp != nil {
+		return w.tcp.LocalAddr()
+	}
+	return w.udp.LocalAddr()
+}
+
+// RemoteAddr implements the ResponseWriter.RemoteAddr method.
+func (w *response) RemoteAddr() net.Addr { return w.remoteAddr }
+
+// TsigStatus implements the ResponseWriter.TsigStatus method.
+func (w *response) TsigStatus() error { return w.tsigStatus }
+
+// TsigTimersOnly implements the ResponseWriter.TsigTimersOnly method.
+func (w *response) TsigTimersOnly(b bool) { w.tsigTimersOnly = b }
+
+// Hijack implements the ResponseWriter.Hijack method.
+func (w *response) Hijack() { w.hijacked = true }
+
+// Close implements the ResponseWriter.Close method
+func (w *response) Close() error {
+	// Can't close the udp conn, as that is actually the listener.
+	if w.tcp != nil {
+		e := w.tcp.Close()
+		w.tcp = nil
+		return e
+	}
+	return nil
+}
diff --git a/vendor/github.com/miekg/dns/sig0.go b/vendor/github.com/miekg/dns/sig0.go
new file mode 100644
index 000000000..2dce06af8
--- /dev/null
+++ b/vendor/github.com/miekg/dns/sig0.go
@@ -0,0 +1,219 @@
+package dns
+
+import (
+	"crypto"
+	"crypto/dsa"
+	"crypto/ecdsa"
+	"crypto/rsa"
+	"encoding/binary"
+	"math/big"
+	"strings"
+	"time"
+)
+
+// Sign signs a dns.Msg. It fills the signature with the appropriate data.
+// The SIG record should have the SignerName, KeyTag, Algorithm, Inception
+// and Expiration set.
+func (rr *SIG) Sign(k crypto.Signer, m *Msg) ([]byte, error) {
+	if k == nil {
+		return nil, ErrPrivKey
+	}
+	if rr.KeyTag == 0 || len(rr.SignerName) == 0 || rr.Algorithm == 0 {
+		return nil, ErrKey
+	}
+	rr.Header().Rrtype = TypeSIG
+	rr.Header().Class = ClassANY
+	rr.Header().Ttl = 0
+	rr.Header().Name = "."
+	rr.OrigTtl = 0
+	rr.TypeCovered = 0
+	rr.Labels = 0
+
+	buf := make([]byte, m.Len()+rr.len())
+	mbuf, err := m.PackBuffer(buf)
+	if err != nil {
+		return nil, err
+	}
+	if &buf[0] != &mbuf[0] {
+		return nil, ErrBuf
+	}
+	off, err := PackRR(rr, buf, len(mbuf), nil, false)
+	if err != nil {
+		return nil, err
+	}
+	buf = buf[:off:cap(buf)]
+
+	hash, ok := AlgorithmToHash[rr.Algorithm]
+	if !ok {
+		return nil, ErrAlg
+	}
+
+	hasher := hash.New()
+	// Write SIG rdata
+	hasher.Write(buf[len(mbuf)+1+2+2+4+2:])
+	// Write message
+	hasher.Write(buf[:len(mbuf)])
+
+	signature, err := sign(k, hasher.Sum(nil), hash, rr.Algorithm)
+	if err != nil {
+		return nil, err
+	}
+
+	rr.Signature = toBase64(signature)
+	sig := string(signature)
+
+	buf = append(buf, sig...)
+	if len(buf) > int(^uint16(0)) {
+		return nil, ErrBuf
+	}
+	// Adjust sig data length
+	rdoff := len(mbuf) + 1 + 2 + 2 + 4
+	rdlen := binary.BigEndian.Uint16(buf[rdoff:])
+	rdlen += uint16(len(sig))
+	binary.BigEndian.PutUint16(buf[rdoff:], rdlen)
+	// Adjust additional count
+	adc := binary.BigEndian.Uint16(buf[10:])
+	adc++
+	binary.BigEndian.PutUint16(buf[10:], adc)
+	return buf, nil
+}
+
+// Verify validates the message buf using the key k.
+// It's assumed that buf is a valid message from which rr was unpacked.
+func (rr *SIG) Verify(k *KEY, buf []byte) error {
+	if k == nil {
+		return ErrKey
+	}
+	if rr.KeyTag == 0 || len(rr.SignerName) == 0 || rr.Algorithm == 0 {
+		return ErrKey
+	}
+
+	var hash crypto.Hash
+	switch rr.Algorithm {
+	case DSA, RSASHA1:
+		hash = crypto.SHA1
+	case RSASHA256, ECDSAP256SHA256:
+		hash = crypto.SHA256
+	case ECDSAP384SHA384:
+		hash = crypto.SHA384
+	case RSASHA512:
+		hash = crypto.SHA512
+	default:
+		return ErrAlg
+	}
+	hasher := hash.New()
+
+	buflen := len(buf)
+	qdc := binary.BigEndian.Uint16(buf[4:])
+	anc := binary.BigEndian.Uint16(buf[6:])
+	auc := binary.BigEndian.Uint16(buf[8:])
+	adc := binary.BigEndian.Uint16(buf[10:])
+	offset := 12
+	var err error
+	for i := uint16(0); i < qdc && offset < buflen; i++ {
+		_, offset, err = UnpackDomainName(buf, offset)
+		if err != nil {
+			return err
+		}
+		// Skip past Type and Class
+		offset += 2 + 2
+	}
+	for i := uint16(1); i < anc+auc+adc && offset < buflen; i++ {
+		_, offset, err = UnpackDomainName(buf, offset)
+		if err != nil {
+			return err
+		}
+		// Skip past Type, Class and TTL
+		offset += 2 + 2 + 4
+		if offset+1 >= buflen {
+			continue
+		}
+		var rdlen uint16
+		rdlen = binary.BigEndian.Uint16(buf[offset:])
+		offset += 2
+		offset += int(rdlen)
+	}
+	if offset >= buflen {
+		return &Error{err: "overflowing unpacking signed message"}
+	}
+
+	// offset should be just prior to SIG
+	bodyend := offset
+	// owner name SHOULD be root
+	_, offset, err = UnpackDomainName(buf, offset)
+	if err != nil {
+		return err
+	}
+	// Skip Type, Class, TTL, RDLen
+	offset += 2 + 2 + 4 + 2
+	sigstart := offset
+	// Skip Type Covered, Algorithm, Labels, Original TTL
+	offset += 2 + 1 + 1 + 4
+	if offset+4+4 >= buflen {
+		return &Error{err: "overflow unpacking signed message"}
+	}
+	expire := binary.BigEndian.Uint32(buf[offset:])
+	offset += 4
+	incept := binary.BigEndian.Uint32(buf[offset:])
+	offset += 4
+	now := uint32(time.Now().Unix())
+	if now < incept || now > expire {
+		return ErrTime
+	}
+	// Skip key tag
+	offset += 2
+	var signername string
+	signername, offset, err = UnpackDomainName(buf, offset)
+	if err != nil {
+		return err
+	}
+	// If key has come from the DNS name compression might
+	// have mangled the case of the name
+	if strings.ToLower(signername) != strings.ToLower(k.Header().Name) {
+		return &Error{err: "signer name doesn't match key name"}
+	}
+	sigend := offset
+	hasher.Write(buf[sigstart:sigend])
+	hasher.Write(buf[:10])
+	hasher.Write([]byte{
+		byte((adc - 1) << 8),
+		byte(adc - 1),
+	})
+	hasher.Write(buf[12:bodyend])
+
+	hashed := hasher.Sum(nil)
+	sig := buf[sigend:]
+	switch k.Algorithm {
+	case DSA:
+		pk := k.publicKeyDSA()
+		sig = sig[1:]
+		r := big.NewInt(0)
+		r.SetBytes(sig[:len(sig)/2])
+		s := big.NewInt(0)
+		s.SetBytes(sig[len(sig)/2:])
+		if pk != nil {
+			if dsa.Verify(pk, hashed, r, s) {
+				return nil
+			}
+			return ErrSig
+		}
+	case RSASHA1, RSASHA256, RSASHA512:
+		pk := k.publicKeyRSA()
+		if pk != nil {
+			return rsa.VerifyPKCS1v15(pk, hash, hashed, sig)
+		}
+	case ECDSAP256SHA256, ECDSAP384SHA384:
+		pk := k.publicKeyECDSA()
+		r := big.NewInt(0)
+		r.SetBytes(sig[:len(sig)/2])
+		s := big.NewInt(0)
+		s.SetBytes(sig[len(sig)/2:])
+		if pk != nil {
+			if ecdsa.Verify(pk, hashed, r, s) {
+				return nil
+			}
+			return ErrSig
+		}
+	}
+	return ErrKeyAlg
+}
diff --git a/vendor/github.com/miekg/dns/singleinflight.go b/vendor/github.com/miekg/dns/singleinflight.go
new file mode 100644
index 000000000..9573c7d0b
--- /dev/null
+++ b/vendor/github.com/miekg/dns/singleinflight.go
@@ -0,0 +1,57 @@
+// 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.
+
+// Adapted for dns package usage by Miek Gieben.
+
+package dns
+
+import "sync"
+import "time"
+
+// call is an in-flight or completed singleflight.Do call
+type call struct {
+	wg   sync.WaitGroup
+	val  *Msg
+	rtt  time.Duration
+	err  error
+	dups int
+}
+
+// singleflight represents a class of work and forms a namespace in
+// which units of work can be executed with duplicate suppression.
+type singleflight struct {
+	sync.Mutex                  // protects m
+	m          map[string]*call // lazily initialized
+}
+
+// Do executes and returns the results of the given function, making
+// sure that only one execution is in-flight for a given key at a
+// time. If a duplicate comes in, the duplicate caller waits for the
+// original to complete and receives the same results.
+// The return value shared indicates whether v was given to multiple callers.
+func (g *singleflight) Do(key string, fn func() (*Msg, time.Duration, error)) (v *Msg, rtt time.Duration, err error, shared bool) {
+	g.Lock()
+	if g.m == nil {
+		g.m = make(map[string]*call)
+	}
+	if c, ok := g.m[key]; ok {
+		c.dups++
+		g.Unlock()
+		c.wg.Wait()
+		return c.val, c.rtt, c.err, true
+	}
+	c := new(call)
+	c.wg.Add(1)
+	g.m[key] = c
+	g.Unlock()
+
+	c.val, c.rtt, c.err = fn()
+	c.wg.Done()
+
+	g.Lock()
+	delete(g.m, key)
+	g.Unlock()
+
+	return c.val, c.rtt, c.err, c.dups > 0
+}
diff --git a/vendor/github.com/miekg/dns/smimea.go b/vendor/github.com/miekg/dns/smimea.go
new file mode 100644
index 000000000..3a4bb5700
--- /dev/null
+++ b/vendor/github.com/miekg/dns/smimea.go
@@ -0,0 +1,47 @@
+package dns
+
+import (
+	"crypto/sha256"
+	"crypto/x509"
+	"encoding/hex"
+)
+
+// Sign creates a SMIMEA record from an SSL certificate.
+func (r *SMIMEA) Sign(usage, selector, matchingType int, cert *x509.Certificate) (err error) {
+	r.Hdr.Rrtype = TypeSMIMEA
+	r.Usage = uint8(usage)
+	r.Selector = uint8(selector)
+	r.MatchingType = uint8(matchingType)
+
+	r.Certificate, err = CertificateToDANE(r.Selector, r.MatchingType, cert)
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+// Verify verifies a SMIMEA record against an SSL certificate. If it is OK
+// a nil error is returned.
+func (r *SMIMEA) Verify(cert *x509.Certificate) error {
+	c, err := CertificateToDANE(r.Selector, r.MatchingType, cert)
+	if err != nil {
+		return err // Not also ErrSig?
+	}
+	if r.Certificate == c {
+		return nil
+	}
+	return ErrSig // ErrSig, really?
+}
+
+// SIMEAName returns the ownername of a SMIMEA resource record as per the
+// format specified in RFC 'draft-ietf-dane-smime-12' Section 2 and 3
+func SMIMEAName(email_address string, domain_name string) (string, error) {
+	hasher := sha256.New()
+	hasher.Write([]byte(email_address))
+
+	// RFC Section 3: "The local-part is hashed using the SHA2-256
+	// algorithm with the hash truncated to 28 octets and
+	// represented in its hexadecimal representation to become the
+	// left-most label in the prepared domain name"
+	return hex.EncodeToString(hasher.Sum(nil)[:28]) + "." + "_smimecert." + domain_name, nil
+}
diff --git a/vendor/github.com/miekg/dns/tlsa.go b/vendor/github.com/miekg/dns/tlsa.go
new file mode 100644
index 000000000..431e2fb5a
--- /dev/null
+++ b/vendor/github.com/miekg/dns/tlsa.go
@@ -0,0 +1,47 @@
+package dns
+
+import (
+	"crypto/x509"
+	"net"
+	"strconv"
+)
+
+// Sign creates a TLSA record from an SSL certificate.
+func (r *TLSA) Sign(usage, selector, matchingType int, cert *x509.Certificate) (err error) {
+	r.Hdr.Rrtype = TypeTLSA
+	r.Usage = uint8(usage)
+	r.Selector = uint8(selector)
+	r.MatchingType = uint8(matchingType)
+
+	r.Certificate, err = CertificateToDANE(r.Selector, r.MatchingType, cert)
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+// Verify verifies a TLSA record against an SSL certificate. If it is OK
+// a nil error is returned.
+func (r *TLSA) Verify(cert *x509.Certificate) error {
+	c, err := CertificateToDANE(r.Selector, r.MatchingType, cert)
+	if err != nil {
+		return err // Not also ErrSig?
+	}
+	if r.Certificate == c {
+		return nil
+	}
+	return ErrSig // ErrSig, really?
+}
+
+// TLSAName returns the ownername of a TLSA resource record as per the
+// rules specified in RFC 6698, Section 3.
+func TLSAName(name, service, network string) (string, error) {
+	if !IsFqdn(name) {
+		return "", ErrFqdn
+	}
+	p, err := net.LookupPort(network, service)
+	if err != nil {
+		return "", err
+	}
+	return "_" + strconv.Itoa(p) + "._" + network + "." + name, nil
+}
diff --git a/vendor/github.com/miekg/dns/tsig.go b/vendor/github.com/miekg/dns/tsig.go
new file mode 100644
index 000000000..78365e1c5
--- /dev/null
+++ b/vendor/github.com/miekg/dns/tsig.go
@@ -0,0 +1,384 @@
+package dns
+
+import (
+	"crypto/hmac"
+	"crypto/md5"
+	"crypto/sha1"
+	"crypto/sha256"
+	"crypto/sha512"
+	"encoding/binary"
+	"encoding/hex"
+	"hash"
+	"io"
+	"strconv"
+	"strings"
+	"time"
+)
+
+// HMAC hashing codes. These are transmitted as domain names.
+const (
+	HmacMD5    = "hmac-md5.sig-alg.reg.int."
+	HmacSHA1   = "hmac-sha1."
+	HmacSHA256 = "hmac-sha256."
+	HmacSHA512 = "hmac-sha512."
+)
+
+// TSIG is the RR the holds the transaction signature of a message.
+// See RFC 2845 and RFC 4635.
+type TSIG struct {
+	Hdr        RR_Header
+	Algorithm  string `dns:"domain-name"`
+	TimeSigned uint64 `dns:"uint48"`
+	Fudge      uint16
+	MACSize    uint16
+	MAC        string `dns:"size-hex:MACSize"`
+	OrigId     uint16
+	Error      uint16
+	OtherLen   uint16
+	OtherData  string `dns:"size-hex:OtherLen"`
+}
+
+// TSIG has no official presentation format, but this will suffice.
+
+func (rr *TSIG) String() string {
+	s := "\n;; TSIG PSEUDOSECTION:\n"
+	s += rr.Hdr.String() +
+		" " + rr.Algorithm +
+		" " + tsigTimeToString(rr.TimeSigned) +
+		" " + strconv.Itoa(int(rr.Fudge)) +
+		" " + strconv.Itoa(int(rr.MACSize)) +
+		" " + strings.ToUpper(rr.MAC) +
+		" " + strconv.Itoa(int(rr.OrigId)) +
+		" " + strconv.Itoa(int(rr.Error)) + // BIND prints NOERROR
+		" " + strconv.Itoa(int(rr.OtherLen)) +
+		" " + rr.OtherData
+	return s
+}
+
+// The following values must be put in wireformat, so that the MAC can be calculated.
+// RFC 2845, section 3.4.2. TSIG Variables.
+type tsigWireFmt struct {
+	// From RR_Header
+	Name  string `dns:"domain-name"`
+	Class uint16
+	Ttl   uint32
+	// Rdata of the TSIG
+	Algorithm  string `dns:"domain-name"`
+	TimeSigned uint64 `dns:"uint48"`
+	Fudge      uint16
+	// MACSize, MAC and OrigId excluded
+	Error     uint16
+	OtherLen  uint16
+	OtherData string `dns:"size-hex:OtherLen"`
+}
+
+// If we have the MAC use this type to convert it to wiredata. Section 3.4.3. Request MAC
+type macWireFmt struct {
+	MACSize uint16
+	MAC     string `dns:"size-hex:MACSize"`
+}
+
+// 3.3. Time values used in TSIG calculations
+type timerWireFmt struct {
+	TimeSigned uint64 `dns:"uint48"`
+	Fudge      uint16
+}
+
+// TsigGenerate fills out the TSIG record attached to the message.
+// The message should contain
+// a "stub" TSIG RR with the algorithm, key name (owner name of the RR),
+// time fudge (defaults to 300 seconds) and the current time
+// The TSIG MAC is saved in that Tsig RR.
+// When TsigGenerate is called for the first time requestMAC is set to the empty string and
+// timersOnly is false.
+// If something goes wrong an error is returned, otherwise it is nil.
+func TsigGenerate(m *Msg, secret, requestMAC string, timersOnly bool) ([]byte, string, error) {
+	if m.IsTsig() == nil {
+		panic("dns: TSIG not last RR in additional")
+	}
+	// If we barf here, the caller is to blame
+	rawsecret, err := fromBase64([]byte(secret))
+	if err != nil {
+		return nil, "", err
+	}
+
+	rr := m.Extra[len(m.Extra)-1].(*TSIG)
+	m.Extra = m.Extra[0 : len(m.Extra)-1] // kill the TSIG from the msg
+	mbuf, err := m.Pack()
+	if err != nil {
+		return nil, "", err
+	}
+	buf := tsigBuffer(mbuf, rr, requestMAC, timersOnly)
+
+	t := new(TSIG)
+	var h hash.Hash
+	switch strings.ToLower(rr.Algorithm) {
+	case HmacMD5:
+		h = hmac.New(md5.New, []byte(rawsecret))
+	case HmacSHA1:
+		h = hmac.New(sha1.New, []byte(rawsecret))
+	case HmacSHA256:
+		h = hmac.New(sha256.New, []byte(rawsecret))
+	case HmacSHA512:
+		h = hmac.New(sha512.New, []byte(rawsecret))
+	default:
+		return nil, "", ErrKeyAlg
+	}
+	io.WriteString(h, string(buf))
+	t.MAC = hex.EncodeToString(h.Sum(nil))
+	t.MACSize = uint16(len(t.MAC) / 2) // Size is half!
+
+	t.Hdr = RR_Header{Name: rr.Hdr.Name, Rrtype: TypeTSIG, Class: ClassANY, Ttl: 0}
+	t.Fudge = rr.Fudge
+	t.TimeSigned = rr.TimeSigned
+	t.Algorithm = rr.Algorithm
+	t.OrigId = m.Id
+
+	tbuf := make([]byte, t.len())
+	if off, err := PackRR(t, tbuf, 0, nil, false); err == nil {
+		tbuf = tbuf[:off] // reset to actual size used
+	} else {
+		return nil, "", err
+	}
+	mbuf = append(mbuf, tbuf...)
+	// Update the ArCount directly in the buffer.
+	binary.BigEndian.PutUint16(mbuf[10:], uint16(len(m.Extra)+1))
+
+	return mbuf, t.MAC, nil
+}
+
+// TsigVerify verifies the TSIG on a message.
+// If the signature does not validate err contains the
+// error, otherwise it is nil.
+func TsigVerify(msg []byte, secret, requestMAC string, timersOnly bool) error {
+	rawsecret, err := fromBase64([]byte(secret))
+	if err != nil {
+		return err
+	}
+	// Strip the TSIG from the incoming msg
+	stripped, tsig, err := stripTsig(msg)
+	if err != nil {
+		return err
+	}
+
+	msgMAC, err := hex.DecodeString(tsig.MAC)
+	if err != nil {
+		return err
+	}
+
+	buf := tsigBuffer(stripped, tsig, requestMAC, timersOnly)
+
+	// Fudge factor works both ways. A message can arrive before it was signed because
+	// of clock skew.
+	now := uint64(time.Now().Unix())
+	ti := now - tsig.TimeSigned
+	if now < tsig.TimeSigned {
+		ti = tsig.TimeSigned - now
+	}
+	if uint64(tsig.Fudge) < ti {
+		return ErrTime
+	}
+
+	var h hash.Hash
+	switch strings.ToLower(tsig.Algorithm) {
+	case HmacMD5:
+		h = hmac.New(md5.New, rawsecret)
+	case HmacSHA1:
+		h = hmac.New(sha1.New, rawsecret)
+	case HmacSHA256:
+		h = hmac.New(sha256.New, rawsecret)
+	case HmacSHA512:
+		h = hmac.New(sha512.New, rawsecret)
+	default:
+		return ErrKeyAlg
+	}
+	h.Write(buf)
+	if !hmac.Equal(h.Sum(nil), msgMAC) {
+		return ErrSig
+	}
+	return nil
+}
+
+// Create a wiredata buffer for the MAC calculation.
+func tsigBuffer(msgbuf []byte, rr *TSIG, requestMAC string, timersOnly bool) []byte {
+	var buf []byte
+	if rr.TimeSigned == 0 {
+		rr.TimeSigned = uint64(time.Now().Unix())
+	}
+	if rr.Fudge == 0 {
+		rr.Fudge = 300 // Standard (RFC) default.
+	}
+
+	if requestMAC != "" {
+		m := new(macWireFmt)
+		m.MACSize = uint16(len(requestMAC) / 2)
+		m.MAC = requestMAC
+		buf = make([]byte, len(requestMAC)) // long enough
+		n, _ := packMacWire(m, buf)
+		buf = buf[:n]
+	}
+
+	tsigvar := make([]byte, DefaultMsgSize)
+	if timersOnly {
+		tsig := new(timerWireFmt)
+		tsig.TimeSigned = rr.TimeSigned
+		tsig.Fudge = rr.Fudge
+		n, _ := packTimerWire(tsig, tsigvar)
+		tsigvar = tsigvar[:n]
+	} else {
+		tsig := new(tsigWireFmt)
+		tsig.Name = strings.ToLower(rr.Hdr.Name)
+		tsig.Class = ClassANY
+		tsig.Ttl = rr.Hdr.Ttl
+		tsig.Algorithm = strings.ToLower(rr.Algorithm)
+		tsig.TimeSigned = rr.TimeSigned
+		tsig.Fudge = rr.Fudge
+		tsig.Error = rr.Error
+		tsig.OtherLen = rr.OtherLen
+		tsig.OtherData = rr.OtherData
+		n, _ := packTsigWire(tsig, tsigvar)
+		tsigvar = tsigvar[:n]
+	}
+
+	if requestMAC != "" {
+		x := append(buf, msgbuf...)
+		buf = append(x, tsigvar...)
+	} else {
+		buf = append(msgbuf, tsigvar...)
+	}
+	return buf
+}
+
+// Strip the TSIG from the raw message.
+func stripTsig(msg []byte) ([]byte, *TSIG, error) {
+	// Copied from msg.go's Unpack() Header, but modified.
+	var (
+		dh  Header
+		err error
+	)
+	off, tsigoff := 0, 0
+
+	if dh, off, err = unpackMsgHdr(msg, off); err != nil {
+		return nil, nil, err
+	}
+	if dh.Arcount == 0 {
+		return nil, nil, ErrNoSig
+	}
+
+	// Rcode, see msg.go Unpack()
+	if int(dh.Bits&0xF) == RcodeNotAuth {
+		return nil, nil, ErrAuth
+	}
+
+	for i := 0; i < int(dh.Qdcount); i++ {
+		_, off, err = unpackQuestion(msg, off)
+		if err != nil {
+			return nil, nil, err
+		}
+	}
+
+	_, off, err = unpackRRslice(int(dh.Ancount), msg, off)
+	if err != nil {
+		return nil, nil, err
+	}
+	_, off, err = unpackRRslice(int(dh.Nscount), msg, off)
+	if err != nil {
+		return nil, nil, err
+	}
+
+	rr := new(TSIG)
+	var extra RR
+	for i := 0; i < int(dh.Arcount); i++ {
+		tsigoff = off
+		extra, off, err = UnpackRR(msg, off)
+		if err != nil {
+			return nil, nil, err
+		}
+		if extra.Header().Rrtype == TypeTSIG {
+			rr = extra.(*TSIG)
+			// Adjust Arcount.
+			arcount := binary.BigEndian.Uint16(msg[10:])
+			binary.BigEndian.PutUint16(msg[10:], arcount-1)
+			break
+		}
+	}
+	if rr == nil {
+		return nil, nil, ErrNoSig
+	}
+	return msg[:tsigoff], rr, nil
+}
+
+// Translate the TSIG time signed into a date. There is no
+// need for RFC1982 calculations as this date is 48 bits.
+func tsigTimeToString(t uint64) string {
+	ti := time.Unix(int64(t), 0).UTC()
+	return ti.Format("20060102150405")
+}
+
+func packTsigWire(tw *tsigWireFmt, msg []byte) (int, error) {
+	// copied from zmsg.go TSIG packing
+	// RR_Header
+	off, err := PackDomainName(tw.Name, msg, 0, nil, false)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint16(tw.Class, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint32(tw.Ttl, msg, off)
+	if err != nil {
+		return off, err
+	}
+
+	off, err = PackDomainName(tw.Algorithm, msg, off, nil, false)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint48(tw.TimeSigned, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint16(tw.Fudge, msg, off)
+	if err != nil {
+		return off, err
+	}
+
+	off, err = packUint16(tw.Error, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint16(tw.OtherLen, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packStringHex(tw.OtherData, msg, off)
+	if err != nil {
+		return off, err
+	}
+	return off, nil
+}
+
+func packMacWire(mw *macWireFmt, msg []byte) (int, error) {
+	off, err := packUint16(mw.MACSize, msg, 0)
+	if err != nil {
+		return off, err
+	}
+	off, err = packStringHex(mw.MAC, msg, off)
+	if err != nil {
+		return off, err
+	}
+	return off, nil
+}
+
+func packTimerWire(tw *timerWireFmt, msg []byte) (int, error) {
+	off, err := packUint48(tw.TimeSigned, msg, 0)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint16(tw.Fudge, msg, off)
+	if err != nil {
+		return off, err
+	}
+	return off, nil
+}
diff --git a/vendor/github.com/miekg/dns/types.go b/vendor/github.com/miekg/dns/types.go
new file mode 100644
index 000000000..f63a18b33
--- /dev/null
+++ b/vendor/github.com/miekg/dns/types.go
@@ -0,0 +1,1294 @@
+package dns
+
+import (
+	"fmt"
+	"net"
+	"strconv"
+	"strings"
+	"time"
+)
+
+type (
+	// Type is a DNS type.
+	Type uint16
+	// Class is a DNS class.
+	Class uint16
+	// Name is a DNS domain name.
+	Name string
+)
+
+// Packet formats
+
+// Wire constants and supported types.
+const (
+	// valid RR_Header.Rrtype and Question.qtype
+
+	TypeNone       uint16 = 0
+	TypeA          uint16 = 1
+	TypeNS         uint16 = 2
+	TypeMD         uint16 = 3
+	TypeMF         uint16 = 4
+	TypeCNAME      uint16 = 5
+	TypeSOA        uint16 = 6
+	TypeMB         uint16 = 7
+	TypeMG         uint16 = 8
+	TypeMR         uint16 = 9
+	TypeNULL       uint16 = 10
+	TypePTR        uint16 = 12
+	TypeHINFO      uint16 = 13
+	TypeMINFO      uint16 = 14
+	TypeMX         uint16 = 15
+	TypeTXT        uint16 = 16
+	TypeRP         uint16 = 17
+	TypeAFSDB      uint16 = 18
+	TypeX25        uint16 = 19
+	TypeISDN       uint16 = 20
+	TypeRT         uint16 = 21
+	TypeNSAPPTR    uint16 = 23
+	TypeSIG        uint16 = 24
+	TypeKEY        uint16 = 25
+	TypePX         uint16 = 26
+	TypeGPOS       uint16 = 27
+	TypeAAAA       uint16 = 28
+	TypeLOC        uint16 = 29
+	TypeNXT        uint16 = 30
+	TypeEID        uint16 = 31
+	TypeNIMLOC     uint16 = 32
+	TypeSRV        uint16 = 33
+	TypeATMA       uint16 = 34
+	TypeNAPTR      uint16 = 35
+	TypeKX         uint16 = 36
+	TypeCERT       uint16 = 37
+	TypeDNAME      uint16 = 39
+	TypeOPT        uint16 = 41 // EDNS
+	TypeDS         uint16 = 43
+	TypeSSHFP      uint16 = 44
+	TypeRRSIG      uint16 = 46
+	TypeNSEC       uint16 = 47
+	TypeDNSKEY     uint16 = 48
+	TypeDHCID      uint16 = 49
+	TypeNSEC3      uint16 = 50
+	TypeNSEC3PARAM uint16 = 51
+	TypeTLSA       uint16 = 52
+	TypeSMIMEA     uint16 = 53
+	TypeHIP        uint16 = 55
+	TypeNINFO      uint16 = 56
+	TypeRKEY       uint16 = 57
+	TypeTALINK     uint16 = 58
+	TypeCDS        uint16 = 59
+	TypeCDNSKEY    uint16 = 60
+	TypeOPENPGPKEY uint16 = 61
+	TypeSPF        uint16 = 99
+	TypeUINFO      uint16 = 100
+	TypeUID        uint16 = 101
+	TypeGID        uint16 = 102
+	TypeUNSPEC     uint16 = 103
+	TypeNID        uint16 = 104
+	TypeL32        uint16 = 105
+	TypeL64        uint16 = 106
+	TypeLP         uint16 = 107
+	TypeEUI48      uint16 = 108
+	TypeEUI64      uint16 = 109
+	TypeURI        uint16 = 256
+	TypeCAA        uint16 = 257
+
+	TypeTKEY uint16 = 249
+	TypeTSIG uint16 = 250
+
+	// valid Question.Qtype only
+	TypeIXFR  uint16 = 251
+	TypeAXFR  uint16 = 252
+	TypeMAILB uint16 = 253
+	TypeMAILA uint16 = 254
+	TypeANY   uint16 = 255
+
+	TypeTA       uint16 = 32768
+	TypeDLV      uint16 = 32769
+	TypeReserved uint16 = 65535
+
+	// valid Question.Qclass
+	ClassINET   = 1
+	ClassCSNET  = 2
+	ClassCHAOS  = 3
+	ClassHESIOD = 4
+	ClassNONE   = 254
+	ClassANY    = 255
+
+	// Message Response Codes.
+	RcodeSuccess        = 0
+	RcodeFormatError    = 1
+	RcodeServerFailure  = 2
+	RcodeNameError      = 3
+	RcodeNotImplemented = 4
+	RcodeRefused        = 5
+	RcodeYXDomain       = 6
+	RcodeYXRrset        = 7
+	RcodeNXRrset        = 8
+	RcodeNotAuth        = 9
+	RcodeNotZone        = 10
+	RcodeBadSig         = 16 // TSIG
+	RcodeBadVers        = 16 // EDNS0
+	RcodeBadKey         = 17
+	RcodeBadTime        = 18
+	RcodeBadMode        = 19 // TKEY
+	RcodeBadName        = 20
+	RcodeBadAlg         = 21
+	RcodeBadTrunc       = 22 // TSIG
+	RcodeBadCookie      = 23 // DNS Cookies
+
+	// Message Opcodes. There is no 3.
+	OpcodeQuery  = 0
+	OpcodeIQuery = 1
+	OpcodeStatus = 2
+	OpcodeNotify = 4
+	OpcodeUpdate = 5
+)
+
+// Headers is the wire format for the DNS packet header.
+type Header struct {
+	Id                                 uint16
+	Bits                               uint16
+	Qdcount, Ancount, Nscount, Arcount uint16
+}
+
+const (
+	headerSize = 12
+
+	// Header.Bits
+	_QR = 1 << 15 // query/response (response=1)
+	_AA = 1 << 10 // authoritative
+	_TC = 1 << 9  // truncated
+	_RD = 1 << 8  // recursion desired
+	_RA = 1 << 7  // recursion available
+	_Z  = 1 << 6  // Z
+	_AD = 1 << 5  // authticated data
+	_CD = 1 << 4  // checking disabled
+
+	LOC_EQUATOR       = 1 << 31 // RFC 1876, Section 2.
+	LOC_PRIMEMERIDIAN = 1 << 31 // RFC 1876, Section 2.
+
+	LOC_HOURS   = 60 * 1000
+	LOC_DEGREES = 60 * LOC_HOURS
+
+	LOC_ALTITUDEBASE = 100000
+)
+
+// Different Certificate Types, see RFC 4398, Section 2.1
+const (
+	CertPKIX = 1 + iota
+	CertSPKI
+	CertPGP
+	CertIPIX
+	CertISPKI
+	CertIPGP
+	CertACPKIX
+	CertIACPKIX
+	CertURI = 253
+	CertOID = 254
+)
+
+// CertTypeToString converts the Cert Type to its string representation.
+// See RFC 4398 and RFC 6944.
+var CertTypeToString = map[uint16]string{
+	CertPKIX:    "PKIX",
+	CertSPKI:    "SPKI",
+	CertPGP:     "PGP",
+	CertIPIX:    "IPIX",
+	CertISPKI:   "ISPKI",
+	CertIPGP:    "IPGP",
+	CertACPKIX:  "ACPKIX",
+	CertIACPKIX: "IACPKIX",
+	CertURI:     "URI",
+	CertOID:     "OID",
+}
+
+// StringToCertType is the reverseof CertTypeToString.
+var StringToCertType = reverseInt16(CertTypeToString)
+
+//go:generate go run types_generate.go
+
+// Question holds a DNS question. There can be multiple questions in the
+// question section of a message. Usually there is just one.
+type Question struct {
+	Name   string `dns:"cdomain-name"` // "cdomain-name" specifies encoding (and may be compressed)
+	Qtype  uint16
+	Qclass uint16
+}
+
+func (q *Question) len() int {
+	return len(q.Name) + 1 + 2 + 2
+}
+
+func (q *Question) String() (s string) {
+	// prefix with ; (as in dig)
+	s = ";" + sprintName(q.Name) + "\t"
+	s += Class(q.Qclass).String() + "\t"
+	s += " " + Type(q.Qtype).String()
+	return s
+}
+
+// ANY is a wildcard record. See RFC 1035, Section 3.2.3. ANY
+// is named "*" there.
+type ANY struct {
+	Hdr RR_Header
+	// Does not have any rdata
+}
+
+func (rr *ANY) String() string { return rr.Hdr.String() }
+
+type CNAME struct {
+	Hdr    RR_Header
+	Target string `dns:"cdomain-name"`
+}
+
+func (rr *CNAME) String() string { return rr.Hdr.String() + sprintName(rr.Target) }
+
+type HINFO struct {
+	Hdr RR_Header
+	Cpu string
+	Os  string
+}
+
+func (rr *HINFO) String() string {
+	return rr.Hdr.String() + sprintTxt([]string{rr.Cpu, rr.Os})
+}
+
+type MB struct {
+	Hdr RR_Header
+	Mb  string `dns:"cdomain-name"`
+}
+
+func (rr *MB) String() string { return rr.Hdr.String() + sprintName(rr.Mb) }
+
+type MG struct {
+	Hdr RR_Header
+	Mg  string `dns:"cdomain-name"`
+}
+
+func (rr *MG) String() string { return rr.Hdr.String() + sprintName(rr.Mg) }
+
+type MINFO struct {
+	Hdr   RR_Header
+	Rmail string `dns:"cdomain-name"`
+	Email string `dns:"cdomain-name"`
+}
+
+func (rr *MINFO) String() string {
+	return rr.Hdr.String() + sprintName(rr.Rmail) + " " + sprintName(rr.Email)
+}
+
+type MR struct {
+	Hdr RR_Header
+	Mr  string `dns:"cdomain-name"`
+}
+
+func (rr *MR) String() string {
+	return rr.Hdr.String() + sprintName(rr.Mr)
+}
+
+type MF struct {
+	Hdr RR_Header
+	Mf  string `dns:"cdomain-name"`
+}
+
+func (rr *MF) String() string {
+	return rr.Hdr.String() + sprintName(rr.Mf)
+}
+
+type MD struct {
+	Hdr RR_Header
+	Md  string `dns:"cdomain-name"`
+}
+
+func (rr *MD) String() string {
+	return rr.Hdr.String() + sprintName(rr.Md)
+}
+
+type MX struct {
+	Hdr        RR_Header
+	Preference uint16
+	Mx         string `dns:"cdomain-name"`
+}
+
+func (rr *MX) String() string {
+	return rr.Hdr.String() + strconv.Itoa(int(rr.Preference)) + " " + sprintName(rr.Mx)
+}
+
+type AFSDB struct {
+	Hdr      RR_Header
+	Subtype  uint16
+	Hostname string `dns:"cdomain-name"`
+}
+
+func (rr *AFSDB) String() string {
+	return rr.Hdr.String() + strconv.Itoa(int(rr.Subtype)) + " " + sprintName(rr.Hostname)
+}
+
+type X25 struct {
+	Hdr         RR_Header
+	PSDNAddress string
+}
+
+func (rr *X25) String() string {
+	return rr.Hdr.String() + rr.PSDNAddress
+}
+
+type RT struct {
+	Hdr        RR_Header
+	Preference uint16
+	Host       string `dns:"cdomain-name"`
+}
+
+func (rr *RT) String() string {
+	return rr.Hdr.String() + strconv.Itoa(int(rr.Preference)) + " " + sprintName(rr.Host)
+}
+
+type NS struct {
+	Hdr RR_Header
+	Ns  string `dns:"cdomain-name"`
+}
+
+func (rr *NS) String() string {
+	return rr.Hdr.String() + sprintName(rr.Ns)
+}
+
+type PTR struct {
+	Hdr RR_Header
+	Ptr string `dns:"cdomain-name"`
+}
+
+func (rr *PTR) String() string {
+	return rr.Hdr.String() + sprintName(rr.Ptr)
+}
+
+type RP struct {
+	Hdr  RR_Header
+	Mbox string `dns:"domain-name"`
+	Txt  string `dns:"domain-name"`
+}
+
+func (rr *RP) String() string {
+	return rr.Hdr.String() + rr.Mbox + " " + sprintTxt([]string{rr.Txt})
+}
+
+type SOA struct {
+	Hdr     RR_Header
+	Ns      string `dns:"cdomain-name"`
+	Mbox    string `dns:"cdomain-name"`
+	Serial  uint32
+	Refresh uint32
+	Retry   uint32
+	Expire  uint32
+	Minttl  uint32
+}
+
+func (rr *SOA) String() string {
+	return rr.Hdr.String() + sprintName(rr.Ns) + " " + sprintName(rr.Mbox) +
+		" " + strconv.FormatInt(int64(rr.Serial), 10) +
+		" " + strconv.FormatInt(int64(rr.Refresh), 10) +
+		" " + strconv.FormatInt(int64(rr.Retry), 10) +
+		" " + strconv.FormatInt(int64(rr.Expire), 10) +
+		" " + strconv.FormatInt(int64(rr.Minttl), 10)
+}
+
+type TXT struct {
+	Hdr RR_Header
+	Txt []string `dns:"txt"`
+}
+
+func (rr *TXT) String() string { return rr.Hdr.String() + sprintTxt(rr.Txt) }
+
+func sprintName(s string) string {
+	src := []byte(s)
+	dst := make([]byte, 0, len(src))
+	for i := 0; i < len(src); {
+		if i+1 < len(src) && src[i] == '\\' && src[i+1] == '.' {
+			dst = append(dst, src[i:i+2]...)
+			i += 2
+		} else {
+			b, n := nextByte(src, i)
+			if n == 0 {
+				i++ // dangling back slash
+			} else if b == '.' {
+				dst = append(dst, b)
+			} else {
+				dst = appendDomainNameByte(dst, b)
+			}
+			i += n
+		}
+	}
+	return string(dst)
+}
+
+func sprintTxtOctet(s string) string {
+	src := []byte(s)
+	dst := make([]byte, 0, len(src))
+	dst = append(dst, '"')
+	for i := 0; i < len(src); {
+		if i+1 < len(src) && src[i] == '\\' && src[i+1] == '.' {
+			dst = append(dst, src[i:i+2]...)
+			i += 2
+		} else {
+			b, n := nextByte(src, i)
+			if n == 0 {
+				i++ // dangling back slash
+			} else if b == '.' {
+				dst = append(dst, b)
+			} else {
+				if b < ' ' || b > '~' {
+					dst = appendByte(dst, b)
+				} else {
+					dst = append(dst, b)
+				}
+			}
+			i += n
+		}
+	}
+	dst = append(dst, '"')
+	return string(dst)
+}
+
+func sprintTxt(txt []string) string {
+	var out []byte
+	for i, s := range txt {
+		if i > 0 {
+			out = append(out, ` "`...)
+		} else {
+			out = append(out, '"')
+		}
+		bs := []byte(s)
+		for j := 0; j < len(bs); {
+			b, n := nextByte(bs, j)
+			if n == 0 {
+				break
+			}
+			out = appendTXTStringByte(out, b)
+			j += n
+		}
+		out = append(out, '"')
+	}
+	return string(out)
+}
+
+func appendDomainNameByte(s []byte, b byte) []byte {
+	switch b {
+	case '.', ' ', '\'', '@', ';', '(', ')': // additional chars to escape
+		return append(s, '\\', b)
+	}
+	return appendTXTStringByte(s, b)
+}
+
+func appendTXTStringByte(s []byte, b byte) []byte {
+	switch b {
+	case '\t':
+		return append(s, '\\', 't')
+	case '\r':
+		return append(s, '\\', 'r')
+	case '\n':
+		return append(s, '\\', 'n')
+	case '"', '\\':
+		return append(s, '\\', b)
+	}
+	if b < ' ' || b > '~' {
+		return appendByte(s, b)
+	}
+	return append(s, b)
+}
+
+func appendByte(s []byte, b byte) []byte {
+	var buf [3]byte
+	bufs := strconv.AppendInt(buf[:0], int64(b), 10)
+	s = append(s, '\\')
+	for i := 0; i < 3-len(bufs); i++ {
+		s = append(s, '0')
+	}
+	for _, r := range bufs {
+		s = append(s, r)
+	}
+	return s
+}
+
+func nextByte(b []byte, offset int) (byte, int) {
+	if offset >= len(b) {
+		return 0, 0
+	}
+	if b[offset] != '\\' {
+		// not an escape sequence
+		return b[offset], 1
+	}
+	switch len(b) - offset {
+	case 1: // dangling escape
+		return 0, 0
+	case 2, 3: // too short to be \ddd
+	default: // maybe \ddd
+		if isDigit(b[offset+1]) && isDigit(b[offset+2]) && isDigit(b[offset+3]) {
+			return dddToByte(b[offset+1:]), 4
+		}
+	}
+	// not \ddd, maybe a control char
+	switch b[offset+1] {
+	case 't':
+		return '\t', 2
+	case 'r':
+		return '\r', 2
+	case 'n':
+		return '\n', 2
+	default:
+		return b[offset+1], 2
+	}
+}
+
+type SPF struct {
+	Hdr RR_Header
+	Txt []string `dns:"txt"`
+}
+
+func (rr *SPF) String() string { return rr.Hdr.String() + sprintTxt(rr.Txt) }
+
+type SRV struct {
+	Hdr      RR_Header
+	Priority uint16
+	Weight   uint16
+	Port     uint16
+	Target   string `dns:"domain-name"`
+}
+
+func (rr *SRV) String() string {
+	return rr.Hdr.String() +
+		strconv.Itoa(int(rr.Priority)) + " " +
+		strconv.Itoa(int(rr.Weight)) + " " +
+		strconv.Itoa(int(rr.Port)) + " " + sprintName(rr.Target)
+}
+
+type NAPTR struct {
+	Hdr         RR_Header
+	Order       uint16
+	Preference  uint16
+	Flags       string
+	Service     string
+	Regexp      string
+	Replacement string `dns:"domain-name"`
+}
+
+func (rr *NAPTR) String() string {
+	return rr.Hdr.String() +
+		strconv.Itoa(int(rr.Order)) + " " +
+		strconv.Itoa(int(rr.Preference)) + " " +
+		"\"" + rr.Flags + "\" " +
+		"\"" + rr.Service + "\" " +
+		"\"" + rr.Regexp + "\" " +
+		rr.Replacement
+}
+
+// The CERT resource record, see RFC 4398.
+type CERT struct {
+	Hdr         RR_Header
+	Type        uint16
+	KeyTag      uint16
+	Algorithm   uint8
+	Certificate string `dns:"base64"`
+}
+
+func (rr *CERT) String() string {
+	var (
+		ok                  bool
+		certtype, algorithm string
+	)
+	if certtype, ok = CertTypeToString[rr.Type]; !ok {
+		certtype = strconv.Itoa(int(rr.Type))
+	}
+	if algorithm, ok = AlgorithmToString[rr.Algorithm]; !ok {
+		algorithm = strconv.Itoa(int(rr.Algorithm))
+	}
+	return rr.Hdr.String() + certtype +
+		" " + strconv.Itoa(int(rr.KeyTag)) +
+		" " + algorithm +
+		" " + rr.Certificate
+}
+
+// The DNAME resource record, see RFC 2672.
+type DNAME struct {
+	Hdr    RR_Header
+	Target string `dns:"domain-name"`
+}
+
+func (rr *DNAME) String() string {
+	return rr.Hdr.String() + sprintName(rr.Target)
+}
+
+type A struct {
+	Hdr RR_Header
+	A   net.IP `dns:"a"`
+}
+
+func (rr *A) String() string {
+	if rr.A == nil {
+		return rr.Hdr.String()
+	}
+	return rr.Hdr.String() + rr.A.String()
+}
+
+type AAAA struct {
+	Hdr  RR_Header
+	AAAA net.IP `dns:"aaaa"`
+}
+
+func (rr *AAAA) String() string {
+	if rr.AAAA == nil {
+		return rr.Hdr.String()
+	}
+	return rr.Hdr.String() + rr.AAAA.String()
+}
+
+type PX struct {
+	Hdr        RR_Header
+	Preference uint16
+	Map822     string `dns:"domain-name"`
+	Mapx400    string `dns:"domain-name"`
+}
+
+func (rr *PX) String() string {
+	return rr.Hdr.String() + strconv.Itoa(int(rr.Preference)) + " " + sprintName(rr.Map822) + " " + sprintName(rr.Mapx400)
+}
+
+type GPOS struct {
+	Hdr       RR_Header
+	Longitude string
+	Latitude  string
+	Altitude  string
+}
+
+func (rr *GPOS) String() string {
+	return rr.Hdr.String() + rr.Longitude + " " + rr.Latitude + " " + rr.Altitude
+}
+
+type LOC struct {
+	Hdr       RR_Header
+	Version   uint8
+	Size      uint8
+	HorizPre  uint8
+	VertPre   uint8
+	Latitude  uint32
+	Longitude uint32
+	Altitude  uint32
+}
+
+// cmToM takes a cm value expressed in RFC1876 SIZE mantissa/exponent
+// format and returns a string in m (two decimals for the cm)
+func cmToM(m, e uint8) string {
+	if e < 2 {
+		if e == 1 {
+			m *= 10
+		}
+
+		return fmt.Sprintf("0.%02d", m)
+	}
+
+	s := fmt.Sprintf("%d", m)
+	for e > 2 {
+		s += "0"
+		e--
+	}
+	return s
+}
+
+func (rr *LOC) String() string {
+	s := rr.Hdr.String()
+
+	lat := rr.Latitude
+	ns := "N"
+	if lat > LOC_EQUATOR {
+		lat = lat - LOC_EQUATOR
+	} else {
+		ns = "S"
+		lat = LOC_EQUATOR - lat
+	}
+	h := lat / LOC_DEGREES
+	lat = lat % LOC_DEGREES
+	m := lat / LOC_HOURS
+	lat = lat % LOC_HOURS
+	s += fmt.Sprintf("%02d %02d %0.3f %s ", h, m, (float64(lat) / 1000), ns)
+
+	lon := rr.Longitude
+	ew := "E"
+	if lon > LOC_PRIMEMERIDIAN {
+		lon = lon - LOC_PRIMEMERIDIAN
+	} else {
+		ew = "W"
+		lon = LOC_PRIMEMERIDIAN - lon
+	}
+	h = lon / LOC_DEGREES
+	lon = lon % LOC_DEGREES
+	m = lon / LOC_HOURS
+	lon = lon % LOC_HOURS
+	s += fmt.Sprintf("%02d %02d %0.3f %s ", h, m, (float64(lon) / 1000), ew)
+
+	var alt = float64(rr.Altitude) / 100
+	alt -= LOC_ALTITUDEBASE
+	if rr.Altitude%100 != 0 {
+		s += fmt.Sprintf("%.2fm ", alt)
+	} else {
+		s += fmt.Sprintf("%.0fm ", alt)
+	}
+
+	s += cmToM((rr.Size&0xf0)>>4, rr.Size&0x0f) + "m "
+	s += cmToM((rr.HorizPre&0xf0)>>4, rr.HorizPre&0x0f) + "m "
+	s += cmToM((rr.VertPre&0xf0)>>4, rr.VertPre&0x0f) + "m"
+
+	return s
+}
+
+// SIG is identical to RRSIG and nowadays only used for SIG(0), RFC2931.
+type SIG struct {
+	RRSIG
+}
+
+type RRSIG struct {
+	Hdr         RR_Header
+	TypeCovered uint16
+	Algorithm   uint8
+	Labels      uint8
+	OrigTtl     uint32
+	Expiration  uint32
+	Inception   uint32
+	KeyTag      uint16
+	SignerName  string `dns:"domain-name"`
+	Signature   string `dns:"base64"`
+}
+
+func (rr *RRSIG) String() string {
+	s := rr.Hdr.String()
+	s += Type(rr.TypeCovered).String()
+	s += " " + strconv.Itoa(int(rr.Algorithm)) +
+		" " + strconv.Itoa(int(rr.Labels)) +
+		" " + strconv.FormatInt(int64(rr.OrigTtl), 10) +
+		" " + TimeToString(rr.Expiration) +
+		" " + TimeToString(rr.Inception) +
+		" " + strconv.Itoa(int(rr.KeyTag)) +
+		" " + sprintName(rr.SignerName) +
+		" " + rr.Signature
+	return s
+}
+
+type NSEC struct {
+	Hdr        RR_Header
+	NextDomain string   `dns:"domain-name"`
+	TypeBitMap []uint16 `dns:"nsec"`
+}
+
+func (rr *NSEC) String() string {
+	s := rr.Hdr.String() + sprintName(rr.NextDomain)
+	for i := 0; i < len(rr.TypeBitMap); i++ {
+		s += " " + Type(rr.TypeBitMap[i]).String()
+	}
+	return s
+}
+
+func (rr *NSEC) len() int {
+	l := rr.Hdr.len() + len(rr.NextDomain) + 1
+	lastwindow := uint32(2 ^ 32 + 1)
+	for _, t := range rr.TypeBitMap {
+		window := t / 256
+		if uint32(window) != lastwindow {
+			l += 1 + 32
+		}
+		lastwindow = uint32(window)
+	}
+	return l
+}
+
+type DLV struct {
+	DS
+}
+
+type CDS struct {
+	DS
+}
+
+type DS struct {
+	Hdr        RR_Header
+	KeyTag     uint16
+	Algorithm  uint8
+	DigestType uint8
+	Digest     string `dns:"hex"`
+}
+
+func (rr *DS) String() string {
+	return rr.Hdr.String() + strconv.Itoa(int(rr.KeyTag)) +
+		" " + strconv.Itoa(int(rr.Algorithm)) +
+		" " + strconv.Itoa(int(rr.DigestType)) +
+		" " + strings.ToUpper(rr.Digest)
+}
+
+type KX struct {
+	Hdr        RR_Header
+	Preference uint16
+	Exchanger  string `dns:"domain-name"`
+}
+
+func (rr *KX) String() string {
+	return rr.Hdr.String() + strconv.Itoa(int(rr.Preference)) +
+		" " + sprintName(rr.Exchanger)
+}
+
+type TA struct {
+	Hdr        RR_Header
+	KeyTag     uint16
+	Algorithm  uint8
+	DigestType uint8
+	Digest     string `dns:"hex"`
+}
+
+func (rr *TA) String() string {
+	return rr.Hdr.String() + strconv.Itoa(int(rr.KeyTag)) +
+		" " + strconv.Itoa(int(rr.Algorithm)) +
+		" " + strconv.Itoa(int(rr.DigestType)) +
+		" " + strings.ToUpper(rr.Digest)
+}
+
+type TALINK struct {
+	Hdr          RR_Header
+	PreviousName string `dns:"domain-name"`
+	NextName     string `dns:"domain-name"`
+}
+
+func (rr *TALINK) String() string {
+	return rr.Hdr.String() +
+		sprintName(rr.PreviousName) + " " + sprintName(rr.NextName)
+}
+
+type SSHFP struct {
+	Hdr         RR_Header
+	Algorithm   uint8
+	Type        uint8
+	FingerPrint string `dns:"hex"`
+}
+
+func (rr *SSHFP) String() string {
+	return rr.Hdr.String() + strconv.Itoa(int(rr.Algorithm)) +
+		" " + strconv.Itoa(int(rr.Type)) +
+		" " + strings.ToUpper(rr.FingerPrint)
+}
+
+type KEY struct {
+	DNSKEY
+}
+
+type CDNSKEY struct {
+	DNSKEY
+}
+
+type DNSKEY struct {
+	Hdr       RR_Header
+	Flags     uint16
+	Protocol  uint8
+	Algorithm uint8
+	PublicKey string `dns:"base64"`
+}
+
+func (rr *DNSKEY) String() string {
+	return rr.Hdr.String() + strconv.Itoa(int(rr.Flags)) +
+		" " + strconv.Itoa(int(rr.Protocol)) +
+		" " + strconv.Itoa(int(rr.Algorithm)) +
+		" " + rr.PublicKey
+}
+
+type RKEY struct {
+	Hdr       RR_Header
+	Flags     uint16
+	Protocol  uint8
+	Algorithm uint8
+	PublicKey string `dns:"base64"`
+}
+
+func (rr *RKEY) String() string {
+	return rr.Hdr.String() + strconv.Itoa(int(rr.Flags)) +
+		" " + strconv.Itoa(int(rr.Protocol)) +
+		" " + strconv.Itoa(int(rr.Algorithm)) +
+		" " + rr.PublicKey
+}
+
+type NSAPPTR struct {
+	Hdr RR_Header
+	Ptr string `dns:"domain-name"`
+}
+
+func (rr *NSAPPTR) String() string { return rr.Hdr.String() + sprintName(rr.Ptr) }
+
+type NSEC3 struct {
+	Hdr        RR_Header
+	Hash       uint8
+	Flags      uint8
+	Iterations uint16
+	SaltLength uint8
+	Salt       string `dns:"size-hex:SaltLength"`
+	HashLength uint8
+	NextDomain string   `dns:"size-base32:HashLength"`
+	TypeBitMap []uint16 `dns:"nsec"`
+}
+
+func (rr *NSEC3) String() string {
+	s := rr.Hdr.String()
+	s += strconv.Itoa(int(rr.Hash)) +
+		" " + strconv.Itoa(int(rr.Flags)) +
+		" " + strconv.Itoa(int(rr.Iterations)) +
+		" " + saltToString(rr.Salt) +
+		" " + rr.NextDomain
+	for i := 0; i < len(rr.TypeBitMap); i++ {
+		s += " " + Type(rr.TypeBitMap[i]).String()
+	}
+	return s
+}
+
+func (rr *NSEC3) len() int {
+	l := rr.Hdr.len() + 6 + len(rr.Salt)/2 + 1 + len(rr.NextDomain) + 1
+	lastwindow := uint32(2 ^ 32 + 1)
+	for _, t := range rr.TypeBitMap {
+		window := t / 256
+		if uint32(window) != lastwindow {
+			l += 1 + 32
+		}
+		lastwindow = uint32(window)
+	}
+	return l
+}
+
+type NSEC3PARAM struct {
+	Hdr        RR_Header
+	Hash       uint8
+	Flags      uint8
+	Iterations uint16
+	SaltLength uint8
+	Salt       string `dns:"size-hex:SaltLength"`
+}
+
+func (rr *NSEC3PARAM) String() string {
+	s := rr.Hdr.String()
+	s += strconv.Itoa(int(rr.Hash)) +
+		" " + strconv.Itoa(int(rr.Flags)) +
+		" " + strconv.Itoa(int(rr.Iterations)) +
+		" " + saltToString(rr.Salt)
+	return s
+}
+
+type TKEY struct {
+	Hdr        RR_Header
+	Algorithm  string `dns:"domain-name"`
+	Inception  uint32
+	Expiration uint32
+	Mode       uint16
+	Error      uint16
+	KeySize    uint16
+	Key        string
+	OtherLen   uint16
+	OtherData  string
+}
+
+func (rr *TKEY) String() string {
+	// It has no presentation format
+	return ""
+}
+
+// RFC3597 represents an unknown/generic RR.
+type RFC3597 struct {
+	Hdr   RR_Header
+	Rdata string `dns:"hex"`
+}
+
+func (rr *RFC3597) String() string {
+	// Let's call it a hack
+	s := rfc3597Header(rr.Hdr)
+
+	s += "\\# " + strconv.Itoa(len(rr.Rdata)/2) + " " + rr.Rdata
+	return s
+}
+
+func rfc3597Header(h RR_Header) string {
+	var s string
+
+	s += sprintName(h.Name) + "\t"
+	s += strconv.FormatInt(int64(h.Ttl), 10) + "\t"
+	s += "CLASS" + strconv.Itoa(int(h.Class)) + "\t"
+	s += "TYPE" + strconv.Itoa(int(h.Rrtype)) + "\t"
+	return s
+}
+
+type URI struct {
+	Hdr      RR_Header
+	Priority uint16
+	Weight   uint16
+	Target   string `dns:"octet"`
+}
+
+func (rr *URI) String() string {
+	return rr.Hdr.String() + strconv.Itoa(int(rr.Priority)) +
+		" " + strconv.Itoa(int(rr.Weight)) + " " + sprintTxtOctet(rr.Target)
+}
+
+type DHCID struct {
+	Hdr    RR_Header
+	Digest string `dns:"base64"`
+}
+
+func (rr *DHCID) String() string { return rr.Hdr.String() + rr.Digest }
+
+type TLSA struct {
+	Hdr          RR_Header
+	Usage        uint8
+	Selector     uint8
+	MatchingType uint8
+	Certificate  string `dns:"hex"`
+}
+
+func (rr *TLSA) String() string {
+	return rr.Hdr.String() +
+		strconv.Itoa(int(rr.Usage)) +
+		" " + strconv.Itoa(int(rr.Selector)) +
+		" " + strconv.Itoa(int(rr.MatchingType)) +
+		" " + rr.Certificate
+}
+
+type SMIMEA struct {
+	Hdr          RR_Header
+	Usage        uint8
+	Selector     uint8
+	MatchingType uint8
+	Certificate  string `dns:"hex"`
+}
+
+func (rr *SMIMEA) String() string {
+	s := rr.Hdr.String() +
+		strconv.Itoa(int(rr.Usage)) +
+		" " + strconv.Itoa(int(rr.Selector)) +
+		" " + strconv.Itoa(int(rr.MatchingType))
+
+	// Every Nth char needs a space on this output. If we output
+	// this as one giant line, we can't read it can in because in some cases
+	// the cert length overflows scan.maxTok (2048).
+	sx := splitN(rr.Certificate, 1024) // conservative value here
+	s += " " + strings.Join(sx, " ")
+	return s
+}
+
+type HIP struct {
+	Hdr                RR_Header
+	HitLength          uint8
+	PublicKeyAlgorithm uint8
+	PublicKeyLength    uint16
+	Hit                string   `dns:"size-hex:HitLength"`
+	PublicKey          string   `dns:"size-base64:PublicKeyLength"`
+	RendezvousServers  []string `dns:"domain-name"`
+}
+
+func (rr *HIP) String() string {
+	s := rr.Hdr.String() +
+		strconv.Itoa(int(rr.PublicKeyAlgorithm)) +
+		" " + rr.Hit +
+		" " + rr.PublicKey
+	for _, d := range rr.RendezvousServers {
+		s += " " + sprintName(d)
+	}
+	return s
+}
+
+type NINFO struct {
+	Hdr    RR_Header
+	ZSData []string `dns:"txt"`
+}
+
+func (rr *NINFO) String() string { return rr.Hdr.String() + sprintTxt(rr.ZSData) }
+
+type NID struct {
+	Hdr        RR_Header
+	Preference uint16
+	NodeID     uint64
+}
+
+func (rr *NID) String() string {
+	s := rr.Hdr.String() + strconv.Itoa(int(rr.Preference))
+	node := fmt.Sprintf("%0.16x", rr.NodeID)
+	s += " " + node[0:4] + ":" + node[4:8] + ":" + node[8:12] + ":" + node[12:16]
+	return s
+}
+
+type L32 struct {
+	Hdr        RR_Header
+	Preference uint16
+	Locator32  net.IP `dns:"a"`
+}
+
+func (rr *L32) String() string {
+	if rr.Locator32 == nil {
+		return rr.Hdr.String() + strconv.Itoa(int(rr.Preference))
+	}
+	return rr.Hdr.String() + strconv.Itoa(int(rr.Preference)) +
+		" " + rr.Locator32.String()
+}
+
+type L64 struct {
+	Hdr        RR_Header
+	Preference uint16
+	Locator64  uint64
+}
+
+func (rr *L64) String() string {
+	s := rr.Hdr.String() + strconv.Itoa(int(rr.Preference))
+	node := fmt.Sprintf("%0.16X", rr.Locator64)
+	s += " " + node[0:4] + ":" + node[4:8] + ":" + node[8:12] + ":" + node[12:16]
+	return s
+}
+
+type LP struct {
+	Hdr        RR_Header
+	Preference uint16
+	Fqdn       string `dns:"domain-name"`
+}
+
+func (rr *LP) String() string {
+	return rr.Hdr.String() + strconv.Itoa(int(rr.Preference)) + " " + sprintName(rr.Fqdn)
+}
+
+type EUI48 struct {
+	Hdr     RR_Header
+	Address uint64 `dns:"uint48"`
+}
+
+func (rr *EUI48) String() string { return rr.Hdr.String() + euiToString(rr.Address, 48) }
+
+type EUI64 struct {
+	Hdr     RR_Header
+	Address uint64
+}
+
+func (rr *EUI64) String() string { return rr.Hdr.String() + euiToString(rr.Address, 64) }
+
+type CAA struct {
+	Hdr   RR_Header
+	Flag  uint8
+	Tag   string
+	Value string `dns:"octet"`
+}
+
+func (rr *CAA) String() string {
+	return rr.Hdr.String() + strconv.Itoa(int(rr.Flag)) + " " + rr.Tag + " " + sprintTxtOctet(rr.Value)
+}
+
+type UID struct {
+	Hdr RR_Header
+	Uid uint32
+}
+
+func (rr *UID) String() string { return rr.Hdr.String() + strconv.FormatInt(int64(rr.Uid), 10) }
+
+type GID struct {
+	Hdr RR_Header
+	Gid uint32
+}
+
+func (rr *GID) String() string { return rr.Hdr.String() + strconv.FormatInt(int64(rr.Gid), 10) }
+
+type UINFO struct {
+	Hdr   RR_Header
+	Uinfo string
+}
+
+func (rr *UINFO) String() string { return rr.Hdr.String() + sprintTxt([]string{rr.Uinfo}) }
+
+type EID struct {
+	Hdr      RR_Header
+	Endpoint string `dns:"hex"`
+}
+
+func (rr *EID) String() string { return rr.Hdr.String() + strings.ToUpper(rr.Endpoint) }
+
+type NIMLOC struct {
+	Hdr     RR_Header
+	Locator string `dns:"hex"`
+}
+
+func (rr *NIMLOC) String() string { return rr.Hdr.String() + strings.ToUpper(rr.Locator) }
+
+type OPENPGPKEY struct {
+	Hdr       RR_Header
+	PublicKey string `dns:"base64"`
+}
+
+func (rr *OPENPGPKEY) String() string { return rr.Hdr.String() + rr.PublicKey }
+
+// TimeToString translates the RRSIG's incep. and expir. times to the
+// string representation used when printing the record.
+// It takes serial arithmetic (RFC 1982) into account.
+func TimeToString(t uint32) string {
+	mod := ((int64(t) - time.Now().Unix()) / year68) - 1
+	if mod < 0 {
+		mod = 0
+	}
+	ti := time.Unix(int64(t)-(mod*year68), 0).UTC()
+	return ti.Format("20060102150405")
+}
+
+// StringToTime translates the RRSIG's incep. and expir. times from
+// string values like "20110403154150" to an 32 bit integer.
+// It takes serial arithmetic (RFC 1982) into account.
+func StringToTime(s string) (uint32, error) {
+	t, err := time.Parse("20060102150405", s)
+	if err != nil {
+		return 0, err
+	}
+	mod := (t.Unix() / year68) - 1
+	if mod < 0 {
+		mod = 0
+	}
+	return uint32(t.Unix() - (mod * year68)), nil
+}
+
+// saltToString converts a NSECX salt to uppercase and returns "-" when it is empty.
+func saltToString(s string) string {
+	if len(s) == 0 {
+		return "-"
+	}
+	return strings.ToUpper(s)
+}
+
+func euiToString(eui uint64, bits int) (hex string) {
+	switch bits {
+	case 64:
+		hex = fmt.Sprintf("%16.16x", eui)
+		hex = hex[0:2] + "-" + hex[2:4] + "-" + hex[4:6] + "-" + hex[6:8] +
+			"-" + hex[8:10] + "-" + hex[10:12] + "-" + hex[12:14] + "-" + hex[14:16]
+	case 48:
+		hex = fmt.Sprintf("%12.12x", eui)
+		hex = hex[0:2] + "-" + hex[2:4] + "-" + hex[4:6] + "-" + hex[6:8] +
+			"-" + hex[8:10] + "-" + hex[10:12]
+	}
+	return
+}
+
+// copyIP returns a copy of ip.
+func copyIP(ip net.IP) net.IP {
+	p := make(net.IP, len(ip))
+	copy(p, ip)
+	return p
+}
+
+// SplitN splits a string into N sized string chunks.
+// This might become an exported function once.
+func splitN(s string, n int) []string {
+	if len(s) < n {
+		return []string{s}
+	}
+	sx := []string{}
+	p, i := 0, n
+	for {
+		if i <= len(s) {
+			sx = append(sx, s[p:i])
+		} else {
+			sx = append(sx, s[p:])
+			break
+
+		}
+		p, i = p+n, i+n
+	}
+
+	return sx
+}
diff --git a/vendor/github.com/miekg/dns/types_generate.go b/vendor/github.com/miekg/dns/types_generate.go
new file mode 100644
index 000000000..bf80da329
--- /dev/null
+++ b/vendor/github.com/miekg/dns/types_generate.go
@@ -0,0 +1,271 @@
+//+build ignore
+
+// types_generate.go is meant to run with go generate. It will use
+// go/{importer,types} to track down all the RR struct types. Then for each type
+// it will generate conversion tables (TypeToRR and TypeToString) and banal
+// methods (len, Header, copy) based on the struct tags. The generated source is
+// written to ztypes.go, and is meant to be checked into git.
+package main
+
+import (
+	"bytes"
+	"fmt"
+	"go/format"
+	"go/importer"
+	"go/types"
+	"log"
+	"os"
+	"strings"
+	"text/template"
+)
+
+var skipLen = map[string]struct{}{
+	"NSEC":  {},
+	"NSEC3": {},
+	"OPT":   {},
+}
+
+var packageHdr = `
+// *** DO NOT MODIFY ***
+// AUTOGENERATED BY go generate from type_generate.go
+
+package dns
+
+import (
+	"encoding/base64"
+	"net"
+)
+
+`
+
+var TypeToRR = template.Must(template.New("TypeToRR").Parse(`
+// TypeToRR is a map of constructors for each RR type.
+var TypeToRR = map[uint16]func() RR{
+{{range .}}{{if ne . "RFC3597"}}  Type{{.}}:  func() RR { return new({{.}}) },
+{{end}}{{end}}                    }
+
+`))
+
+var typeToString = template.Must(template.New("typeToString").Parse(`
+// TypeToString is a map of strings for each RR type.
+var TypeToString = map[uint16]string{
+{{range .}}{{if ne . "NSAPPTR"}}  Type{{.}}: "{{.}}",
+{{end}}{{end}}                    TypeNSAPPTR:    "NSAP-PTR",
+}
+
+`))
+
+var headerFunc = template.Must(template.New("headerFunc").Parse(`
+// Header() functions
+{{range .}}  func (rr *{{.}}) Header() *RR_Header { return &rr.Hdr }
+{{end}}
+
+`))
+
+// getTypeStruct will take a type and the package scope, and return the
+// (innermost) struct if the type is considered a RR type (currently defined as
+// those structs beginning with a RR_Header, could be redefined as implementing
+// the RR interface). The bool return value indicates if embedded structs were
+// resolved.
+func getTypeStruct(t types.Type, scope *types.Scope) (*types.Struct, bool) {
+	st, ok := t.Underlying().(*types.Struct)
+	if !ok {
+		return nil, false
+	}
+	if st.Field(0).Type() == scope.Lookup("RR_Header").Type() {
+		return st, false
+	}
+	if st.Field(0).Anonymous() {
+		st, _ := getTypeStruct(st.Field(0).Type(), scope)
+		return st, true
+	}
+	return nil, false
+}
+
+func main() {
+	// Import and type-check the package
+	pkg, err := importer.Default().Import("github.com/miekg/dns")
+	fatalIfErr(err)
+	scope := pkg.Scope()
+
+	// Collect constants like TypeX
+	var numberedTypes []string
+	for _, name := range scope.Names() {
+		o := scope.Lookup(name)
+		if o == nil || !o.Exported() {
+			continue
+		}
+		b, ok := o.Type().(*types.Basic)
+		if !ok || b.Kind() != types.Uint16 {
+			continue
+		}
+		if !strings.HasPrefix(o.Name(), "Type") {
+			continue
+		}
+		name := strings.TrimPrefix(o.Name(), "Type")
+		if name == "PrivateRR" {
+			continue
+		}
+		numberedTypes = append(numberedTypes, name)
+	}
+
+	// Collect actual types (*X)
+	var namedTypes []string
+	for _, name := range scope.Names() {
+		o := scope.Lookup(name)
+		if o == nil || !o.Exported() {
+			continue
+		}
+		if st, _ := getTypeStruct(o.Type(), scope); st == nil {
+			continue
+		}
+		if name == "PrivateRR" {
+			continue
+		}
+
+		// Check if corresponding TypeX exists
+		if scope.Lookup("Type"+o.Name()) == nil && o.Name() != "RFC3597" {
+			log.Fatalf("Constant Type%s does not exist.", o.Name())
+		}
+
+		namedTypes = append(namedTypes, o.Name())
+	}
+
+	b := &bytes.Buffer{}
+	b.WriteString(packageHdr)
+
+	// Generate TypeToRR
+	fatalIfErr(TypeToRR.Execute(b, namedTypes))
+
+	// Generate typeToString
+	fatalIfErr(typeToString.Execute(b, numberedTypes))
+
+	// Generate headerFunc
+	fatalIfErr(headerFunc.Execute(b, namedTypes))
+
+	// Generate len()
+	fmt.Fprint(b, "// len() functions\n")
+	for _, name := range namedTypes {
+		if _, ok := skipLen[name]; ok {
+			continue
+		}
+		o := scope.Lookup(name)
+		st, isEmbedded := getTypeStruct(o.Type(), scope)
+		if isEmbedded {
+			continue
+		}
+		fmt.Fprintf(b, "func (rr *%s) len() int {\n", name)
+		fmt.Fprintf(b, "l := rr.Hdr.len()\n")
+		for i := 1; i < st.NumFields(); i++ {
+			o := func(s string) { fmt.Fprintf(b, s, st.Field(i).Name()) }
+
+			if _, ok := st.Field(i).Type().(*types.Slice); ok {
+				switch st.Tag(i) {
+				case `dns:"-"`:
+					// ignored
+				case `dns:"cdomain-name"`, `dns:"domain-name"`, `dns:"txt"`:
+					o("for _, x := range rr.%s { l += len(x) + 1 }\n")
+				default:
+					log.Fatalln(name, st.Field(i).Name(), st.Tag(i))
+				}
+				continue
+			}
+
+			switch {
+			case st.Tag(i) == `dns:"-"`:
+				// ignored
+			case st.Tag(i) == `dns:"cdomain-name"`, st.Tag(i) == `dns:"domain-name"`:
+				o("l += len(rr.%s) + 1\n")
+			case st.Tag(i) == `dns:"octet"`:
+				o("l += len(rr.%s)\n")
+			case strings.HasPrefix(st.Tag(i), `dns:"size-base64`):
+				fallthrough
+			case st.Tag(i) == `dns:"base64"`:
+				o("l += base64.StdEncoding.DecodedLen(len(rr.%s))\n")
+			case strings.HasPrefix(st.Tag(i), `dns:"size-hex`):
+				fallthrough
+			case st.Tag(i) == `dns:"hex"`:
+				o("l += len(rr.%s)/2 + 1\n")
+			case st.Tag(i) == `dns:"a"`:
+				o("l += net.IPv4len // %s\n")
+			case st.Tag(i) == `dns:"aaaa"`:
+				o("l += net.IPv6len // %s\n")
+			case st.Tag(i) == `dns:"txt"`:
+				o("for _, t := range rr.%s { l += len(t) + 1 }\n")
+			case st.Tag(i) == `dns:"uint48"`:
+				o("l += 6 // %s\n")
+			case st.Tag(i) == "":
+				switch st.Field(i).Type().(*types.Basic).Kind() {
+				case types.Uint8:
+					o("l += 1 // %s\n")
+				case types.Uint16:
+					o("l += 2 // %s\n")
+				case types.Uint32:
+					o("l += 4 // %s\n")
+				case types.Uint64:
+					o("l += 8 // %s\n")
+				case types.String:
+					o("l += len(rr.%s) + 1\n")
+				default:
+					log.Fatalln(name, st.Field(i).Name())
+				}
+			default:
+				log.Fatalln(name, st.Field(i).Name(), st.Tag(i))
+			}
+		}
+		fmt.Fprintf(b, "return l }\n")
+	}
+
+	// Generate copy()
+	fmt.Fprint(b, "// copy() functions\n")
+	for _, name := range namedTypes {
+		o := scope.Lookup(name)
+		st, isEmbedded := getTypeStruct(o.Type(), scope)
+		if isEmbedded {
+			continue
+		}
+		fmt.Fprintf(b, "func (rr *%s) copy() RR {\n", name)
+		fields := []string{"*rr.Hdr.copyHeader()"}
+		for i := 1; i < st.NumFields(); i++ {
+			f := st.Field(i).Name()
+			if sl, ok := st.Field(i).Type().(*types.Slice); ok {
+				t := sl.Underlying().String()
+				t = strings.TrimPrefix(t, "[]")
+				if strings.Contains(t, ".") {
+					splits := strings.Split(t, ".")
+					t = splits[len(splits)-1]
+				}
+				fmt.Fprintf(b, "%s := make([]%s, len(rr.%s)); copy(%s, rr.%s)\n",
+					f, t, f, f, f)
+				fields = append(fields, f)
+				continue
+			}
+			if st.Field(i).Type().String() == "net.IP" {
+				fields = append(fields, "copyIP(rr."+f+")")
+				continue
+			}
+			fields = append(fields, "rr."+f)
+		}
+		fmt.Fprintf(b, "return &%s{%s}\n", name, strings.Join(fields, ","))
+		fmt.Fprintf(b, "}\n")
+	}
+
+	// gofmt
+	res, err := format.Source(b.Bytes())
+	if err != nil {
+		b.WriteTo(os.Stderr)
+		log.Fatal(err)
+	}
+
+	// write result
+	f, err := os.Create("ztypes.go")
+	fatalIfErr(err)
+	defer f.Close()
+	f.Write(res)
+}
+
+func fatalIfErr(err error) {
+	if err != nil {
+		log.Fatal(err)
+	}
+}
diff --git a/vendor/github.com/miekg/dns/udp.go b/vendor/github.com/miekg/dns/udp.go
new file mode 100644
index 000000000..c79c6c883
--- /dev/null
+++ b/vendor/github.com/miekg/dns/udp.go
@@ -0,0 +1,58 @@
+// +build !windows,!plan9
+
+package dns
+
+import (
+	"net"
+	"syscall"
+)
+
+// SessionUDP holds the remote address and the associated
+// out-of-band data.
+type SessionUDP struct {
+	raddr   *net.UDPAddr
+	context []byte
+}
+
+// RemoteAddr returns the remote network address.
+func (s *SessionUDP) RemoteAddr() net.Addr { return s.raddr }
+
+// setUDPSocketOptions sets the UDP socket options.
+// This function is implemented on a per platform basis. See udp_*.go for more details
+func setUDPSocketOptions(conn *net.UDPConn) error {
+	sa, err := getUDPSocketName(conn)
+	if err != nil {
+		return err
+	}
+	switch sa.(type) {
+	case *syscall.SockaddrInet6:
+		v6only, err := getUDPSocketOptions6Only(conn)
+		if err != nil {
+			return err
+		}
+		setUDPSocketOptions6(conn)
+		if !v6only {
+			setUDPSocketOptions4(conn)
+		}
+	case *syscall.SockaddrInet4:
+		setUDPSocketOptions4(conn)
+	}
+	return nil
+}
+
+// ReadFromSessionUDP acts just like net.UDPConn.ReadFrom(), but returns a session object instead of a
+// net.UDPAddr.
+func ReadFromSessionUDP(conn *net.UDPConn, b []byte) (int, *SessionUDP, error) {
+	oob := make([]byte, 40)
+	n, oobn, _, raddr, err := conn.ReadMsgUDP(b, oob)
+	if err != nil {
+		return n, nil, err
+	}
+	return n, &SessionUDP{raddr, oob[:oobn]}, err
+}
+
+// WriteToSessionUDP acts just like net.UDPConn.WritetTo(), but uses a *SessionUDP instead of a net.Addr.
+func WriteToSessionUDP(conn *net.UDPConn, b []byte, session *SessionUDP) (int, error) {
+	n, _, err := conn.WriteMsgUDP(b, session.context, session.raddr)
+	return n, err
+}
diff --git a/vendor/github.com/miekg/dns/udp_linux.go b/vendor/github.com/miekg/dns/udp_linux.go
new file mode 100644
index 000000000..c62d21881
--- /dev/null
+++ b/vendor/github.com/miekg/dns/udp_linux.go
@@ -0,0 +1,73 @@
+// +build linux
+
+package dns
+
+// See:
+// * http://stackoverflow.com/questions/3062205/setting-the-source-ip-for-a-udp-socket and
+// * http://blog.powerdns.com/2012/10/08/on-binding-datagram-udp-sockets-to-the-any-addresses/
+//
+// Why do we need this: When listening on 0.0.0.0 with UDP so kernel decides what is the outgoing
+// interface, this might not always be the correct one. This code will make sure the egress
+// packet's interface matched the ingress' one.
+
+import (
+	"net"
+	"syscall"
+)
+
+// setUDPSocketOptions4 prepares the v4 socket for sessions.
+func setUDPSocketOptions4(conn *net.UDPConn) error {
+	file, err := conn.File()
+	if err != nil {
+		return err
+	}
+	if err := syscall.SetsockoptInt(int(file.Fd()), syscall.IPPROTO_IP, syscall.IP_PKTINFO, 1); err != nil {
+		return err
+	}
+	// Calling File() above results in the connection becoming blocking, we must fix that.
+	// See https://github.com/miekg/dns/issues/279
+	err = syscall.SetNonblock(int(file.Fd()), true)
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+// setUDPSocketOptions6 prepares the v6 socket for sessions.
+func setUDPSocketOptions6(conn *net.UDPConn) error {
+	file, err := conn.File()
+	if err != nil {
+		return err
+	}
+	if err := syscall.SetsockoptInt(int(file.Fd()), syscall.IPPROTO_IPV6, syscall.IPV6_RECVPKTINFO, 1); err != nil {
+		return err
+	}
+	err = syscall.SetNonblock(int(file.Fd()), true)
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+// getUDPSocketOption6Only return true if the socket is v6 only and false when it is v4/v6 combined
+// (dualstack).
+func getUDPSocketOptions6Only(conn *net.UDPConn) (bool, error) {
+	file, err := conn.File()
+	if err != nil {
+		return false, err
+	}
+	// dual stack. See http://stackoverflow.com/questions/1618240/how-to-support-both-ipv4-and-ipv6-connections
+	v6only, err := syscall.GetsockoptInt(int(file.Fd()), syscall.IPPROTO_IPV6, syscall.IPV6_V6ONLY)
+	if err != nil {
+		return false, err
+	}
+	return v6only == 1, nil
+}
+
+func getUDPSocketName(conn *net.UDPConn) (syscall.Sockaddr, error) {
+	file, err := conn.File()
+	if err != nil {
+		return nil, err
+	}
+	return syscall.Getsockname(int(file.Fd()))
+}
diff --git a/vendor/github.com/miekg/dns/udp_other.go b/vendor/github.com/miekg/dns/udp_other.go
new file mode 100644
index 000000000..d40732441
--- /dev/null
+++ b/vendor/github.com/miekg/dns/udp_other.go
@@ -0,0 +1,17 @@
+// +build !linux,!plan9
+
+package dns
+
+import (
+	"net"
+	"syscall"
+)
+
+// These do nothing. See udp_linux.go for an example of how to implement this.
+
+// We tried to adhire to some kind of naming scheme.
+
+func setUDPSocketOptions4(conn *net.UDPConn) error                 { return nil }
+func setUDPSocketOptions6(conn *net.UDPConn) error                 { return nil }
+func getUDPSocketOptions6Only(conn *net.UDPConn) (bool, error)     { return false, nil }
+func getUDPSocketName(conn *net.UDPConn) (syscall.Sockaddr, error) { return nil, nil }
diff --git a/vendor/github.com/miekg/dns/udp_plan9.go b/vendor/github.com/miekg/dns/udp_plan9.go
new file mode 100644
index 000000000..b794deeba
--- /dev/null
+++ b/vendor/github.com/miekg/dns/udp_plan9.go
@@ -0,0 +1,34 @@
+package dns
+
+import (
+	"net"
+)
+
+func setUDPSocketOptions(conn *net.UDPConn) error { return nil }
+
+// SessionUDP holds the remote address and the associated
+// out-of-band data.
+type SessionUDP struct {
+	raddr   *net.UDPAddr
+	context []byte
+}
+
+// RemoteAddr returns the remote network address.
+func (s *SessionUDP) RemoteAddr() net.Addr { return s.raddr }
+
+// ReadFromSessionUDP acts just like net.UDPConn.ReadFrom(), but returns a session object instead of a
+// net.UDPAddr.
+func ReadFromSessionUDP(conn *net.UDPConn, b []byte) (int, *SessionUDP, error) {
+	oob := make([]byte, 40)
+	n, oobn, _, raddr, err := conn.ReadMsgUDP(b, oob)
+	if err != nil {
+		return n, nil, err
+	}
+	return n, &SessionUDP{raddr, oob[:oobn]}, err
+}
+
+// WriteToSessionUDP acts just like net.UDPConn.WritetTo(), but uses a *SessionUDP instead of a net.Addr.
+func WriteToSessionUDP(conn *net.UDPConn, b []byte, session *SessionUDP) (int, error) {
+	n, _, err := conn.WriteMsgUDP(b, session.context, session.raddr)
+	return n, err
+}
diff --git a/vendor/github.com/miekg/dns/udp_windows.go b/vendor/github.com/miekg/dns/udp_windows.go
new file mode 100644
index 000000000..2ce4b3300
--- /dev/null
+++ b/vendor/github.com/miekg/dns/udp_windows.go
@@ -0,0 +1,34 @@
+// +build windows
+
+package dns
+
+import "net"
+
+type SessionUDP struct {
+	raddr *net.UDPAddr
+}
+
+// ReadFromSessionUDP acts just like net.UDPConn.ReadFrom(), but returns a session object instead of a
+// net.UDPAddr.
+func ReadFromSessionUDP(conn *net.UDPConn, b []byte) (int, *SessionUDP, error) {
+	n, raddr, err := conn.ReadFrom(b)
+	if err != nil {
+		return n, nil, err
+	}
+	session := &SessionUDP{raddr.(*net.UDPAddr)}
+	return n, session, err
+}
+
+// WriteToSessionUDP acts just like net.UDPConn.WritetTo(), but uses a *SessionUDP instead of a net.Addr.
+func WriteToSessionUDP(conn *net.UDPConn, b []byte, session *SessionUDP) (int, error) {
+	n, err := conn.WriteTo(b, session.raddr)
+	return n, err
+}
+
+func (s *SessionUDP) RemoteAddr() net.Addr { return s.raddr }
+
+// setUDPSocketOptions sets the UDP socket options.
+// This function is implemented on a per platform basis. See udp_*.go for more details
+func setUDPSocketOptions(conn *net.UDPConn) error {
+	return nil
+}
diff --git a/vendor/github.com/miekg/dns/update.go b/vendor/github.com/miekg/dns/update.go
new file mode 100644
index 000000000..e90c5c968
--- /dev/null
+++ b/vendor/github.com/miekg/dns/update.go
@@ -0,0 +1,106 @@
+package dns
+
+// NameUsed sets the RRs in the prereq section to
+// "Name is in use" RRs. RFC 2136 section 2.4.4.
+func (u *Msg) NameUsed(rr []RR) {
+	if u.Answer == nil {
+		u.Answer = make([]RR, 0, len(rr))
+	}
+	for _, r := range rr {
+		u.Answer = append(u.Answer, &ANY{Hdr: RR_Header{Name: r.Header().Name, Ttl: 0, Rrtype: TypeANY, Class: ClassANY}})
+	}
+}
+
+// NameNotUsed sets the RRs in the prereq section to
+// "Name is in not use" RRs. RFC 2136 section 2.4.5.
+func (u *Msg) NameNotUsed(rr []RR) {
+	if u.Answer == nil {
+		u.Answer = make([]RR, 0, len(rr))
+	}
+	for _, r := range rr {
+		u.Answer = append(u.Answer, &ANY{Hdr: RR_Header{Name: r.Header().Name, Ttl: 0, Rrtype: TypeANY, Class: ClassNONE}})
+	}
+}
+
+// Used sets the RRs in the prereq section to
+// "RRset exists (value dependent -- with rdata)" RRs. RFC 2136 section 2.4.2.
+func (u *Msg) Used(rr []RR) {
+	if len(u.Question) == 0 {
+		panic("dns: empty question section")
+	}
+	if u.Answer == nil {
+		u.Answer = make([]RR, 0, len(rr))
+	}
+	for _, r := range rr {
+		r.Header().Class = u.Question[0].Qclass
+		u.Answer = append(u.Answer, r)
+	}
+}
+
+// RRsetUsed sets the RRs in the prereq section to
+// "RRset exists (value independent -- no rdata)" RRs. RFC 2136 section 2.4.1.
+func (u *Msg) RRsetUsed(rr []RR) {
+	if u.Answer == nil {
+		u.Answer = make([]RR, 0, len(rr))
+	}
+	for _, r := range rr {
+		u.Answer = append(u.Answer, &ANY{Hdr: RR_Header{Name: r.Header().Name, Ttl: 0, Rrtype: r.Header().Rrtype, Class: ClassANY}})
+	}
+}
+
+// RRsetNotUsed sets the RRs in the prereq section to
+// "RRset does not exist" RRs. RFC 2136 section 2.4.3.
+func (u *Msg) RRsetNotUsed(rr []RR) {
+	if u.Answer == nil {
+		u.Answer = make([]RR, 0, len(rr))
+	}
+	for _, r := range rr {
+		u.Answer = append(u.Answer, &ANY{Hdr: RR_Header{Name: r.Header().Name, Ttl: 0, Rrtype: r.Header().Rrtype, Class: ClassNONE}})
+	}
+}
+
+// Insert creates a dynamic update packet that adds an complete RRset, see RFC 2136 section 2.5.1.
+func (u *Msg) Insert(rr []RR) {
+	if len(u.Question) == 0 {
+		panic("dns: empty question section")
+	}
+	if u.Ns == nil {
+		u.Ns = make([]RR, 0, len(rr))
+	}
+	for _, r := range rr {
+		r.Header().Class = u.Question[0].Qclass
+		u.Ns = append(u.Ns, r)
+	}
+}
+
+// RemoveRRset creates a dynamic update packet that deletes an RRset, see RFC 2136 section 2.5.2.
+func (u *Msg) RemoveRRset(rr []RR) {
+	if u.Ns == nil {
+		u.Ns = make([]RR, 0, len(rr))
+	}
+	for _, r := range rr {
+		u.Ns = append(u.Ns, &ANY{Hdr: RR_Header{Name: r.Header().Name, Ttl: 0, Rrtype: r.Header().Rrtype, Class: ClassANY}})
+	}
+}
+
+// RemoveName creates a dynamic update packet that deletes all RRsets of a name, see RFC 2136 section 2.5.3
+func (u *Msg) RemoveName(rr []RR) {
+	if u.Ns == nil {
+		u.Ns = make([]RR, 0, len(rr))
+	}
+	for _, r := range rr {
+		u.Ns = append(u.Ns, &ANY{Hdr: RR_Header{Name: r.Header().Name, Ttl: 0, Rrtype: TypeANY, Class: ClassANY}})
+	}
+}
+
+// Remove creates a dynamic update packet deletes RR from a RRSset, see RFC 2136 section 2.5.4
+func (u *Msg) Remove(rr []RR) {
+	if u.Ns == nil {
+		u.Ns = make([]RR, 0, len(rr))
+	}
+	for _, r := range rr {
+		r.Header().Class = ClassNONE
+		r.Header().Ttl = 0
+		u.Ns = append(u.Ns, r)
+	}
+}
diff --git a/vendor/github.com/miekg/dns/xfr.go b/vendor/github.com/miekg/dns/xfr.go
new file mode 100644
index 000000000..7346deffb
--- /dev/null
+++ b/vendor/github.com/miekg/dns/xfr.go
@@ -0,0 +1,244 @@
+package dns
+
+import (
+	"time"
+)
+
+// Envelope is used when doing a zone transfer with a remote server.
+type Envelope struct {
+	RR    []RR  // The set of RRs in the answer section of the xfr reply message.
+	Error error // If something went wrong, this contains the error.
+}
+
+// A Transfer defines parameters that are used during a zone transfer.
+type Transfer struct {
+	*Conn
+	DialTimeout    time.Duration     // net.DialTimeout, defaults to 2 seconds
+	ReadTimeout    time.Duration     // net.Conn.SetReadTimeout value for connections, defaults to 2 seconds
+	WriteTimeout   time.Duration     // net.Conn.SetWriteTimeout value for connections, defaults to 2 seconds
+	TsigSecret     map[string]string // Secret(s) for Tsig map[<zonename>]<base64 secret>, zonename must be fully qualified
+	tsigTimersOnly bool
+}
+
+// Think we need to away to stop the transfer
+
+// In performs an incoming transfer with the server in a.
+// If you would like to set the source IP, or some other attribute
+// of a Dialer for a Transfer, you can do so by specifying the attributes
+// in the Transfer.Conn:
+//
+//	d := net.Dialer{LocalAddr: transfer_source}
+//	con, err := d.Dial("tcp", master)
+//	dnscon := &dns.Conn{Conn:con}
+//	transfer = &dns.Transfer{Conn: dnscon}
+//	channel, err := transfer.In(message, master)
+//
+func (t *Transfer) In(q *Msg, a string) (env chan *Envelope, err error) {
+	timeout := dnsTimeout
+	if t.DialTimeout != 0 {
+		timeout = t.DialTimeout
+	}
+	if t.Conn == nil {
+		t.Conn, err = DialTimeout("tcp", a, timeout)
+		if err != nil {
+			return nil, err
+		}
+	}
+	if err := t.WriteMsg(q); err != nil {
+		return nil, err
+	}
+	env = make(chan *Envelope)
+	go func() {
+		if q.Question[0].Qtype == TypeAXFR {
+			go t.inAxfr(q.Id, env)
+			return
+		}
+		if q.Question[0].Qtype == TypeIXFR {
+			go t.inIxfr(q.Id, env)
+			return
+		}
+	}()
+	return env, nil
+}
+
+func (t *Transfer) inAxfr(id uint16, c chan *Envelope) {
+	first := true
+	defer t.Close()
+	defer close(c)
+	timeout := dnsTimeout
+	if t.ReadTimeout != 0 {
+		timeout = t.ReadTimeout
+	}
+	for {
+		t.Conn.SetReadDeadline(time.Now().Add(timeout))
+		in, err := t.ReadMsg()
+		if err != nil {
+			c <- &Envelope{nil, err}
+			return
+		}
+		if id != in.Id {
+			c <- &Envelope{in.Answer, ErrId}
+			return
+		}
+		if first {
+			if !isSOAFirst(in) {
+				c <- &Envelope{in.Answer, ErrSoa}
+				return
+			}
+			first = !first
+			// only one answer that is SOA, receive more
+			if len(in.Answer) == 1 {
+				t.tsigTimersOnly = true
+				c <- &Envelope{in.Answer, nil}
+				continue
+			}
+		}
+
+		if !first {
+			t.tsigTimersOnly = true // Subsequent envelopes use this.
+			if isSOALast(in) {
+				c <- &Envelope{in.Answer, nil}
+				return
+			}
+			c <- &Envelope{in.Answer, nil}
+		}
+	}
+}
+
+func (t *Transfer) inIxfr(id uint16, c chan *Envelope) {
+	serial := uint32(0) // The first serial seen is the current server serial
+	first := true
+	defer t.Close()
+	defer close(c)
+	timeout := dnsTimeout
+	if t.ReadTimeout != 0 {
+		timeout = t.ReadTimeout
+	}
+	for {
+		t.SetReadDeadline(time.Now().Add(timeout))
+		in, err := t.ReadMsg()
+		if err != nil {
+			c <- &Envelope{nil, err}
+			return
+		}
+		if id != in.Id {
+			c <- &Envelope{in.Answer, ErrId}
+			return
+		}
+		if first {
+			// A single SOA RR signals "no changes"
+			if len(in.Answer) == 1 && isSOAFirst(in) {
+				c <- &Envelope{in.Answer, nil}
+				return
+			}
+
+			// Check if the returned answer is ok
+			if !isSOAFirst(in) {
+				c <- &Envelope{in.Answer, ErrSoa}
+				return
+			}
+			// This serial is important
+			serial = in.Answer[0].(*SOA).Serial
+			first = !first
+		}
+
+		// Now we need to check each message for SOA records, to see what we need to do
+		if !first {
+			t.tsigTimersOnly = true
+			// If the last record in the IXFR contains the servers' SOA,  we should quit
+			if v, ok := in.Answer[len(in.Answer)-1].(*SOA); ok {
+				if v.Serial == serial {
+					c <- &Envelope{in.Answer, nil}
+					return
+				}
+			}
+			c <- &Envelope{in.Answer, nil}
+		}
+	}
+}
+
+// Out performs an outgoing transfer with the client connecting in w.
+// Basic use pattern:
+//
+//	ch := make(chan *dns.Envelope)
+//	tr := new(dns.Transfer)
+//	go tr.Out(w, r, ch)
+//	ch <- &dns.Envelope{RR: []dns.RR{soa, rr1, rr2, rr3, soa}}
+//	close(ch)
+//	w.Hijack()
+//	// w.Close() // Client closes connection
+//
+// The server is responsible for sending the correct sequence of RRs through the
+// channel ch.
+func (t *Transfer) Out(w ResponseWriter, q *Msg, ch chan *Envelope) error {
+	for x := range ch {
+		r := new(Msg)
+		// Compress?
+		r.SetReply(q)
+		r.Authoritative = true
+		// assume it fits TODO(miek): fix
+		r.Answer = append(r.Answer, x.RR...)
+		if err := w.WriteMsg(r); err != nil {
+			return err
+		}
+	}
+	w.TsigTimersOnly(true)
+	return nil
+}
+
+// ReadMsg reads a message from the transfer connection t.
+func (t *Transfer) ReadMsg() (*Msg, error) {
+	m := new(Msg)
+	p := make([]byte, MaxMsgSize)
+	n, err := t.Read(p)
+	if err != nil && n == 0 {
+		return nil, err
+	}
+	p = p[:n]
+	if err := m.Unpack(p); err != nil {
+		return nil, err
+	}
+	if ts := m.IsTsig(); ts != nil && t.TsigSecret != nil {
+		if _, ok := t.TsigSecret[ts.Hdr.Name]; !ok {
+			return m, ErrSecret
+		}
+		// Need to work on the original message p, as that was used to calculate the tsig.
+		err = TsigVerify(p, t.TsigSecret[ts.Hdr.Name], t.tsigRequestMAC, t.tsigTimersOnly)
+		t.tsigRequestMAC = ts.MAC
+	}
+	return m, err
+}
+
+// WriteMsg writes a message through the transfer connection t.
+func (t *Transfer) WriteMsg(m *Msg) (err error) {
+	var out []byte
+	if ts := m.IsTsig(); ts != nil && t.TsigSecret != nil {
+		if _, ok := t.TsigSecret[ts.Hdr.Name]; !ok {
+			return ErrSecret
+		}
+		out, t.tsigRequestMAC, err = TsigGenerate(m, t.TsigSecret[ts.Hdr.Name], t.tsigRequestMAC, t.tsigTimersOnly)
+	} else {
+		out, err = m.Pack()
+	}
+	if err != nil {
+		return err
+	}
+	if _, err = t.Write(out); err != nil {
+		return err
+	}
+	return nil
+}
+
+func isSOAFirst(in *Msg) bool {
+	if len(in.Answer) > 0 {
+		return in.Answer[0].Header().Rrtype == TypeSOA
+	}
+	return false
+}
+
+func isSOALast(in *Msg) bool {
+	if len(in.Answer) > 0 {
+		return in.Answer[len(in.Answer)-1].Header().Rrtype == TypeSOA
+	}
+	return false
+}
diff --git a/vendor/github.com/miekg/dns/zmsg.go b/vendor/github.com/miekg/dns/zmsg.go
new file mode 100644
index 000000000..c561370e7
--- /dev/null
+++ b/vendor/github.com/miekg/dns/zmsg.go
@@ -0,0 +1,3529 @@
+// *** DO NOT MODIFY ***
+// AUTOGENERATED BY go generate from msg_generate.go
+
+package dns
+
+// pack*() functions
+
+func (rr *A) pack(msg []byte, off int, compression map[string]int, compress bool) (int, error) {
+	off, err := rr.Hdr.pack(msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	headerEnd := off
+	off, err = packDataA(rr.A, msg, off)
+	if err != nil {
+		return off, err
+	}
+	rr.Header().Rdlength = uint16(off - headerEnd)
+	return off, nil
+}
+
+func (rr *AAAA) pack(msg []byte, off int, compression map[string]int, compress bool) (int, error) {
+	off, err := rr.Hdr.pack(msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	headerEnd := off
+	off, err = packDataAAAA(rr.AAAA, msg, off)
+	if err != nil {
+		return off, err
+	}
+	rr.Header().Rdlength = uint16(off - headerEnd)
+	return off, nil
+}
+
+func (rr *AFSDB) pack(msg []byte, off int, compression map[string]int, compress bool) (int, error) {
+	off, err := rr.Hdr.pack(msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	headerEnd := off
+	off, err = packUint16(rr.Subtype, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = PackDomainName(rr.Hostname, msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	rr.Header().Rdlength = uint16(off - headerEnd)
+	return off, nil
+}
+
+func (rr *ANY) pack(msg []byte, off int, compression map[string]int, compress bool) (int, error) {
+	off, err := rr.Hdr.pack(msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	headerEnd := off
+	rr.Header().Rdlength = uint16(off - headerEnd)
+	return off, nil
+}
+
+func (rr *CAA) pack(msg []byte, off int, compression map[string]int, compress bool) (int, error) {
+	off, err := rr.Hdr.pack(msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	headerEnd := off
+	off, err = packUint8(rr.Flag, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packString(rr.Tag, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packStringOctet(rr.Value, msg, off)
+	if err != nil {
+		return off, err
+	}
+	rr.Header().Rdlength = uint16(off - headerEnd)
+	return off, nil
+}
+
+func (rr *CDNSKEY) pack(msg []byte, off int, compression map[string]int, compress bool) (int, error) {
+	off, err := rr.Hdr.pack(msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	headerEnd := off
+	off, err = packUint16(rr.Flags, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint8(rr.Protocol, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint8(rr.Algorithm, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packStringBase64(rr.PublicKey, msg, off)
+	if err != nil {
+		return off, err
+	}
+	rr.Header().Rdlength = uint16(off - headerEnd)
+	return off, nil
+}
+
+func (rr *CDS) pack(msg []byte, off int, compression map[string]int, compress bool) (int, error) {
+	off, err := rr.Hdr.pack(msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	headerEnd := off
+	off, err = packUint16(rr.KeyTag, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint8(rr.Algorithm, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint8(rr.DigestType, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packStringHex(rr.Digest, msg, off)
+	if err != nil {
+		return off, err
+	}
+	rr.Header().Rdlength = uint16(off - headerEnd)
+	return off, nil
+}
+
+func (rr *CERT) pack(msg []byte, off int, compression map[string]int, compress bool) (int, error) {
+	off, err := rr.Hdr.pack(msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	headerEnd := off
+	off, err = packUint16(rr.Type, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint16(rr.KeyTag, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint8(rr.Algorithm, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packStringBase64(rr.Certificate, msg, off)
+	if err != nil {
+		return off, err
+	}
+	rr.Header().Rdlength = uint16(off - headerEnd)
+	return off, nil
+}
+
+func (rr *CNAME) pack(msg []byte, off int, compression map[string]int, compress bool) (int, error) {
+	off, err := rr.Hdr.pack(msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	headerEnd := off
+	off, err = PackDomainName(rr.Target, msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	rr.Header().Rdlength = uint16(off - headerEnd)
+	return off, nil
+}
+
+func (rr *DHCID) pack(msg []byte, off int, compression map[string]int, compress bool) (int, error) {
+	off, err := rr.Hdr.pack(msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	headerEnd := off
+	off, err = packStringBase64(rr.Digest, msg, off)
+	if err != nil {
+		return off, err
+	}
+	rr.Header().Rdlength = uint16(off - headerEnd)
+	return off, nil
+}
+
+func (rr *DLV) pack(msg []byte, off int, compression map[string]int, compress bool) (int, error) {
+	off, err := rr.Hdr.pack(msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	headerEnd := off
+	off, err = packUint16(rr.KeyTag, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint8(rr.Algorithm, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint8(rr.DigestType, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packStringHex(rr.Digest, msg, off)
+	if err != nil {
+		return off, err
+	}
+	rr.Header().Rdlength = uint16(off - headerEnd)
+	return off, nil
+}
+
+func (rr *DNAME) pack(msg []byte, off int, compression map[string]int, compress bool) (int, error) {
+	off, err := rr.Hdr.pack(msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	headerEnd := off
+	off, err = PackDomainName(rr.Target, msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	rr.Header().Rdlength = uint16(off - headerEnd)
+	return off, nil
+}
+
+func (rr *DNSKEY) pack(msg []byte, off int, compression map[string]int, compress bool) (int, error) {
+	off, err := rr.Hdr.pack(msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	headerEnd := off
+	off, err = packUint16(rr.Flags, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint8(rr.Protocol, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint8(rr.Algorithm, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packStringBase64(rr.PublicKey, msg, off)
+	if err != nil {
+		return off, err
+	}
+	rr.Header().Rdlength = uint16(off - headerEnd)
+	return off, nil
+}
+
+func (rr *DS) pack(msg []byte, off int, compression map[string]int, compress bool) (int, error) {
+	off, err := rr.Hdr.pack(msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	headerEnd := off
+	off, err = packUint16(rr.KeyTag, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint8(rr.Algorithm, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint8(rr.DigestType, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packStringHex(rr.Digest, msg, off)
+	if err != nil {
+		return off, err
+	}
+	rr.Header().Rdlength = uint16(off - headerEnd)
+	return off, nil
+}
+
+func (rr *EID) pack(msg []byte, off int, compression map[string]int, compress bool) (int, error) {
+	off, err := rr.Hdr.pack(msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	headerEnd := off
+	off, err = packStringHex(rr.Endpoint, msg, off)
+	if err != nil {
+		return off, err
+	}
+	rr.Header().Rdlength = uint16(off - headerEnd)
+	return off, nil
+}
+
+func (rr *EUI48) pack(msg []byte, off int, compression map[string]int, compress bool) (int, error) {
+	off, err := rr.Hdr.pack(msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	headerEnd := off
+	off, err = packUint48(rr.Address, msg, off)
+	if err != nil {
+		return off, err
+	}
+	rr.Header().Rdlength = uint16(off - headerEnd)
+	return off, nil
+}
+
+func (rr *EUI64) pack(msg []byte, off int, compression map[string]int, compress bool) (int, error) {
+	off, err := rr.Hdr.pack(msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	headerEnd := off
+	off, err = packUint64(rr.Address, msg, off)
+	if err != nil {
+		return off, err
+	}
+	rr.Header().Rdlength = uint16(off - headerEnd)
+	return off, nil
+}
+
+func (rr *GID) pack(msg []byte, off int, compression map[string]int, compress bool) (int, error) {
+	off, err := rr.Hdr.pack(msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	headerEnd := off
+	off, err = packUint32(rr.Gid, msg, off)
+	if err != nil {
+		return off, err
+	}
+	rr.Header().Rdlength = uint16(off - headerEnd)
+	return off, nil
+}
+
+func (rr *GPOS) pack(msg []byte, off int, compression map[string]int, compress bool) (int, error) {
+	off, err := rr.Hdr.pack(msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	headerEnd := off
+	off, err = packString(rr.Longitude, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packString(rr.Latitude, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packString(rr.Altitude, msg, off)
+	if err != nil {
+		return off, err
+	}
+	rr.Header().Rdlength = uint16(off - headerEnd)
+	return off, nil
+}
+
+func (rr *HINFO) pack(msg []byte, off int, compression map[string]int, compress bool) (int, error) {
+	off, err := rr.Hdr.pack(msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	headerEnd := off
+	off, err = packString(rr.Cpu, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packString(rr.Os, msg, off)
+	if err != nil {
+		return off, err
+	}
+	rr.Header().Rdlength = uint16(off - headerEnd)
+	return off, nil
+}
+
+func (rr *HIP) pack(msg []byte, off int, compression map[string]int, compress bool) (int, error) {
+	off, err := rr.Hdr.pack(msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	headerEnd := off
+	off, err = packUint8(rr.HitLength, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint8(rr.PublicKeyAlgorithm, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint16(rr.PublicKeyLength, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packStringHex(rr.Hit, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packStringBase64(rr.PublicKey, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packDataDomainNames(rr.RendezvousServers, msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	rr.Header().Rdlength = uint16(off - headerEnd)
+	return off, nil
+}
+
+func (rr *KEY) pack(msg []byte, off int, compression map[string]int, compress bool) (int, error) {
+	off, err := rr.Hdr.pack(msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	headerEnd := off
+	off, err = packUint16(rr.Flags, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint8(rr.Protocol, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint8(rr.Algorithm, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packStringBase64(rr.PublicKey, msg, off)
+	if err != nil {
+		return off, err
+	}
+	rr.Header().Rdlength = uint16(off - headerEnd)
+	return off, nil
+}
+
+func (rr *KX) pack(msg []byte, off int, compression map[string]int, compress bool) (int, error) {
+	off, err := rr.Hdr.pack(msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	headerEnd := off
+	off, err = packUint16(rr.Preference, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = PackDomainName(rr.Exchanger, msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	rr.Header().Rdlength = uint16(off - headerEnd)
+	return off, nil
+}
+
+func (rr *L32) pack(msg []byte, off int, compression map[string]int, compress bool) (int, error) {
+	off, err := rr.Hdr.pack(msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	headerEnd := off
+	off, err = packUint16(rr.Preference, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packDataA(rr.Locator32, msg, off)
+	if err != nil {
+		return off, err
+	}
+	rr.Header().Rdlength = uint16(off - headerEnd)
+	return off, nil
+}
+
+func (rr *L64) pack(msg []byte, off int, compression map[string]int, compress bool) (int, error) {
+	off, err := rr.Hdr.pack(msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	headerEnd := off
+	off, err = packUint16(rr.Preference, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint64(rr.Locator64, msg, off)
+	if err != nil {
+		return off, err
+	}
+	rr.Header().Rdlength = uint16(off - headerEnd)
+	return off, nil
+}
+
+func (rr *LOC) pack(msg []byte, off int, compression map[string]int, compress bool) (int, error) {
+	off, err := rr.Hdr.pack(msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	headerEnd := off
+	off, err = packUint8(rr.Version, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint8(rr.Size, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint8(rr.HorizPre, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint8(rr.VertPre, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint32(rr.Latitude, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint32(rr.Longitude, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint32(rr.Altitude, msg, off)
+	if err != nil {
+		return off, err
+	}
+	rr.Header().Rdlength = uint16(off - headerEnd)
+	return off, nil
+}
+
+func (rr *LP) pack(msg []byte, off int, compression map[string]int, compress bool) (int, error) {
+	off, err := rr.Hdr.pack(msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	headerEnd := off
+	off, err = packUint16(rr.Preference, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = PackDomainName(rr.Fqdn, msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	rr.Header().Rdlength = uint16(off - headerEnd)
+	return off, nil
+}
+
+func (rr *MB) pack(msg []byte, off int, compression map[string]int, compress bool) (int, error) {
+	off, err := rr.Hdr.pack(msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	headerEnd := off
+	off, err = PackDomainName(rr.Mb, msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	rr.Header().Rdlength = uint16(off - headerEnd)
+	return off, nil
+}
+
+func (rr *MD) pack(msg []byte, off int, compression map[string]int, compress bool) (int, error) {
+	off, err := rr.Hdr.pack(msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	headerEnd := off
+	off, err = PackDomainName(rr.Md, msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	rr.Header().Rdlength = uint16(off - headerEnd)
+	return off, nil
+}
+
+func (rr *MF) pack(msg []byte, off int, compression map[string]int, compress bool) (int, error) {
+	off, err := rr.Hdr.pack(msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	headerEnd := off
+	off, err = PackDomainName(rr.Mf, msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	rr.Header().Rdlength = uint16(off - headerEnd)
+	return off, nil
+}
+
+func (rr *MG) pack(msg []byte, off int, compression map[string]int, compress bool) (int, error) {
+	off, err := rr.Hdr.pack(msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	headerEnd := off
+	off, err = PackDomainName(rr.Mg, msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	rr.Header().Rdlength = uint16(off - headerEnd)
+	return off, nil
+}
+
+func (rr *MINFO) pack(msg []byte, off int, compression map[string]int, compress bool) (int, error) {
+	off, err := rr.Hdr.pack(msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	headerEnd := off
+	off, err = PackDomainName(rr.Rmail, msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	off, err = PackDomainName(rr.Email, msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	rr.Header().Rdlength = uint16(off - headerEnd)
+	return off, nil
+}
+
+func (rr *MR) pack(msg []byte, off int, compression map[string]int, compress bool) (int, error) {
+	off, err := rr.Hdr.pack(msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	headerEnd := off
+	off, err = PackDomainName(rr.Mr, msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	rr.Header().Rdlength = uint16(off - headerEnd)
+	return off, nil
+}
+
+func (rr *MX) pack(msg []byte, off int, compression map[string]int, compress bool) (int, error) {
+	off, err := rr.Hdr.pack(msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	headerEnd := off
+	off, err = packUint16(rr.Preference, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = PackDomainName(rr.Mx, msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	rr.Header().Rdlength = uint16(off - headerEnd)
+	return off, nil
+}
+
+func (rr *NAPTR) pack(msg []byte, off int, compression map[string]int, compress bool) (int, error) {
+	off, err := rr.Hdr.pack(msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	headerEnd := off
+	off, err = packUint16(rr.Order, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint16(rr.Preference, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packString(rr.Flags, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packString(rr.Service, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packString(rr.Regexp, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = PackDomainName(rr.Replacement, msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	rr.Header().Rdlength = uint16(off - headerEnd)
+	return off, nil
+}
+
+func (rr *NID) pack(msg []byte, off int, compression map[string]int, compress bool) (int, error) {
+	off, err := rr.Hdr.pack(msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	headerEnd := off
+	off, err = packUint16(rr.Preference, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint64(rr.NodeID, msg, off)
+	if err != nil {
+		return off, err
+	}
+	rr.Header().Rdlength = uint16(off - headerEnd)
+	return off, nil
+}
+
+func (rr *NIMLOC) pack(msg []byte, off int, compression map[string]int, compress bool) (int, error) {
+	off, err := rr.Hdr.pack(msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	headerEnd := off
+	off, err = packStringHex(rr.Locator, msg, off)
+	if err != nil {
+		return off, err
+	}
+	rr.Header().Rdlength = uint16(off - headerEnd)
+	return off, nil
+}
+
+func (rr *NINFO) pack(msg []byte, off int, compression map[string]int, compress bool) (int, error) {
+	off, err := rr.Hdr.pack(msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	headerEnd := off
+	off, err = packStringTxt(rr.ZSData, msg, off)
+	if err != nil {
+		return off, err
+	}
+	rr.Header().Rdlength = uint16(off - headerEnd)
+	return off, nil
+}
+
+func (rr *NS) pack(msg []byte, off int, compression map[string]int, compress bool) (int, error) {
+	off, err := rr.Hdr.pack(msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	headerEnd := off
+	off, err = PackDomainName(rr.Ns, msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	rr.Header().Rdlength = uint16(off - headerEnd)
+	return off, nil
+}
+
+func (rr *NSAPPTR) pack(msg []byte, off int, compression map[string]int, compress bool) (int, error) {
+	off, err := rr.Hdr.pack(msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	headerEnd := off
+	off, err = PackDomainName(rr.Ptr, msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	rr.Header().Rdlength = uint16(off - headerEnd)
+	return off, nil
+}
+
+func (rr *NSEC) pack(msg []byte, off int, compression map[string]int, compress bool) (int, error) {
+	off, err := rr.Hdr.pack(msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	headerEnd := off
+	off, err = PackDomainName(rr.NextDomain, msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	off, err = packDataNsec(rr.TypeBitMap, msg, off)
+	if err != nil {
+		return off, err
+	}
+	rr.Header().Rdlength = uint16(off - headerEnd)
+	return off, nil
+}
+
+func (rr *NSEC3) pack(msg []byte, off int, compression map[string]int, compress bool) (int, error) {
+	off, err := rr.Hdr.pack(msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	headerEnd := off
+	off, err = packUint8(rr.Hash, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint8(rr.Flags, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint16(rr.Iterations, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint8(rr.SaltLength, msg, off)
+	if err != nil {
+		return off, err
+	}
+	if rr.Salt == "-" { /* do nothing, empty salt */
+	}
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint8(rr.HashLength, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packStringBase32(rr.NextDomain, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packDataNsec(rr.TypeBitMap, msg, off)
+	if err != nil {
+		return off, err
+	}
+	rr.Header().Rdlength = uint16(off - headerEnd)
+	return off, nil
+}
+
+func (rr *NSEC3PARAM) pack(msg []byte, off int, compression map[string]int, compress bool) (int, error) {
+	off, err := rr.Hdr.pack(msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	headerEnd := off
+	off, err = packUint8(rr.Hash, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint8(rr.Flags, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint16(rr.Iterations, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint8(rr.SaltLength, msg, off)
+	if err != nil {
+		return off, err
+	}
+	if rr.Salt == "-" { /* do nothing, empty salt */
+	}
+	if err != nil {
+		return off, err
+	}
+	rr.Header().Rdlength = uint16(off - headerEnd)
+	return off, nil
+}
+
+func (rr *OPENPGPKEY) pack(msg []byte, off int, compression map[string]int, compress bool) (int, error) {
+	off, err := rr.Hdr.pack(msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	headerEnd := off
+	off, err = packStringBase64(rr.PublicKey, msg, off)
+	if err != nil {
+		return off, err
+	}
+	rr.Header().Rdlength = uint16(off - headerEnd)
+	return off, nil
+}
+
+func (rr *OPT) pack(msg []byte, off int, compression map[string]int, compress bool) (int, error) {
+	off, err := rr.Hdr.pack(msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	headerEnd := off
+	off, err = packDataOpt(rr.Option, msg, off)
+	if err != nil {
+		return off, err
+	}
+	rr.Header().Rdlength = uint16(off - headerEnd)
+	return off, nil
+}
+
+func (rr *PTR) pack(msg []byte, off int, compression map[string]int, compress bool) (int, error) {
+	off, err := rr.Hdr.pack(msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	headerEnd := off
+	off, err = PackDomainName(rr.Ptr, msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	rr.Header().Rdlength = uint16(off - headerEnd)
+	return off, nil
+}
+
+func (rr *PX) pack(msg []byte, off int, compression map[string]int, compress bool) (int, error) {
+	off, err := rr.Hdr.pack(msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	headerEnd := off
+	off, err = packUint16(rr.Preference, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = PackDomainName(rr.Map822, msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	off, err = PackDomainName(rr.Mapx400, msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	rr.Header().Rdlength = uint16(off - headerEnd)
+	return off, nil
+}
+
+func (rr *RFC3597) pack(msg []byte, off int, compression map[string]int, compress bool) (int, error) {
+	off, err := rr.Hdr.pack(msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	headerEnd := off
+	off, err = packStringHex(rr.Rdata, msg, off)
+	if err != nil {
+		return off, err
+	}
+	rr.Header().Rdlength = uint16(off - headerEnd)
+	return off, nil
+}
+
+func (rr *RKEY) pack(msg []byte, off int, compression map[string]int, compress bool) (int, error) {
+	off, err := rr.Hdr.pack(msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	headerEnd := off
+	off, err = packUint16(rr.Flags, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint8(rr.Protocol, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint8(rr.Algorithm, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packStringBase64(rr.PublicKey, msg, off)
+	if err != nil {
+		return off, err
+	}
+	rr.Header().Rdlength = uint16(off - headerEnd)
+	return off, nil
+}
+
+func (rr *RP) pack(msg []byte, off int, compression map[string]int, compress bool) (int, error) {
+	off, err := rr.Hdr.pack(msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	headerEnd := off
+	off, err = PackDomainName(rr.Mbox, msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	off, err = PackDomainName(rr.Txt, msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	rr.Header().Rdlength = uint16(off - headerEnd)
+	return off, nil
+}
+
+func (rr *RRSIG) pack(msg []byte, off int, compression map[string]int, compress bool) (int, error) {
+	off, err := rr.Hdr.pack(msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	headerEnd := off
+	off, err = packUint16(rr.TypeCovered, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint8(rr.Algorithm, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint8(rr.Labels, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint32(rr.OrigTtl, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint32(rr.Expiration, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint32(rr.Inception, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint16(rr.KeyTag, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = PackDomainName(rr.SignerName, msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	off, err = packStringBase64(rr.Signature, msg, off)
+	if err != nil {
+		return off, err
+	}
+	rr.Header().Rdlength = uint16(off - headerEnd)
+	return off, nil
+}
+
+func (rr *RT) pack(msg []byte, off int, compression map[string]int, compress bool) (int, error) {
+	off, err := rr.Hdr.pack(msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	headerEnd := off
+	off, err = packUint16(rr.Preference, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = PackDomainName(rr.Host, msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	rr.Header().Rdlength = uint16(off - headerEnd)
+	return off, nil
+}
+
+func (rr *SIG) pack(msg []byte, off int, compression map[string]int, compress bool) (int, error) {
+	off, err := rr.Hdr.pack(msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	headerEnd := off
+	off, err = packUint16(rr.TypeCovered, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint8(rr.Algorithm, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint8(rr.Labels, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint32(rr.OrigTtl, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint32(rr.Expiration, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint32(rr.Inception, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint16(rr.KeyTag, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = PackDomainName(rr.SignerName, msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	off, err = packStringBase64(rr.Signature, msg, off)
+	if err != nil {
+		return off, err
+	}
+	rr.Header().Rdlength = uint16(off - headerEnd)
+	return off, nil
+}
+
+func (rr *SMIMEA) pack(msg []byte, off int, compression map[string]int, compress bool) (int, error) {
+	off, err := rr.Hdr.pack(msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	headerEnd := off
+	off, err = packUint8(rr.Usage, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint8(rr.Selector, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint8(rr.MatchingType, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packStringHex(rr.Certificate, msg, off)
+	if err != nil {
+		return off, err
+	}
+	rr.Header().Rdlength = uint16(off - headerEnd)
+	return off, nil
+}
+
+func (rr *SOA) pack(msg []byte, off int, compression map[string]int, compress bool) (int, error) {
+	off, err := rr.Hdr.pack(msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	headerEnd := off
+	off, err = PackDomainName(rr.Ns, msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	off, err = PackDomainName(rr.Mbox, msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint32(rr.Serial, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint32(rr.Refresh, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint32(rr.Retry, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint32(rr.Expire, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint32(rr.Minttl, msg, off)
+	if err != nil {
+		return off, err
+	}
+	rr.Header().Rdlength = uint16(off - headerEnd)
+	return off, nil
+}
+
+func (rr *SPF) pack(msg []byte, off int, compression map[string]int, compress bool) (int, error) {
+	off, err := rr.Hdr.pack(msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	headerEnd := off
+	off, err = packStringTxt(rr.Txt, msg, off)
+	if err != nil {
+		return off, err
+	}
+	rr.Header().Rdlength = uint16(off - headerEnd)
+	return off, nil
+}
+
+func (rr *SRV) pack(msg []byte, off int, compression map[string]int, compress bool) (int, error) {
+	off, err := rr.Hdr.pack(msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	headerEnd := off
+	off, err = packUint16(rr.Priority, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint16(rr.Weight, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint16(rr.Port, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = PackDomainName(rr.Target, msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	rr.Header().Rdlength = uint16(off - headerEnd)
+	return off, nil
+}
+
+func (rr *SSHFP) pack(msg []byte, off int, compression map[string]int, compress bool) (int, error) {
+	off, err := rr.Hdr.pack(msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	headerEnd := off
+	off, err = packUint8(rr.Algorithm, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint8(rr.Type, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packStringHex(rr.FingerPrint, msg, off)
+	if err != nil {
+		return off, err
+	}
+	rr.Header().Rdlength = uint16(off - headerEnd)
+	return off, nil
+}
+
+func (rr *TA) pack(msg []byte, off int, compression map[string]int, compress bool) (int, error) {
+	off, err := rr.Hdr.pack(msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	headerEnd := off
+	off, err = packUint16(rr.KeyTag, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint8(rr.Algorithm, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint8(rr.DigestType, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packStringHex(rr.Digest, msg, off)
+	if err != nil {
+		return off, err
+	}
+	rr.Header().Rdlength = uint16(off - headerEnd)
+	return off, nil
+}
+
+func (rr *TALINK) pack(msg []byte, off int, compression map[string]int, compress bool) (int, error) {
+	off, err := rr.Hdr.pack(msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	headerEnd := off
+	off, err = PackDomainName(rr.PreviousName, msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	off, err = PackDomainName(rr.NextName, msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	rr.Header().Rdlength = uint16(off - headerEnd)
+	return off, nil
+}
+
+func (rr *TKEY) pack(msg []byte, off int, compression map[string]int, compress bool) (int, error) {
+	off, err := rr.Hdr.pack(msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	headerEnd := off
+	off, err = PackDomainName(rr.Algorithm, msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint32(rr.Inception, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint32(rr.Expiration, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint16(rr.Mode, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint16(rr.Error, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint16(rr.KeySize, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packString(rr.Key, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint16(rr.OtherLen, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packString(rr.OtherData, msg, off)
+	if err != nil {
+		return off, err
+	}
+	rr.Header().Rdlength = uint16(off - headerEnd)
+	return off, nil
+}
+
+func (rr *TLSA) pack(msg []byte, off int, compression map[string]int, compress bool) (int, error) {
+	off, err := rr.Hdr.pack(msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	headerEnd := off
+	off, err = packUint8(rr.Usage, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint8(rr.Selector, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint8(rr.MatchingType, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packStringHex(rr.Certificate, msg, off)
+	if err != nil {
+		return off, err
+	}
+	rr.Header().Rdlength = uint16(off - headerEnd)
+	return off, nil
+}
+
+func (rr *TSIG) pack(msg []byte, off int, compression map[string]int, compress bool) (int, error) {
+	off, err := rr.Hdr.pack(msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	headerEnd := off
+	off, err = PackDomainName(rr.Algorithm, msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint48(rr.TimeSigned, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint16(rr.Fudge, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint16(rr.MACSize, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packStringHex(rr.MAC, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint16(rr.OrigId, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint16(rr.Error, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint16(rr.OtherLen, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packStringHex(rr.OtherData, msg, off)
+	if err != nil {
+		return off, err
+	}
+	rr.Header().Rdlength = uint16(off - headerEnd)
+	return off, nil
+}
+
+func (rr *TXT) pack(msg []byte, off int, compression map[string]int, compress bool) (int, error) {
+	off, err := rr.Hdr.pack(msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	headerEnd := off
+	off, err = packStringTxt(rr.Txt, msg, off)
+	if err != nil {
+		return off, err
+	}
+	rr.Header().Rdlength = uint16(off - headerEnd)
+	return off, nil
+}
+
+func (rr *UID) pack(msg []byte, off int, compression map[string]int, compress bool) (int, error) {
+	off, err := rr.Hdr.pack(msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	headerEnd := off
+	off, err = packUint32(rr.Uid, msg, off)
+	if err != nil {
+		return off, err
+	}
+	rr.Header().Rdlength = uint16(off - headerEnd)
+	return off, nil
+}
+
+func (rr *UINFO) pack(msg []byte, off int, compression map[string]int, compress bool) (int, error) {
+	off, err := rr.Hdr.pack(msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	headerEnd := off
+	off, err = packString(rr.Uinfo, msg, off)
+	if err != nil {
+		return off, err
+	}
+	rr.Header().Rdlength = uint16(off - headerEnd)
+	return off, nil
+}
+
+func (rr *URI) pack(msg []byte, off int, compression map[string]int, compress bool) (int, error) {
+	off, err := rr.Hdr.pack(msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	headerEnd := off
+	off, err = packUint16(rr.Priority, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packUint16(rr.Weight, msg, off)
+	if err != nil {
+		return off, err
+	}
+	off, err = packStringOctet(rr.Target, msg, off)
+	if err != nil {
+		return off, err
+	}
+	rr.Header().Rdlength = uint16(off - headerEnd)
+	return off, nil
+}
+
+func (rr *X25) pack(msg []byte, off int, compression map[string]int, compress bool) (int, error) {
+	off, err := rr.Hdr.pack(msg, off, compression, compress)
+	if err != nil {
+		return off, err
+	}
+	headerEnd := off
+	off, err = packString(rr.PSDNAddress, msg, off)
+	if err != nil {
+		return off, err
+	}
+	rr.Header().Rdlength = uint16(off - headerEnd)
+	return off, nil
+}
+
+// unpack*() functions
+
+func unpackA(h RR_Header, msg []byte, off int) (RR, int, error) {
+	rr := new(A)
+	rr.Hdr = h
+	if noRdata(h) {
+		return rr, off, nil
+	}
+	var err error
+	rdStart := off
+	_ = rdStart
+
+	rr.A, off, err = unpackDataA(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	return rr, off, err
+}
+
+func unpackAAAA(h RR_Header, msg []byte, off int) (RR, int, error) {
+	rr := new(AAAA)
+	rr.Hdr = h
+	if noRdata(h) {
+		return rr, off, nil
+	}
+	var err error
+	rdStart := off
+	_ = rdStart
+
+	rr.AAAA, off, err = unpackDataAAAA(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	return rr, off, err
+}
+
+func unpackAFSDB(h RR_Header, msg []byte, off int) (RR, int, error) {
+	rr := new(AFSDB)
+	rr.Hdr = h
+	if noRdata(h) {
+		return rr, off, nil
+	}
+	var err error
+	rdStart := off
+	_ = rdStart
+
+	rr.Subtype, off, err = unpackUint16(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Hostname, off, err = UnpackDomainName(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	return rr, off, err
+}
+
+func unpackANY(h RR_Header, msg []byte, off int) (RR, int, error) {
+	rr := new(ANY)
+	rr.Hdr = h
+	if noRdata(h) {
+		return rr, off, nil
+	}
+	var err error
+	rdStart := off
+	_ = rdStart
+
+	return rr, off, err
+}
+
+func unpackCAA(h RR_Header, msg []byte, off int) (RR, int, error) {
+	rr := new(CAA)
+	rr.Hdr = h
+	if noRdata(h) {
+		return rr, off, nil
+	}
+	var err error
+	rdStart := off
+	_ = rdStart
+
+	rr.Flag, off, err = unpackUint8(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Tag, off, err = unpackString(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Value, off, err = unpackStringOctet(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	return rr, off, err
+}
+
+func unpackCDNSKEY(h RR_Header, msg []byte, off int) (RR, int, error) {
+	rr := new(CDNSKEY)
+	rr.Hdr = h
+	if noRdata(h) {
+		return rr, off, nil
+	}
+	var err error
+	rdStart := off
+	_ = rdStart
+
+	rr.Flags, off, err = unpackUint16(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Protocol, off, err = unpackUint8(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Algorithm, off, err = unpackUint8(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.PublicKey, off, err = unpackStringBase64(msg, off, rdStart+int(rr.Hdr.Rdlength))
+	if err != nil {
+		return rr, off, err
+	}
+	return rr, off, err
+}
+
+func unpackCDS(h RR_Header, msg []byte, off int) (RR, int, error) {
+	rr := new(CDS)
+	rr.Hdr = h
+	if noRdata(h) {
+		return rr, off, nil
+	}
+	var err error
+	rdStart := off
+	_ = rdStart
+
+	rr.KeyTag, off, err = unpackUint16(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Algorithm, off, err = unpackUint8(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.DigestType, off, err = unpackUint8(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Digest, off, err = unpackStringHex(msg, off, rdStart+int(rr.Hdr.Rdlength))
+	if err != nil {
+		return rr, off, err
+	}
+	return rr, off, err
+}
+
+func unpackCERT(h RR_Header, msg []byte, off int) (RR, int, error) {
+	rr := new(CERT)
+	rr.Hdr = h
+	if noRdata(h) {
+		return rr, off, nil
+	}
+	var err error
+	rdStart := off
+	_ = rdStart
+
+	rr.Type, off, err = unpackUint16(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.KeyTag, off, err = unpackUint16(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Algorithm, off, err = unpackUint8(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Certificate, off, err = unpackStringBase64(msg, off, rdStart+int(rr.Hdr.Rdlength))
+	if err != nil {
+		return rr, off, err
+	}
+	return rr, off, err
+}
+
+func unpackCNAME(h RR_Header, msg []byte, off int) (RR, int, error) {
+	rr := new(CNAME)
+	rr.Hdr = h
+	if noRdata(h) {
+		return rr, off, nil
+	}
+	var err error
+	rdStart := off
+	_ = rdStart
+
+	rr.Target, off, err = UnpackDomainName(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	return rr, off, err
+}
+
+func unpackDHCID(h RR_Header, msg []byte, off int) (RR, int, error) {
+	rr := new(DHCID)
+	rr.Hdr = h
+	if noRdata(h) {
+		return rr, off, nil
+	}
+	var err error
+	rdStart := off
+	_ = rdStart
+
+	rr.Digest, off, err = unpackStringBase64(msg, off, rdStart+int(rr.Hdr.Rdlength))
+	if err != nil {
+		return rr, off, err
+	}
+	return rr, off, err
+}
+
+func unpackDLV(h RR_Header, msg []byte, off int) (RR, int, error) {
+	rr := new(DLV)
+	rr.Hdr = h
+	if noRdata(h) {
+		return rr, off, nil
+	}
+	var err error
+	rdStart := off
+	_ = rdStart
+
+	rr.KeyTag, off, err = unpackUint16(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Algorithm, off, err = unpackUint8(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.DigestType, off, err = unpackUint8(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Digest, off, err = unpackStringHex(msg, off, rdStart+int(rr.Hdr.Rdlength))
+	if err != nil {
+		return rr, off, err
+	}
+	return rr, off, err
+}
+
+func unpackDNAME(h RR_Header, msg []byte, off int) (RR, int, error) {
+	rr := new(DNAME)
+	rr.Hdr = h
+	if noRdata(h) {
+		return rr, off, nil
+	}
+	var err error
+	rdStart := off
+	_ = rdStart
+
+	rr.Target, off, err = UnpackDomainName(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	return rr, off, err
+}
+
+func unpackDNSKEY(h RR_Header, msg []byte, off int) (RR, int, error) {
+	rr := new(DNSKEY)
+	rr.Hdr = h
+	if noRdata(h) {
+		return rr, off, nil
+	}
+	var err error
+	rdStart := off
+	_ = rdStart
+
+	rr.Flags, off, err = unpackUint16(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Protocol, off, err = unpackUint8(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Algorithm, off, err = unpackUint8(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.PublicKey, off, err = unpackStringBase64(msg, off, rdStart+int(rr.Hdr.Rdlength))
+	if err != nil {
+		return rr, off, err
+	}
+	return rr, off, err
+}
+
+func unpackDS(h RR_Header, msg []byte, off int) (RR, int, error) {
+	rr := new(DS)
+	rr.Hdr = h
+	if noRdata(h) {
+		return rr, off, nil
+	}
+	var err error
+	rdStart := off
+	_ = rdStart
+
+	rr.KeyTag, off, err = unpackUint16(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Algorithm, off, err = unpackUint8(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.DigestType, off, err = unpackUint8(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Digest, off, err = unpackStringHex(msg, off, rdStart+int(rr.Hdr.Rdlength))
+	if err != nil {
+		return rr, off, err
+	}
+	return rr, off, err
+}
+
+func unpackEID(h RR_Header, msg []byte, off int) (RR, int, error) {
+	rr := new(EID)
+	rr.Hdr = h
+	if noRdata(h) {
+		return rr, off, nil
+	}
+	var err error
+	rdStart := off
+	_ = rdStart
+
+	rr.Endpoint, off, err = unpackStringHex(msg, off, rdStart+int(rr.Hdr.Rdlength))
+	if err != nil {
+		return rr, off, err
+	}
+	return rr, off, err
+}
+
+func unpackEUI48(h RR_Header, msg []byte, off int) (RR, int, error) {
+	rr := new(EUI48)
+	rr.Hdr = h
+	if noRdata(h) {
+		return rr, off, nil
+	}
+	var err error
+	rdStart := off
+	_ = rdStart
+
+	rr.Address, off, err = unpackUint48(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	return rr, off, err
+}
+
+func unpackEUI64(h RR_Header, msg []byte, off int) (RR, int, error) {
+	rr := new(EUI64)
+	rr.Hdr = h
+	if noRdata(h) {
+		return rr, off, nil
+	}
+	var err error
+	rdStart := off
+	_ = rdStart
+
+	rr.Address, off, err = unpackUint64(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	return rr, off, err
+}
+
+func unpackGID(h RR_Header, msg []byte, off int) (RR, int, error) {
+	rr := new(GID)
+	rr.Hdr = h
+	if noRdata(h) {
+		return rr, off, nil
+	}
+	var err error
+	rdStart := off
+	_ = rdStart
+
+	rr.Gid, off, err = unpackUint32(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	return rr, off, err
+}
+
+func unpackGPOS(h RR_Header, msg []byte, off int) (RR, int, error) {
+	rr := new(GPOS)
+	rr.Hdr = h
+	if noRdata(h) {
+		return rr, off, nil
+	}
+	var err error
+	rdStart := off
+	_ = rdStart
+
+	rr.Longitude, off, err = unpackString(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Latitude, off, err = unpackString(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Altitude, off, err = unpackString(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	return rr, off, err
+}
+
+func unpackHINFO(h RR_Header, msg []byte, off int) (RR, int, error) {
+	rr := new(HINFO)
+	rr.Hdr = h
+	if noRdata(h) {
+		return rr, off, nil
+	}
+	var err error
+	rdStart := off
+	_ = rdStart
+
+	rr.Cpu, off, err = unpackString(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Os, off, err = unpackString(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	return rr, off, err
+}
+
+func unpackHIP(h RR_Header, msg []byte, off int) (RR, int, error) {
+	rr := new(HIP)
+	rr.Hdr = h
+	if noRdata(h) {
+		return rr, off, nil
+	}
+	var err error
+	rdStart := off
+	_ = rdStart
+
+	rr.HitLength, off, err = unpackUint8(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.PublicKeyAlgorithm, off, err = unpackUint8(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.PublicKeyLength, off, err = unpackUint16(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Hit, off, err = unpackStringHex(msg, off, off+int(rr.HitLength))
+	if err != nil {
+		return rr, off, err
+	}
+	rr.PublicKey, off, err = unpackStringBase64(msg, off, off+int(rr.PublicKeyLength))
+	if err != nil {
+		return rr, off, err
+	}
+	rr.RendezvousServers, off, err = unpackDataDomainNames(msg, off, rdStart+int(rr.Hdr.Rdlength))
+	if err != nil {
+		return rr, off, err
+	}
+	return rr, off, err
+}
+
+func unpackKEY(h RR_Header, msg []byte, off int) (RR, int, error) {
+	rr := new(KEY)
+	rr.Hdr = h
+	if noRdata(h) {
+		return rr, off, nil
+	}
+	var err error
+	rdStart := off
+	_ = rdStart
+
+	rr.Flags, off, err = unpackUint16(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Protocol, off, err = unpackUint8(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Algorithm, off, err = unpackUint8(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.PublicKey, off, err = unpackStringBase64(msg, off, rdStart+int(rr.Hdr.Rdlength))
+	if err != nil {
+		return rr, off, err
+	}
+	return rr, off, err
+}
+
+func unpackKX(h RR_Header, msg []byte, off int) (RR, int, error) {
+	rr := new(KX)
+	rr.Hdr = h
+	if noRdata(h) {
+		return rr, off, nil
+	}
+	var err error
+	rdStart := off
+	_ = rdStart
+
+	rr.Preference, off, err = unpackUint16(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Exchanger, off, err = UnpackDomainName(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	return rr, off, err
+}
+
+func unpackL32(h RR_Header, msg []byte, off int) (RR, int, error) {
+	rr := new(L32)
+	rr.Hdr = h
+	if noRdata(h) {
+		return rr, off, nil
+	}
+	var err error
+	rdStart := off
+	_ = rdStart
+
+	rr.Preference, off, err = unpackUint16(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Locator32, off, err = unpackDataA(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	return rr, off, err
+}
+
+func unpackL64(h RR_Header, msg []byte, off int) (RR, int, error) {
+	rr := new(L64)
+	rr.Hdr = h
+	if noRdata(h) {
+		return rr, off, nil
+	}
+	var err error
+	rdStart := off
+	_ = rdStart
+
+	rr.Preference, off, err = unpackUint16(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Locator64, off, err = unpackUint64(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	return rr, off, err
+}
+
+func unpackLOC(h RR_Header, msg []byte, off int) (RR, int, error) {
+	rr := new(LOC)
+	rr.Hdr = h
+	if noRdata(h) {
+		return rr, off, nil
+	}
+	var err error
+	rdStart := off
+	_ = rdStart
+
+	rr.Version, off, err = unpackUint8(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Size, off, err = unpackUint8(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.HorizPre, off, err = unpackUint8(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.VertPre, off, err = unpackUint8(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Latitude, off, err = unpackUint32(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Longitude, off, err = unpackUint32(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Altitude, off, err = unpackUint32(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	return rr, off, err
+}
+
+func unpackLP(h RR_Header, msg []byte, off int) (RR, int, error) {
+	rr := new(LP)
+	rr.Hdr = h
+	if noRdata(h) {
+		return rr, off, nil
+	}
+	var err error
+	rdStart := off
+	_ = rdStart
+
+	rr.Preference, off, err = unpackUint16(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Fqdn, off, err = UnpackDomainName(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	return rr, off, err
+}
+
+func unpackMB(h RR_Header, msg []byte, off int) (RR, int, error) {
+	rr := new(MB)
+	rr.Hdr = h
+	if noRdata(h) {
+		return rr, off, nil
+	}
+	var err error
+	rdStart := off
+	_ = rdStart
+
+	rr.Mb, off, err = UnpackDomainName(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	return rr, off, err
+}
+
+func unpackMD(h RR_Header, msg []byte, off int) (RR, int, error) {
+	rr := new(MD)
+	rr.Hdr = h
+	if noRdata(h) {
+		return rr, off, nil
+	}
+	var err error
+	rdStart := off
+	_ = rdStart
+
+	rr.Md, off, err = UnpackDomainName(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	return rr, off, err
+}
+
+func unpackMF(h RR_Header, msg []byte, off int) (RR, int, error) {
+	rr := new(MF)
+	rr.Hdr = h
+	if noRdata(h) {
+		return rr, off, nil
+	}
+	var err error
+	rdStart := off
+	_ = rdStart
+
+	rr.Mf, off, err = UnpackDomainName(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	return rr, off, err
+}
+
+func unpackMG(h RR_Header, msg []byte, off int) (RR, int, error) {
+	rr := new(MG)
+	rr.Hdr = h
+	if noRdata(h) {
+		return rr, off, nil
+	}
+	var err error
+	rdStart := off
+	_ = rdStart
+
+	rr.Mg, off, err = UnpackDomainName(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	return rr, off, err
+}
+
+func unpackMINFO(h RR_Header, msg []byte, off int) (RR, int, error) {
+	rr := new(MINFO)
+	rr.Hdr = h
+	if noRdata(h) {
+		return rr, off, nil
+	}
+	var err error
+	rdStart := off
+	_ = rdStart
+
+	rr.Rmail, off, err = UnpackDomainName(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Email, off, err = UnpackDomainName(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	return rr, off, err
+}
+
+func unpackMR(h RR_Header, msg []byte, off int) (RR, int, error) {
+	rr := new(MR)
+	rr.Hdr = h
+	if noRdata(h) {
+		return rr, off, nil
+	}
+	var err error
+	rdStart := off
+	_ = rdStart
+
+	rr.Mr, off, err = UnpackDomainName(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	return rr, off, err
+}
+
+func unpackMX(h RR_Header, msg []byte, off int) (RR, int, error) {
+	rr := new(MX)
+	rr.Hdr = h
+	if noRdata(h) {
+		return rr, off, nil
+	}
+	var err error
+	rdStart := off
+	_ = rdStart
+
+	rr.Preference, off, err = unpackUint16(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Mx, off, err = UnpackDomainName(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	return rr, off, err
+}
+
+func unpackNAPTR(h RR_Header, msg []byte, off int) (RR, int, error) {
+	rr := new(NAPTR)
+	rr.Hdr = h
+	if noRdata(h) {
+		return rr, off, nil
+	}
+	var err error
+	rdStart := off
+	_ = rdStart
+
+	rr.Order, off, err = unpackUint16(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Preference, off, err = unpackUint16(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Flags, off, err = unpackString(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Service, off, err = unpackString(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Regexp, off, err = unpackString(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Replacement, off, err = UnpackDomainName(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	return rr, off, err
+}
+
+func unpackNID(h RR_Header, msg []byte, off int) (RR, int, error) {
+	rr := new(NID)
+	rr.Hdr = h
+	if noRdata(h) {
+		return rr, off, nil
+	}
+	var err error
+	rdStart := off
+	_ = rdStart
+
+	rr.Preference, off, err = unpackUint16(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.NodeID, off, err = unpackUint64(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	return rr, off, err
+}
+
+func unpackNIMLOC(h RR_Header, msg []byte, off int) (RR, int, error) {
+	rr := new(NIMLOC)
+	rr.Hdr = h
+	if noRdata(h) {
+		return rr, off, nil
+	}
+	var err error
+	rdStart := off
+	_ = rdStart
+
+	rr.Locator, off, err = unpackStringHex(msg, off, rdStart+int(rr.Hdr.Rdlength))
+	if err != nil {
+		return rr, off, err
+	}
+	return rr, off, err
+}
+
+func unpackNINFO(h RR_Header, msg []byte, off int) (RR, int, error) {
+	rr := new(NINFO)
+	rr.Hdr = h
+	if noRdata(h) {
+		return rr, off, nil
+	}
+	var err error
+	rdStart := off
+	_ = rdStart
+
+	rr.ZSData, off, err = unpackStringTxt(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	return rr, off, err
+}
+
+func unpackNS(h RR_Header, msg []byte, off int) (RR, int, error) {
+	rr := new(NS)
+	rr.Hdr = h
+	if noRdata(h) {
+		return rr, off, nil
+	}
+	var err error
+	rdStart := off
+	_ = rdStart
+
+	rr.Ns, off, err = UnpackDomainName(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	return rr, off, err
+}
+
+func unpackNSAPPTR(h RR_Header, msg []byte, off int) (RR, int, error) {
+	rr := new(NSAPPTR)
+	rr.Hdr = h
+	if noRdata(h) {
+		return rr, off, nil
+	}
+	var err error
+	rdStart := off
+	_ = rdStart
+
+	rr.Ptr, off, err = UnpackDomainName(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	return rr, off, err
+}
+
+func unpackNSEC(h RR_Header, msg []byte, off int) (RR, int, error) {
+	rr := new(NSEC)
+	rr.Hdr = h
+	if noRdata(h) {
+		return rr, off, nil
+	}
+	var err error
+	rdStart := off
+	_ = rdStart
+
+	rr.NextDomain, off, err = UnpackDomainName(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.TypeBitMap, off, err = unpackDataNsec(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	return rr, off, err
+}
+
+func unpackNSEC3(h RR_Header, msg []byte, off int) (RR, int, error) {
+	rr := new(NSEC3)
+	rr.Hdr = h
+	if noRdata(h) {
+		return rr, off, nil
+	}
+	var err error
+	rdStart := off
+	_ = rdStart
+
+	rr.Hash, off, err = unpackUint8(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Flags, off, err = unpackUint8(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Iterations, off, err = unpackUint16(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.SaltLength, off, err = unpackUint8(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Salt, off, err = unpackStringHex(msg, off, off+int(rr.SaltLength))
+	if err != nil {
+		return rr, off, err
+	}
+	rr.HashLength, off, err = unpackUint8(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.NextDomain, off, err = unpackStringBase32(msg, off, off+int(rr.HashLength))
+	if err != nil {
+		return rr, off, err
+	}
+	rr.TypeBitMap, off, err = unpackDataNsec(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	return rr, off, err
+}
+
+func unpackNSEC3PARAM(h RR_Header, msg []byte, off int) (RR, int, error) {
+	rr := new(NSEC3PARAM)
+	rr.Hdr = h
+	if noRdata(h) {
+		return rr, off, nil
+	}
+	var err error
+	rdStart := off
+	_ = rdStart
+
+	rr.Hash, off, err = unpackUint8(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Flags, off, err = unpackUint8(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Iterations, off, err = unpackUint16(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.SaltLength, off, err = unpackUint8(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Salt, off, err = unpackStringHex(msg, off, off+int(rr.SaltLength))
+	if err != nil {
+		return rr, off, err
+	}
+	return rr, off, err
+}
+
+func unpackOPENPGPKEY(h RR_Header, msg []byte, off int) (RR, int, error) {
+	rr := new(OPENPGPKEY)
+	rr.Hdr = h
+	if noRdata(h) {
+		return rr, off, nil
+	}
+	var err error
+	rdStart := off
+	_ = rdStart
+
+	rr.PublicKey, off, err = unpackStringBase64(msg, off, rdStart+int(rr.Hdr.Rdlength))
+	if err != nil {
+		return rr, off, err
+	}
+	return rr, off, err
+}
+
+func unpackOPT(h RR_Header, msg []byte, off int) (RR, int, error) {
+	rr := new(OPT)
+	rr.Hdr = h
+	if noRdata(h) {
+		return rr, off, nil
+	}
+	var err error
+	rdStart := off
+	_ = rdStart
+
+	rr.Option, off, err = unpackDataOpt(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	return rr, off, err
+}
+
+func unpackPTR(h RR_Header, msg []byte, off int) (RR, int, error) {
+	rr := new(PTR)
+	rr.Hdr = h
+	if noRdata(h) {
+		return rr, off, nil
+	}
+	var err error
+	rdStart := off
+	_ = rdStart
+
+	rr.Ptr, off, err = UnpackDomainName(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	return rr, off, err
+}
+
+func unpackPX(h RR_Header, msg []byte, off int) (RR, int, error) {
+	rr := new(PX)
+	rr.Hdr = h
+	if noRdata(h) {
+		return rr, off, nil
+	}
+	var err error
+	rdStart := off
+	_ = rdStart
+
+	rr.Preference, off, err = unpackUint16(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Map822, off, err = UnpackDomainName(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Mapx400, off, err = UnpackDomainName(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	return rr, off, err
+}
+
+func unpackRFC3597(h RR_Header, msg []byte, off int) (RR, int, error) {
+	rr := new(RFC3597)
+	rr.Hdr = h
+	if noRdata(h) {
+		return rr, off, nil
+	}
+	var err error
+	rdStart := off
+	_ = rdStart
+
+	rr.Rdata, off, err = unpackStringHex(msg, off, rdStart+int(rr.Hdr.Rdlength))
+	if err != nil {
+		return rr, off, err
+	}
+	return rr, off, err
+}
+
+func unpackRKEY(h RR_Header, msg []byte, off int) (RR, int, error) {
+	rr := new(RKEY)
+	rr.Hdr = h
+	if noRdata(h) {
+		return rr, off, nil
+	}
+	var err error
+	rdStart := off
+	_ = rdStart
+
+	rr.Flags, off, err = unpackUint16(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Protocol, off, err = unpackUint8(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Algorithm, off, err = unpackUint8(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.PublicKey, off, err = unpackStringBase64(msg, off, rdStart+int(rr.Hdr.Rdlength))
+	if err != nil {
+		return rr, off, err
+	}
+	return rr, off, err
+}
+
+func unpackRP(h RR_Header, msg []byte, off int) (RR, int, error) {
+	rr := new(RP)
+	rr.Hdr = h
+	if noRdata(h) {
+		return rr, off, nil
+	}
+	var err error
+	rdStart := off
+	_ = rdStart
+
+	rr.Mbox, off, err = UnpackDomainName(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Txt, off, err = UnpackDomainName(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	return rr, off, err
+}
+
+func unpackRRSIG(h RR_Header, msg []byte, off int) (RR, int, error) {
+	rr := new(RRSIG)
+	rr.Hdr = h
+	if noRdata(h) {
+		return rr, off, nil
+	}
+	var err error
+	rdStart := off
+	_ = rdStart
+
+	rr.TypeCovered, off, err = unpackUint16(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Algorithm, off, err = unpackUint8(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Labels, off, err = unpackUint8(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.OrigTtl, off, err = unpackUint32(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Expiration, off, err = unpackUint32(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Inception, off, err = unpackUint32(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.KeyTag, off, err = unpackUint16(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.SignerName, off, err = UnpackDomainName(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Signature, off, err = unpackStringBase64(msg, off, rdStart+int(rr.Hdr.Rdlength))
+	if err != nil {
+		return rr, off, err
+	}
+	return rr, off, err
+}
+
+func unpackRT(h RR_Header, msg []byte, off int) (RR, int, error) {
+	rr := new(RT)
+	rr.Hdr = h
+	if noRdata(h) {
+		return rr, off, nil
+	}
+	var err error
+	rdStart := off
+	_ = rdStart
+
+	rr.Preference, off, err = unpackUint16(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Host, off, err = UnpackDomainName(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	return rr, off, err
+}
+
+func unpackSIG(h RR_Header, msg []byte, off int) (RR, int, error) {
+	rr := new(SIG)
+	rr.Hdr = h
+	if noRdata(h) {
+		return rr, off, nil
+	}
+	var err error
+	rdStart := off
+	_ = rdStart
+
+	rr.TypeCovered, off, err = unpackUint16(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Algorithm, off, err = unpackUint8(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Labels, off, err = unpackUint8(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.OrigTtl, off, err = unpackUint32(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Expiration, off, err = unpackUint32(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Inception, off, err = unpackUint32(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.KeyTag, off, err = unpackUint16(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.SignerName, off, err = UnpackDomainName(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Signature, off, err = unpackStringBase64(msg, off, rdStart+int(rr.Hdr.Rdlength))
+	if err != nil {
+		return rr, off, err
+	}
+	return rr, off, err
+}
+
+func unpackSMIMEA(h RR_Header, msg []byte, off int) (RR, int, error) {
+	rr := new(SMIMEA)
+	rr.Hdr = h
+	if noRdata(h) {
+		return rr, off, nil
+	}
+	var err error
+	rdStart := off
+	_ = rdStart
+
+	rr.Usage, off, err = unpackUint8(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Selector, off, err = unpackUint8(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.MatchingType, off, err = unpackUint8(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Certificate, off, err = unpackStringHex(msg, off, rdStart+int(rr.Hdr.Rdlength))
+	if err != nil {
+		return rr, off, err
+	}
+	return rr, off, err
+}
+
+func unpackSOA(h RR_Header, msg []byte, off int) (RR, int, error) {
+	rr := new(SOA)
+	rr.Hdr = h
+	if noRdata(h) {
+		return rr, off, nil
+	}
+	var err error
+	rdStart := off
+	_ = rdStart
+
+	rr.Ns, off, err = UnpackDomainName(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Mbox, off, err = UnpackDomainName(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Serial, off, err = unpackUint32(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Refresh, off, err = unpackUint32(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Retry, off, err = unpackUint32(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Expire, off, err = unpackUint32(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Minttl, off, err = unpackUint32(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	return rr, off, err
+}
+
+func unpackSPF(h RR_Header, msg []byte, off int) (RR, int, error) {
+	rr := new(SPF)
+	rr.Hdr = h
+	if noRdata(h) {
+		return rr, off, nil
+	}
+	var err error
+	rdStart := off
+	_ = rdStart
+
+	rr.Txt, off, err = unpackStringTxt(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	return rr, off, err
+}
+
+func unpackSRV(h RR_Header, msg []byte, off int) (RR, int, error) {
+	rr := new(SRV)
+	rr.Hdr = h
+	if noRdata(h) {
+		return rr, off, nil
+	}
+	var err error
+	rdStart := off
+	_ = rdStart
+
+	rr.Priority, off, err = unpackUint16(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Weight, off, err = unpackUint16(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Port, off, err = unpackUint16(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Target, off, err = UnpackDomainName(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	return rr, off, err
+}
+
+func unpackSSHFP(h RR_Header, msg []byte, off int) (RR, int, error) {
+	rr := new(SSHFP)
+	rr.Hdr = h
+	if noRdata(h) {
+		return rr, off, nil
+	}
+	var err error
+	rdStart := off
+	_ = rdStart
+
+	rr.Algorithm, off, err = unpackUint8(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Type, off, err = unpackUint8(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.FingerPrint, off, err = unpackStringHex(msg, off, rdStart+int(rr.Hdr.Rdlength))
+	if err != nil {
+		return rr, off, err
+	}
+	return rr, off, err
+}
+
+func unpackTA(h RR_Header, msg []byte, off int) (RR, int, error) {
+	rr := new(TA)
+	rr.Hdr = h
+	if noRdata(h) {
+		return rr, off, nil
+	}
+	var err error
+	rdStart := off
+	_ = rdStart
+
+	rr.KeyTag, off, err = unpackUint16(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Algorithm, off, err = unpackUint8(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.DigestType, off, err = unpackUint8(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Digest, off, err = unpackStringHex(msg, off, rdStart+int(rr.Hdr.Rdlength))
+	if err != nil {
+		return rr, off, err
+	}
+	return rr, off, err
+}
+
+func unpackTALINK(h RR_Header, msg []byte, off int) (RR, int, error) {
+	rr := new(TALINK)
+	rr.Hdr = h
+	if noRdata(h) {
+		return rr, off, nil
+	}
+	var err error
+	rdStart := off
+	_ = rdStart
+
+	rr.PreviousName, off, err = UnpackDomainName(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.NextName, off, err = UnpackDomainName(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	return rr, off, err
+}
+
+func unpackTKEY(h RR_Header, msg []byte, off int) (RR, int, error) {
+	rr := new(TKEY)
+	rr.Hdr = h
+	if noRdata(h) {
+		return rr, off, nil
+	}
+	var err error
+	rdStart := off
+	_ = rdStart
+
+	rr.Algorithm, off, err = UnpackDomainName(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Inception, off, err = unpackUint32(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Expiration, off, err = unpackUint32(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Mode, off, err = unpackUint16(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Error, off, err = unpackUint16(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.KeySize, off, err = unpackUint16(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Key, off, err = unpackString(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.OtherLen, off, err = unpackUint16(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.OtherData, off, err = unpackString(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	return rr, off, err
+}
+
+func unpackTLSA(h RR_Header, msg []byte, off int) (RR, int, error) {
+	rr := new(TLSA)
+	rr.Hdr = h
+	if noRdata(h) {
+		return rr, off, nil
+	}
+	var err error
+	rdStart := off
+	_ = rdStart
+
+	rr.Usage, off, err = unpackUint8(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Selector, off, err = unpackUint8(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.MatchingType, off, err = unpackUint8(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Certificate, off, err = unpackStringHex(msg, off, rdStart+int(rr.Hdr.Rdlength))
+	if err != nil {
+		return rr, off, err
+	}
+	return rr, off, err
+}
+
+func unpackTSIG(h RR_Header, msg []byte, off int) (RR, int, error) {
+	rr := new(TSIG)
+	rr.Hdr = h
+	if noRdata(h) {
+		return rr, off, nil
+	}
+	var err error
+	rdStart := off
+	_ = rdStart
+
+	rr.Algorithm, off, err = UnpackDomainName(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.TimeSigned, off, err = unpackUint48(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Fudge, off, err = unpackUint16(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.MACSize, off, err = unpackUint16(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.MAC, off, err = unpackStringHex(msg, off, off+int(rr.MACSize))
+	if err != nil {
+		return rr, off, err
+	}
+	rr.OrigId, off, err = unpackUint16(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Error, off, err = unpackUint16(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.OtherLen, off, err = unpackUint16(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.OtherData, off, err = unpackStringHex(msg, off, off+int(rr.OtherLen))
+	if err != nil {
+		return rr, off, err
+	}
+	return rr, off, err
+}
+
+func unpackTXT(h RR_Header, msg []byte, off int) (RR, int, error) {
+	rr := new(TXT)
+	rr.Hdr = h
+	if noRdata(h) {
+		return rr, off, nil
+	}
+	var err error
+	rdStart := off
+	_ = rdStart
+
+	rr.Txt, off, err = unpackStringTxt(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	return rr, off, err
+}
+
+func unpackUID(h RR_Header, msg []byte, off int) (RR, int, error) {
+	rr := new(UID)
+	rr.Hdr = h
+	if noRdata(h) {
+		return rr, off, nil
+	}
+	var err error
+	rdStart := off
+	_ = rdStart
+
+	rr.Uid, off, err = unpackUint32(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	return rr, off, err
+}
+
+func unpackUINFO(h RR_Header, msg []byte, off int) (RR, int, error) {
+	rr := new(UINFO)
+	rr.Hdr = h
+	if noRdata(h) {
+		return rr, off, nil
+	}
+	var err error
+	rdStart := off
+	_ = rdStart
+
+	rr.Uinfo, off, err = unpackString(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	return rr, off, err
+}
+
+func unpackURI(h RR_Header, msg []byte, off int) (RR, int, error) {
+	rr := new(URI)
+	rr.Hdr = h
+	if noRdata(h) {
+		return rr, off, nil
+	}
+	var err error
+	rdStart := off
+	_ = rdStart
+
+	rr.Priority, off, err = unpackUint16(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Weight, off, err = unpackUint16(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	if off == len(msg) {
+		return rr, off, nil
+	}
+	rr.Target, off, err = unpackStringOctet(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	return rr, off, err
+}
+
+func unpackX25(h RR_Header, msg []byte, off int) (RR, int, error) {
+	rr := new(X25)
+	rr.Hdr = h
+	if noRdata(h) {
+		return rr, off, nil
+	}
+	var err error
+	rdStart := off
+	_ = rdStart
+
+	rr.PSDNAddress, off, err = unpackString(msg, off)
+	if err != nil {
+		return rr, off, err
+	}
+	return rr, off, err
+}
+
+var typeToUnpack = map[uint16]func(RR_Header, []byte, int) (RR, int, error){
+	TypeA:          unpackA,
+	TypeAAAA:       unpackAAAA,
+	TypeAFSDB:      unpackAFSDB,
+	TypeANY:        unpackANY,
+	TypeCAA:        unpackCAA,
+	TypeCDNSKEY:    unpackCDNSKEY,
+	TypeCDS:        unpackCDS,
+	TypeCERT:       unpackCERT,
+	TypeCNAME:      unpackCNAME,
+	TypeDHCID:      unpackDHCID,
+	TypeDLV:        unpackDLV,
+	TypeDNAME:      unpackDNAME,
+	TypeDNSKEY:     unpackDNSKEY,
+	TypeDS:         unpackDS,
+	TypeEID:        unpackEID,
+	TypeEUI48:      unpackEUI48,
+	TypeEUI64:      unpackEUI64,
+	TypeGID:        unpackGID,
+	TypeGPOS:       unpackGPOS,
+	TypeHINFO:      unpackHINFO,
+	TypeHIP:        unpackHIP,
+	TypeKEY:        unpackKEY,
+	TypeKX:         unpackKX,
+	TypeL32:        unpackL32,
+	TypeL64:        unpackL64,
+	TypeLOC:        unpackLOC,
+	TypeLP:         unpackLP,
+	TypeMB:         unpackMB,
+	TypeMD:         unpackMD,
+	TypeMF:         unpackMF,
+	TypeMG:         unpackMG,
+	TypeMINFO:      unpackMINFO,
+	TypeMR:         unpackMR,
+	TypeMX:         unpackMX,
+	TypeNAPTR:      unpackNAPTR,
+	TypeNID:        unpackNID,
+	TypeNIMLOC:     unpackNIMLOC,
+	TypeNINFO:      unpackNINFO,
+	TypeNS:         unpackNS,
+	TypeNSAPPTR:    unpackNSAPPTR,
+	TypeNSEC:       unpackNSEC,
+	TypeNSEC3:      unpackNSEC3,
+	TypeNSEC3PARAM: unpackNSEC3PARAM,
+	TypeOPENPGPKEY: unpackOPENPGPKEY,
+	TypeOPT:        unpackOPT,
+	TypePTR:        unpackPTR,
+	TypePX:         unpackPX,
+	TypeRKEY:       unpackRKEY,
+	TypeRP:         unpackRP,
+	TypeRRSIG:      unpackRRSIG,
+	TypeRT:         unpackRT,
+	TypeSIG:        unpackSIG,
+	TypeSMIMEA:     unpackSMIMEA,
+	TypeSOA:        unpackSOA,
+	TypeSPF:        unpackSPF,
+	TypeSRV:        unpackSRV,
+	TypeSSHFP:      unpackSSHFP,
+	TypeTA:         unpackTA,
+	TypeTALINK:     unpackTALINK,
+	TypeTKEY:       unpackTKEY,
+	TypeTLSA:       unpackTLSA,
+	TypeTSIG:       unpackTSIG,
+	TypeTXT:        unpackTXT,
+	TypeUID:        unpackUID,
+	TypeUINFO:      unpackUINFO,
+	TypeURI:        unpackURI,
+	TypeX25:        unpackX25,
+}
diff --git a/vendor/github.com/miekg/dns/ztypes.go b/vendor/github.com/miekg/dns/ztypes.go
new file mode 100644
index 000000000..3c052773e
--- /dev/null
+++ b/vendor/github.com/miekg/dns/ztypes.go
@@ -0,0 +1,842 @@
+// *** DO NOT MODIFY ***
+// AUTOGENERATED BY go generate from type_generate.go
+
+package dns
+
+import (
+	"encoding/base64"
+	"net"
+)
+
+// TypeToRR is a map of constructors for each RR type.
+var TypeToRR = map[uint16]func() RR{
+	TypeA:          func() RR { return new(A) },
+	TypeAAAA:       func() RR { return new(AAAA) },
+	TypeAFSDB:      func() RR { return new(AFSDB) },
+	TypeANY:        func() RR { return new(ANY) },
+	TypeCAA:        func() RR { return new(CAA) },
+	TypeCDNSKEY:    func() RR { return new(CDNSKEY) },
+	TypeCDS:        func() RR { return new(CDS) },
+	TypeCERT:       func() RR { return new(CERT) },
+	TypeCNAME:      func() RR { return new(CNAME) },
+	TypeDHCID:      func() RR { return new(DHCID) },
+	TypeDLV:        func() RR { return new(DLV) },
+	TypeDNAME:      func() RR { return new(DNAME) },
+	TypeDNSKEY:     func() RR { return new(DNSKEY) },
+	TypeDS:         func() RR { return new(DS) },
+	TypeEID:        func() RR { return new(EID) },
+	TypeEUI48:      func() RR { return new(EUI48) },
+	TypeEUI64:      func() RR { return new(EUI64) },
+	TypeGID:        func() RR { return new(GID) },
+	TypeGPOS:       func() RR { return new(GPOS) },
+	TypeHINFO:      func() RR { return new(HINFO) },
+	TypeHIP:        func() RR { return new(HIP) },
+	TypeKEY:        func() RR { return new(KEY) },
+	TypeKX:         func() RR { return new(KX) },
+	TypeL32:        func() RR { return new(L32) },
+	TypeL64:        func() RR { return new(L64) },
+	TypeLOC:        func() RR { return new(LOC) },
+	TypeLP:         func() RR { return new(LP) },
+	TypeMB:         func() RR { return new(MB) },
+	TypeMD:         func() RR { return new(MD) },
+	TypeMF:         func() RR { return new(MF) },
+	TypeMG:         func() RR { return new(MG) },
+	TypeMINFO:      func() RR { return new(MINFO) },
+	TypeMR:         func() RR { return new(MR) },
+	TypeMX:         func() RR { return new(MX) },
+	TypeNAPTR:      func() RR { return new(NAPTR) },
+	TypeNID:        func() RR { return new(NID) },
+	TypeNIMLOC:     func() RR { return new(NIMLOC) },
+	TypeNINFO:      func() RR { return new(NINFO) },
+	TypeNS:         func() RR { return new(NS) },
+	TypeNSAPPTR:    func() RR { return new(NSAPPTR) },
+	TypeNSEC:       func() RR { return new(NSEC) },
+	TypeNSEC3:      func() RR { return new(NSEC3) },
+	TypeNSEC3PARAM: func() RR { return new(NSEC3PARAM) },
+	TypeOPENPGPKEY: func() RR { return new(OPENPGPKEY) },
+	TypeOPT:        func() RR { return new(OPT) },
+	TypePTR:        func() RR { return new(PTR) },
+	TypePX:         func() RR { return new(PX) },
+	TypeRKEY:       func() RR { return new(RKEY) },
+	TypeRP:         func() RR { return new(RP) },
+	TypeRRSIG:      func() RR { return new(RRSIG) },
+	TypeRT:         func() RR { return new(RT) },
+	TypeSIG:        func() RR { return new(SIG) },
+	TypeSMIMEA:     func() RR { return new(SMIMEA) },
+	TypeSOA:        func() RR { return new(SOA) },
+	TypeSPF:        func() RR { return new(SPF) },
+	TypeSRV:        func() RR { return new(SRV) },
+	TypeSSHFP:      func() RR { return new(SSHFP) },
+	TypeTA:         func() RR { return new(TA) },
+	TypeTALINK:     func() RR { return new(TALINK) },
+	TypeTKEY:       func() RR { return new(TKEY) },
+	TypeTLSA:       func() RR { return new(TLSA) },
+	TypeTSIG:       func() RR { return new(TSIG) },
+	TypeTXT:        func() RR { return new(TXT) },
+	TypeUID:        func() RR { return new(UID) },
+	TypeUINFO:      func() RR { return new(UINFO) },
+	TypeURI:        func() RR { return new(URI) },
+	TypeX25:        func() RR { return new(X25) },
+}
+
+// TypeToString is a map of strings for each RR type.
+var TypeToString = map[uint16]string{
+	TypeA:          "A",
+	TypeAAAA:       "AAAA",
+	TypeAFSDB:      "AFSDB",
+	TypeANY:        "ANY",
+	TypeATMA:       "ATMA",
+	TypeAXFR:       "AXFR",
+	TypeCAA:        "CAA",
+	TypeCDNSKEY:    "CDNSKEY",
+	TypeCDS:        "CDS",
+	TypeCERT:       "CERT",
+	TypeCNAME:      "CNAME",
+	TypeDHCID:      "DHCID",
+	TypeDLV:        "DLV",
+	TypeDNAME:      "DNAME",
+	TypeDNSKEY:     "DNSKEY",
+	TypeDS:         "DS",
+	TypeEID:        "EID",
+	TypeEUI48:      "EUI48",
+	TypeEUI64:      "EUI64",
+	TypeGID:        "GID",
+	TypeGPOS:       "GPOS",
+	TypeHINFO:      "HINFO",
+	TypeHIP:        "HIP",
+	TypeISDN:       "ISDN",
+	TypeIXFR:       "IXFR",
+	TypeKEY:        "KEY",
+	TypeKX:         "KX",
+	TypeL32:        "L32",
+	TypeL64:        "L64",
+	TypeLOC:        "LOC",
+	TypeLP:         "LP",
+	TypeMAILA:      "MAILA",
+	TypeMAILB:      "MAILB",
+	TypeMB:         "MB",
+	TypeMD:         "MD",
+	TypeMF:         "MF",
+	TypeMG:         "MG",
+	TypeMINFO:      "MINFO",
+	TypeMR:         "MR",
+	TypeMX:         "MX",
+	TypeNAPTR:      "NAPTR",
+	TypeNID:        "NID",
+	TypeNIMLOC:     "NIMLOC",
+	TypeNINFO:      "NINFO",
+	TypeNS:         "NS",
+	TypeNSEC:       "NSEC",
+	TypeNSEC3:      "NSEC3",
+	TypeNSEC3PARAM: "NSEC3PARAM",
+	TypeNULL:       "NULL",
+	TypeNXT:        "NXT",
+	TypeNone:       "None",
+	TypeOPENPGPKEY: "OPENPGPKEY",
+	TypeOPT:        "OPT",
+	TypePTR:        "PTR",
+	TypePX:         "PX",
+	TypeRKEY:       "RKEY",
+	TypeRP:         "RP",
+	TypeRRSIG:      "RRSIG",
+	TypeRT:         "RT",
+	TypeReserved:   "Reserved",
+	TypeSIG:        "SIG",
+	TypeSMIMEA:     "SMIMEA",
+	TypeSOA:        "SOA",
+	TypeSPF:        "SPF",
+	TypeSRV:        "SRV",
+	TypeSSHFP:      "SSHFP",
+	TypeTA:         "TA",
+	TypeTALINK:     "TALINK",
+	TypeTKEY:       "TKEY",
+	TypeTLSA:       "TLSA",
+	TypeTSIG:       "TSIG",
+	TypeTXT:        "TXT",
+	TypeUID:        "UID",
+	TypeUINFO:      "UINFO",
+	TypeUNSPEC:     "UNSPEC",
+	TypeURI:        "URI",
+	TypeX25:        "X25",
+	TypeNSAPPTR:    "NSAP-PTR",
+}
+
+// Header() functions
+func (rr *A) Header() *RR_Header          { return &rr.Hdr }
+func (rr *AAAA) Header() *RR_Header       { return &rr.Hdr }
+func (rr *AFSDB) Header() *RR_Header      { return &rr.Hdr }
+func (rr *ANY) Header() *RR_Header        { return &rr.Hdr }
+func (rr *CAA) Header() *RR_Header        { return &rr.Hdr }
+func (rr *CDNSKEY) Header() *RR_Header    { return &rr.Hdr }
+func (rr *CDS) Header() *RR_Header        { return &rr.Hdr }
+func (rr *CERT) Header() *RR_Header       { return &rr.Hdr }
+func (rr *CNAME) Header() *RR_Header      { return &rr.Hdr }
+func (rr *DHCID) Header() *RR_Header      { return &rr.Hdr }
+func (rr *DLV) Header() *RR_Header        { return &rr.Hdr }
+func (rr *DNAME) Header() *RR_Header      { return &rr.Hdr }
+func (rr *DNSKEY) Header() *RR_Header     { return &rr.Hdr }
+func (rr *DS) Header() *RR_Header         { return &rr.Hdr }
+func (rr *EID) Header() *RR_Header        { return &rr.Hdr }
+func (rr *EUI48) Header() *RR_Header      { return &rr.Hdr }
+func (rr *EUI64) Header() *RR_Header      { return &rr.Hdr }
+func (rr *GID) Header() *RR_Header        { return &rr.Hdr }
+func (rr *GPOS) Header() *RR_Header       { return &rr.Hdr }
+func (rr *HINFO) Header() *RR_Header      { return &rr.Hdr }
+func (rr *HIP) Header() *RR_Header        { return &rr.Hdr }
+func (rr *KEY) Header() *RR_Header        { return &rr.Hdr }
+func (rr *KX) Header() *RR_Header         { return &rr.Hdr }
+func (rr *L32) Header() *RR_Header        { return &rr.Hdr }
+func (rr *L64) Header() *RR_Header        { return &rr.Hdr }
+func (rr *LOC) Header() *RR_Header        { return &rr.Hdr }
+func (rr *LP) Header() *RR_Header         { return &rr.Hdr }
+func (rr *MB) Header() *RR_Header         { return &rr.Hdr }
+func (rr *MD) Header() *RR_Header         { return &rr.Hdr }
+func (rr *MF) Header() *RR_Header         { return &rr.Hdr }
+func (rr *MG) Header() *RR_Header         { return &rr.Hdr }
+func (rr *MINFO) Header() *RR_Header      { return &rr.Hdr }
+func (rr *MR) Header() *RR_Header         { return &rr.Hdr }
+func (rr *MX) Header() *RR_Header         { return &rr.Hdr }
+func (rr *NAPTR) Header() *RR_Header      { return &rr.Hdr }
+func (rr *NID) Header() *RR_Header        { return &rr.Hdr }
+func (rr *NIMLOC) Header() *RR_Header     { return &rr.Hdr }
+func (rr *NINFO) Header() *RR_Header      { return &rr.Hdr }
+func (rr *NS) Header() *RR_Header         { return &rr.Hdr }
+func (rr *NSAPPTR) Header() *RR_Header    { return &rr.Hdr }
+func (rr *NSEC) Header() *RR_Header       { return &rr.Hdr }
+func (rr *NSEC3) Header() *RR_Header      { return &rr.Hdr }
+func (rr *NSEC3PARAM) Header() *RR_Header { return &rr.Hdr }
+func (rr *OPENPGPKEY) Header() *RR_Header { return &rr.Hdr }
+func (rr *OPT) Header() *RR_Header        { return &rr.Hdr }
+func (rr *PTR) Header() *RR_Header        { return &rr.Hdr }
+func (rr *PX) Header() *RR_Header         { return &rr.Hdr }
+func (rr *RFC3597) Header() *RR_Header    { return &rr.Hdr }
+func (rr *RKEY) Header() *RR_Header       { return &rr.Hdr }
+func (rr *RP) Header() *RR_Header         { return &rr.Hdr }
+func (rr *RRSIG) Header() *RR_Header      { return &rr.Hdr }
+func (rr *RT) Header() *RR_Header         { return &rr.Hdr }
+func (rr *SIG) Header() *RR_Header        { return &rr.Hdr }
+func (rr *SMIMEA) Header() *RR_Header     { return &rr.Hdr }
+func (rr *SOA) Header() *RR_Header        { return &rr.Hdr }
+func (rr *SPF) Header() *RR_Header        { return &rr.Hdr }
+func (rr *SRV) Header() *RR_Header        { return &rr.Hdr }
+func (rr *SSHFP) Header() *RR_Header      { return &rr.Hdr }
+func (rr *TA) Header() *RR_Header         { return &rr.Hdr }
+func (rr *TALINK) Header() *RR_Header     { return &rr.Hdr }
+func (rr *TKEY) Header() *RR_Header       { return &rr.Hdr }
+func (rr *TLSA) Header() *RR_Header       { return &rr.Hdr }
+func (rr *TSIG) Header() *RR_Header       { return &rr.Hdr }
+func (rr *TXT) Header() *RR_Header        { return &rr.Hdr }
+func (rr *UID) Header() *RR_Header        { return &rr.Hdr }
+func (rr *UINFO) Header() *RR_Header      { return &rr.Hdr }
+func (rr *URI) Header() *RR_Header        { return &rr.Hdr }
+func (rr *X25) Header() *RR_Header        { return &rr.Hdr }
+
+// len() functions
+func (rr *A) len() int {
+	l := rr.Hdr.len()
+	l += net.IPv4len // A
+	return l
+}
+func (rr *AAAA) len() int {
+	l := rr.Hdr.len()
+	l += net.IPv6len // AAAA
+	return l
+}
+func (rr *AFSDB) len() int {
+	l := rr.Hdr.len()
+	l += 2 // Subtype
+	l += len(rr.Hostname) + 1
+	return l
+}
+func (rr *ANY) len() int {
+	l := rr.Hdr.len()
+	return l
+}
+func (rr *CAA) len() int {
+	l := rr.Hdr.len()
+	l += 1 // Flag
+	l += len(rr.Tag) + 1
+	l += len(rr.Value)
+	return l
+}
+func (rr *CERT) len() int {
+	l := rr.Hdr.len()
+	l += 2 // Type
+	l += 2 // KeyTag
+	l += 1 // Algorithm
+	l += base64.StdEncoding.DecodedLen(len(rr.Certificate))
+	return l
+}
+func (rr *CNAME) len() int {
+	l := rr.Hdr.len()
+	l += len(rr.Target) + 1
+	return l
+}
+func (rr *DHCID) len() int {
+	l := rr.Hdr.len()
+	l += base64.StdEncoding.DecodedLen(len(rr.Digest))
+	return l
+}
+func (rr *DNAME) len() int {
+	l := rr.Hdr.len()
+	l += len(rr.Target) + 1
+	return l
+}
+func (rr *DNSKEY) len() int {
+	l := rr.Hdr.len()
+	l += 2 // Flags
+	l += 1 // Protocol
+	l += 1 // Algorithm
+	l += base64.StdEncoding.DecodedLen(len(rr.PublicKey))
+	return l
+}
+func (rr *DS) len() int {
+	l := rr.Hdr.len()
+	l += 2 // KeyTag
+	l += 1 // Algorithm
+	l += 1 // DigestType
+	l += len(rr.Digest)/2 + 1
+	return l
+}
+func (rr *EID) len() int {
+	l := rr.Hdr.len()
+	l += len(rr.Endpoint)/2 + 1
+	return l
+}
+func (rr *EUI48) len() int {
+	l := rr.Hdr.len()
+	l += 6 // Address
+	return l
+}
+func (rr *EUI64) len() int {
+	l := rr.Hdr.len()
+	l += 8 // Address
+	return l
+}
+func (rr *GID) len() int {
+	l := rr.Hdr.len()
+	l += 4 // Gid
+	return l
+}
+func (rr *GPOS) len() int {
+	l := rr.Hdr.len()
+	l += len(rr.Longitude) + 1
+	l += len(rr.Latitude) + 1
+	l += len(rr.Altitude) + 1
+	return l
+}
+func (rr *HINFO) len() int {
+	l := rr.Hdr.len()
+	l += len(rr.Cpu) + 1
+	l += len(rr.Os) + 1
+	return l
+}
+func (rr *HIP) len() int {
+	l := rr.Hdr.len()
+	l += 1 // HitLength
+	l += 1 // PublicKeyAlgorithm
+	l += 2 // PublicKeyLength
+	l += len(rr.Hit)/2 + 1
+	l += base64.StdEncoding.DecodedLen(len(rr.PublicKey))
+	for _, x := range rr.RendezvousServers {
+		l += len(x) + 1
+	}
+	return l
+}
+func (rr *KX) len() int {
+	l := rr.Hdr.len()
+	l += 2 // Preference
+	l += len(rr.Exchanger) + 1
+	return l
+}
+func (rr *L32) len() int {
+	l := rr.Hdr.len()
+	l += 2           // Preference
+	l += net.IPv4len // Locator32
+	return l
+}
+func (rr *L64) len() int {
+	l := rr.Hdr.len()
+	l += 2 // Preference
+	l += 8 // Locator64
+	return l
+}
+func (rr *LOC) len() int {
+	l := rr.Hdr.len()
+	l += 1 // Version
+	l += 1 // Size
+	l += 1 // HorizPre
+	l += 1 // VertPre
+	l += 4 // Latitude
+	l += 4 // Longitude
+	l += 4 // Altitude
+	return l
+}
+func (rr *LP) len() int {
+	l := rr.Hdr.len()
+	l += 2 // Preference
+	l += len(rr.Fqdn) + 1
+	return l
+}
+func (rr *MB) len() int {
+	l := rr.Hdr.len()
+	l += len(rr.Mb) + 1
+	return l
+}
+func (rr *MD) len() int {
+	l := rr.Hdr.len()
+	l += len(rr.Md) + 1
+	return l
+}
+func (rr *MF) len() int {
+	l := rr.Hdr.len()
+	l += len(rr.Mf) + 1
+	return l
+}
+func (rr *MG) len() int {
+	l := rr.Hdr.len()
+	l += len(rr.Mg) + 1
+	return l
+}
+func (rr *MINFO) len() int {
+	l := rr.Hdr.len()
+	l += len(rr.Rmail) + 1
+	l += len(rr.Email) + 1
+	return l
+}
+func (rr *MR) len() int {
+	l := rr.Hdr.len()
+	l += len(rr.Mr) + 1
+	return l
+}
+func (rr *MX) len() int {
+	l := rr.Hdr.len()
+	l += 2 // Preference
+	l += len(rr.Mx) + 1
+	return l
+}
+func (rr *NAPTR) len() int {
+	l := rr.Hdr.len()
+	l += 2 // Order
+	l += 2 // Preference
+	l += len(rr.Flags) + 1
+	l += len(rr.Service) + 1
+	l += len(rr.Regexp) + 1
+	l += len(rr.Replacement) + 1
+	return l
+}
+func (rr *NID) len() int {
+	l := rr.Hdr.len()
+	l += 2 // Preference
+	l += 8 // NodeID
+	return l
+}
+func (rr *NIMLOC) len() int {
+	l := rr.Hdr.len()
+	l += len(rr.Locator)/2 + 1
+	return l
+}
+func (rr *NINFO) len() int {
+	l := rr.Hdr.len()
+	for _, x := range rr.ZSData {
+		l += len(x) + 1
+	}
+	return l
+}
+func (rr *NS) len() int {
+	l := rr.Hdr.len()
+	l += len(rr.Ns) + 1
+	return l
+}
+func (rr *NSAPPTR) len() int {
+	l := rr.Hdr.len()
+	l += len(rr.Ptr) + 1
+	return l
+}
+func (rr *NSEC3PARAM) len() int {
+	l := rr.Hdr.len()
+	l += 1 // Hash
+	l += 1 // Flags
+	l += 2 // Iterations
+	l += 1 // SaltLength
+	l += len(rr.Salt)/2 + 1
+	return l
+}
+func (rr *OPENPGPKEY) len() int {
+	l := rr.Hdr.len()
+	l += base64.StdEncoding.DecodedLen(len(rr.PublicKey))
+	return l
+}
+func (rr *PTR) len() int {
+	l := rr.Hdr.len()
+	l += len(rr.Ptr) + 1
+	return l
+}
+func (rr *PX) len() int {
+	l := rr.Hdr.len()
+	l += 2 // Preference
+	l += len(rr.Map822) + 1
+	l += len(rr.Mapx400) + 1
+	return l
+}
+func (rr *RFC3597) len() int {
+	l := rr.Hdr.len()
+	l += len(rr.Rdata)/2 + 1
+	return l
+}
+func (rr *RKEY) len() int {
+	l := rr.Hdr.len()
+	l += 2 // Flags
+	l += 1 // Protocol
+	l += 1 // Algorithm
+	l += base64.StdEncoding.DecodedLen(len(rr.PublicKey))
+	return l
+}
+func (rr *RP) len() int {
+	l := rr.Hdr.len()
+	l += len(rr.Mbox) + 1
+	l += len(rr.Txt) + 1
+	return l
+}
+func (rr *RRSIG) len() int {
+	l := rr.Hdr.len()
+	l += 2 // TypeCovered
+	l += 1 // Algorithm
+	l += 1 // Labels
+	l += 4 // OrigTtl
+	l += 4 // Expiration
+	l += 4 // Inception
+	l += 2 // KeyTag
+	l += len(rr.SignerName) + 1
+	l += base64.StdEncoding.DecodedLen(len(rr.Signature))
+	return l
+}
+func (rr *RT) len() int {
+	l := rr.Hdr.len()
+	l += 2 // Preference
+	l += len(rr.Host) + 1
+	return l
+}
+func (rr *SMIMEA) len() int {
+	l := rr.Hdr.len()
+	l += 1 // Usage
+	l += 1 // Selector
+	l += 1 // MatchingType
+	l += len(rr.Certificate)/2 + 1
+	return l
+}
+func (rr *SOA) len() int {
+	l := rr.Hdr.len()
+	l += len(rr.Ns) + 1
+	l += len(rr.Mbox) + 1
+	l += 4 // Serial
+	l += 4 // Refresh
+	l += 4 // Retry
+	l += 4 // Expire
+	l += 4 // Minttl
+	return l
+}
+func (rr *SPF) len() int {
+	l := rr.Hdr.len()
+	for _, x := range rr.Txt {
+		l += len(x) + 1
+	}
+	return l
+}
+func (rr *SRV) len() int {
+	l := rr.Hdr.len()
+	l += 2 // Priority
+	l += 2 // Weight
+	l += 2 // Port
+	l += len(rr.Target) + 1
+	return l
+}
+func (rr *SSHFP) len() int {
+	l := rr.Hdr.len()
+	l += 1 // Algorithm
+	l += 1 // Type
+	l += len(rr.FingerPrint)/2 + 1
+	return l
+}
+func (rr *TA) len() int {
+	l := rr.Hdr.len()
+	l += 2 // KeyTag
+	l += 1 // Algorithm
+	l += 1 // DigestType
+	l += len(rr.Digest)/2 + 1
+	return l
+}
+func (rr *TALINK) len() int {
+	l := rr.Hdr.len()
+	l += len(rr.PreviousName) + 1
+	l += len(rr.NextName) + 1
+	return l
+}
+func (rr *TKEY) len() int {
+	l := rr.Hdr.len()
+	l += len(rr.Algorithm) + 1
+	l += 4 // Inception
+	l += 4 // Expiration
+	l += 2 // Mode
+	l += 2 // Error
+	l += 2 // KeySize
+	l += len(rr.Key) + 1
+	l += 2 // OtherLen
+	l += len(rr.OtherData) + 1
+	return l
+}
+func (rr *TLSA) len() int {
+	l := rr.Hdr.len()
+	l += 1 // Usage
+	l += 1 // Selector
+	l += 1 // MatchingType
+	l += len(rr.Certificate)/2 + 1
+	return l
+}
+func (rr *TSIG) len() int {
+	l := rr.Hdr.len()
+	l += len(rr.Algorithm) + 1
+	l += 6 // TimeSigned
+	l += 2 // Fudge
+	l += 2 // MACSize
+	l += len(rr.MAC)/2 + 1
+	l += 2 // OrigId
+	l += 2 // Error
+	l += 2 // OtherLen
+	l += len(rr.OtherData)/2 + 1
+	return l
+}
+func (rr *TXT) len() int {
+	l := rr.Hdr.len()
+	for _, x := range rr.Txt {
+		l += len(x) + 1
+	}
+	return l
+}
+func (rr *UID) len() int {
+	l := rr.Hdr.len()
+	l += 4 // Uid
+	return l
+}
+func (rr *UINFO) len() int {
+	l := rr.Hdr.len()
+	l += len(rr.Uinfo) + 1
+	return l
+}
+func (rr *URI) len() int {
+	l := rr.Hdr.len()
+	l += 2 // Priority
+	l += 2 // Weight
+	l += len(rr.Target)
+	return l
+}
+func (rr *X25) len() int {
+	l := rr.Hdr.len()
+	l += len(rr.PSDNAddress) + 1
+	return l
+}
+
+// copy() functions
+func (rr *A) copy() RR {
+	return &A{*rr.Hdr.copyHeader(), copyIP(rr.A)}
+}
+func (rr *AAAA) copy() RR {
+	return &AAAA{*rr.Hdr.copyHeader(), copyIP(rr.AAAA)}
+}
+func (rr *AFSDB) copy() RR {
+	return &AFSDB{*rr.Hdr.copyHeader(), rr.Subtype, rr.Hostname}
+}
+func (rr *ANY) copy() RR {
+	return &ANY{*rr.Hdr.copyHeader()}
+}
+func (rr *CAA) copy() RR {
+	return &CAA{*rr.Hdr.copyHeader(), rr.Flag, rr.Tag, rr.Value}
+}
+func (rr *CERT) copy() RR {
+	return &CERT{*rr.Hdr.copyHeader(), rr.Type, rr.KeyTag, rr.Algorithm, rr.Certificate}
+}
+func (rr *CNAME) copy() RR {
+	return &CNAME{*rr.Hdr.copyHeader(), rr.Target}
+}
+func (rr *DHCID) copy() RR {
+	return &DHCID{*rr.Hdr.copyHeader(), rr.Digest}
+}
+func (rr *DNAME) copy() RR {
+	return &DNAME{*rr.Hdr.copyHeader(), rr.Target}
+}
+func (rr *DNSKEY) copy() RR {
+	return &DNSKEY{*rr.Hdr.copyHeader(), rr.Flags, rr.Protocol, rr.Algorithm, rr.PublicKey}
+}
+func (rr *DS) copy() RR {
+	return &DS{*rr.Hdr.copyHeader(), rr.KeyTag, rr.Algorithm, rr.DigestType, rr.Digest}
+}
+func (rr *EID) copy() RR {
+	return &EID{*rr.Hdr.copyHeader(), rr.Endpoint}
+}
+func (rr *EUI48) copy() RR {
+	return &EUI48{*rr.Hdr.copyHeader(), rr.Address}
+}
+func (rr *EUI64) copy() RR {
+	return &EUI64{*rr.Hdr.copyHeader(), rr.Address}
+}
+func (rr *GID) copy() RR {
+	return &GID{*rr.Hdr.copyHeader(), rr.Gid}
+}
+func (rr *GPOS) copy() RR {
+	return &GPOS{*rr.Hdr.copyHeader(), rr.Longitude, rr.Latitude, rr.Altitude}
+}
+func (rr *HINFO) copy() RR {
+	return &HINFO{*rr.Hdr.copyHeader(), rr.Cpu, rr.Os}
+}
+func (rr *HIP) copy() RR {
+	RendezvousServers := make([]string, len(rr.RendezvousServers))
+	copy(RendezvousServers, rr.RendezvousServers)
+	return &HIP{*rr.Hdr.copyHeader(), rr.HitLength, rr.PublicKeyAlgorithm, rr.PublicKeyLength, rr.Hit, rr.PublicKey, RendezvousServers}
+}
+func (rr *KX) copy() RR {
+	return &KX{*rr.Hdr.copyHeader(), rr.Preference, rr.Exchanger}
+}
+func (rr *L32) copy() RR {
+	return &L32{*rr.Hdr.copyHeader(), rr.Preference, copyIP(rr.Locator32)}
+}
+func (rr *L64) copy() RR {
+	return &L64{*rr.Hdr.copyHeader(), rr.Preference, rr.Locator64}
+}
+func (rr *LOC) copy() RR {
+	return &LOC{*rr.Hdr.copyHeader(), rr.Version, rr.Size, rr.HorizPre, rr.VertPre, rr.Latitude, rr.Longitude, rr.Altitude}
+}
+func (rr *LP) copy() RR {
+	return &LP{*rr.Hdr.copyHeader(), rr.Preference, rr.Fqdn}
+}
+func (rr *MB) copy() RR {
+	return &MB{*rr.Hdr.copyHeader(), rr.Mb}
+}
+func (rr *MD) copy() RR {
+	return &MD{*rr.Hdr.copyHeader(), rr.Md}
+}
+func (rr *MF) copy() RR {
+	return &MF{*rr.Hdr.copyHeader(), rr.Mf}
+}
+func (rr *MG) copy() RR {
+	return &MG{*rr.Hdr.copyHeader(), rr.Mg}
+}
+func (rr *MINFO) copy() RR {
+	return &MINFO{*rr.Hdr.copyHeader(), rr.Rmail, rr.Email}
+}
+func (rr *MR) copy() RR {
+	return &MR{*rr.Hdr.copyHeader(), rr.Mr}
+}
+func (rr *MX) copy() RR {
+	return &MX{*rr.Hdr.copyHeader(), rr.Preference, rr.Mx}
+}
+func (rr *NAPTR) copy() RR {
+	return &NAPTR{*rr.Hdr.copyHeader(), rr.Order, rr.Preference, rr.Flags, rr.Service, rr.Regexp, rr.Replacement}
+}
+func (rr *NID) copy() RR {
+	return &NID{*rr.Hdr.copyHeader(), rr.Preference, rr.NodeID}
+}
+func (rr *NIMLOC) copy() RR {
+	return &NIMLOC{*rr.Hdr.copyHeader(), rr.Locator}
+}
+func (rr *NINFO) copy() RR {
+	ZSData := make([]string, len(rr.ZSData))
+	copy(ZSData, rr.ZSData)
+	return &NINFO{*rr.Hdr.copyHeader(), ZSData}
+}
+func (rr *NS) copy() RR {
+	return &NS{*rr.Hdr.copyHeader(), rr.Ns}
+}
+func (rr *NSAPPTR) copy() RR {
+	return &NSAPPTR{*rr.Hdr.copyHeader(), rr.Ptr}
+}
+func (rr *NSEC) copy() RR {
+	TypeBitMap := make([]uint16, len(rr.TypeBitMap))
+	copy(TypeBitMap, rr.TypeBitMap)
+	return &NSEC{*rr.Hdr.copyHeader(), rr.NextDomain, TypeBitMap}
+}
+func (rr *NSEC3) copy() RR {
+	TypeBitMap := make([]uint16, len(rr.TypeBitMap))
+	copy(TypeBitMap, rr.TypeBitMap)
+	return &NSEC3{*rr.Hdr.copyHeader(), rr.Hash, rr.Flags, rr.Iterations, rr.SaltLength, rr.Salt, rr.HashLength, rr.NextDomain, TypeBitMap}
+}
+func (rr *NSEC3PARAM) copy() RR {
+	return &NSEC3PARAM{*rr.Hdr.copyHeader(), rr.Hash, rr.Flags, rr.Iterations, rr.SaltLength, rr.Salt}
+}
+func (rr *OPENPGPKEY) copy() RR {
+	return &OPENPGPKEY{*rr.Hdr.copyHeader(), rr.PublicKey}
+}
+func (rr *OPT) copy() RR {
+	Option := make([]EDNS0, len(rr.Option))
+	copy(Option, rr.Option)
+	return &OPT{*rr.Hdr.copyHeader(), Option}
+}
+func (rr *PTR) copy() RR {
+	return &PTR{*rr.Hdr.copyHeader(), rr.Ptr}
+}
+func (rr *PX) copy() RR {
+	return &PX{*rr.Hdr.copyHeader(), rr.Preference, rr.Map822, rr.Mapx400}
+}
+func (rr *RFC3597) copy() RR {
+	return &RFC3597{*rr.Hdr.copyHeader(), rr.Rdata}
+}
+func (rr *RKEY) copy() RR {
+	return &RKEY{*rr.Hdr.copyHeader(), rr.Flags, rr.Protocol, rr.Algorithm, rr.PublicKey}
+}
+func (rr *RP) copy() RR {
+	return &RP{*rr.Hdr.copyHeader(), rr.Mbox, rr.Txt}
+}
+func (rr *RRSIG) copy() RR {
+	return &RRSIG{*rr.Hdr.copyHeader(), rr.TypeCovered, rr.Algorithm, rr.Labels, rr.OrigTtl, rr.Expiration, rr.Inception, rr.KeyTag, rr.SignerName, rr.Signature}
+}
+func (rr *RT) copy() RR {
+	return &RT{*rr.Hdr.copyHeader(), rr.Preference, rr.Host}
+}
+func (rr *SMIMEA) copy() RR {
+	return &SMIMEA{*rr.Hdr.copyHeader(), rr.Usage, rr.Selector, rr.MatchingType, rr.Certificate}
+}
+func (rr *SOA) copy() RR {
+	return &SOA{*rr.Hdr.copyHeader(), rr.Ns, rr.Mbox, rr.Serial, rr.Refresh, rr.Retry, rr.Expire, rr.Minttl}
+}
+func (rr *SPF) copy() RR {
+	Txt := make([]string, len(rr.Txt))
+	copy(Txt, rr.Txt)
+	return &SPF{*rr.Hdr.copyHeader(), Txt}
+}
+func (rr *SRV) copy() RR {
+	return &SRV{*rr.Hdr.copyHeader(), rr.Priority, rr.Weight, rr.Port, rr.Target}
+}
+func (rr *SSHFP) copy() RR {
+	return &SSHFP{*rr.Hdr.copyHeader(), rr.Algorithm, rr.Type, rr.FingerPrint}
+}
+func (rr *TA) copy() RR {
+	return &TA{*rr.Hdr.copyHeader(), rr.KeyTag, rr.Algorithm, rr.DigestType, rr.Digest}
+}
+func (rr *TALINK) copy() RR {
+	return &TALINK{*rr.Hdr.copyHeader(), rr.PreviousName, rr.NextName}
+}
+func (rr *TKEY) copy() RR {
+	return &TKEY{*rr.Hdr.copyHeader(), rr.Algorithm, rr.Inception, rr.Expiration, rr.Mode, rr.Error, rr.KeySize, rr.Key, rr.OtherLen, rr.OtherData}
+}
+func (rr *TLSA) copy() RR {
+	return &TLSA{*rr.Hdr.copyHeader(), rr.Usage, rr.Selector, rr.MatchingType, rr.Certificate}
+}
+func (rr *TSIG) copy() RR {
+	return &TSIG{*rr.Hdr.copyHeader(), rr.Algorithm, rr.TimeSigned, rr.Fudge, rr.MACSize, rr.MAC, rr.OrigId, rr.Error, rr.OtherLen, rr.OtherData}
+}
+func (rr *TXT) copy() RR {
+	Txt := make([]string, len(rr.Txt))
+	copy(Txt, rr.Txt)
+	return &TXT{*rr.Hdr.copyHeader(), Txt}
+}
+func (rr *UID) copy() RR {
+	return &UID{*rr.Hdr.copyHeader(), rr.Uid}
+}
+func (rr *UINFO) copy() RR {
+	return &UINFO{*rr.Hdr.copyHeader(), rr.Uinfo}
+}
+func (rr *URI) copy() RR {
+	return &URI{*rr.Hdr.copyHeader(), rr.Priority, rr.Weight, rr.Target}
+}
+func (rr *X25) copy() RR {
+	return &X25{*rr.Hdr.copyHeader(), rr.PSDNAddress}
+}
diff --git a/vendor/github.com/mitchellh/mapstructure/.travis.yml b/vendor/github.com/mitchellh/mapstructure/.travis.yml
deleted file mode 100644
index 7f3fe9a96..000000000
--- a/vendor/github.com/mitchellh/mapstructure/.travis.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-language: go 
-
-go: 
-  - 1.4
-  
-script:
-  - go test 
diff --git a/vendor/github.com/mitchellh/mapstructure/README.md b/vendor/github.com/mitchellh/mapstructure/README.md
deleted file mode 100644
index 659d6885f..000000000
--- a/vendor/github.com/mitchellh/mapstructure/README.md
+++ /dev/null
@@ -1,46 +0,0 @@
-# mapstructure
-
-mapstructure is a Go library for decoding generic map values to structures
-and vice versa, while providing helpful error handling.
-
-This library is most useful when decoding values from some data stream (JSON,
-Gob, etc.) where you don't _quite_ know the structure of the underlying data
-until you read a part of it. You can therefore read a `map[string]interface{}`
-and use this library to decode it into the proper underlying native Go
-structure.
-
-## Installation
-
-Standard `go get`:
-
-```
-$ go get github.com/mitchellh/mapstructure
-```
-
-## Usage & Example
-
-For usage and examples see the [Godoc](http://godoc.org/github.com/mitchellh/mapstructure).
-
-The `Decode` function has examples associated with it there.
-
-## But Why?!
-
-Go offers fantastic standard libraries for decoding formats such as JSON.
-The standard method is to have a struct pre-created, and populate that struct
-from the bytes of the encoded format. This is great, but the problem is if
-you have configuration or an encoding that changes slightly depending on
-specific fields. For example, consider this JSON:
-
-```json
-{
-  "type": "person",
-  "name": "Mitchell"
-}
-```
-
-Perhaps we can't populate a specific structure without first reading
-the "type" field from the JSON. We could always do two passes over the
-decoding of the JSON (reading the "type" first, and the rest later).
-However, it is much simpler to just decode this into a `map[string]interface{}`
-structure, read the "type" key, then use something like this library
-to decode it into the proper structure.
diff --git a/vendor/github.com/ncw/swift/.gitignore b/vendor/github.com/ncw/swift/.gitignore
deleted file mode 100644
index 5cdbab794..000000000
--- a/vendor/github.com/ncw/swift/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-*~
-*.pyc
-test-env*
-junk/
\ No newline at end of file
diff --git a/vendor/github.com/ncw/swift/.travis.yml b/vendor/github.com/ncw/swift/.travis.yml
deleted file mode 100644
index bf37e41f0..000000000
--- a/vendor/github.com/ncw/swift/.travis.yml
+++ /dev/null
@@ -1,14 +0,0 @@
-language: go
-sudo: false
-
-go:
-  - 1.1.2
-  - 1.2.2
-  - 1.3.3
-  - 1.4.2
-  - 1.5.1
-  - tip
-
-script:
-  - test -z "$(go fmt ./...)"
-  - go test
diff --git a/vendor/github.com/ncw/swift/README.md b/vendor/github.com/ncw/swift/README.md
deleted file mode 100644
index 2cc24cffa..000000000
--- a/vendor/github.com/ncw/swift/README.md
+++ /dev/null
@@ -1,140 +0,0 @@
-Swift
-=====
-
-This package provides an easy to use library for interfacing with
-Swift / Openstack Object Storage / Rackspace cloud files from the Go
-Language
-
-See here for package docs
-
-  http://godoc.org/github.com/ncw/swift
-
-[![Build Status](https://api.travis-ci.org/ncw/swift.svg?branch=master)](https://travis-ci.org/ncw/swift) [![GoDoc](https://godoc.org/github.com/ncw/swift?status.svg)](https://godoc.org/github.com/ncw/swift) 
-
-Install
--------
-
-Use go to install the library
-
-    go get github.com/ncw/swift
-
-Usage
------
-
-See here for full package docs
-
-- http://godoc.org/github.com/ncw/swift
-
-Here is a short example from the docs
-
-    import "github.com/ncw/swift"
-
-    // Create a connection
-    c := swift.Connection{
-        UserName: "user",
-        ApiKey:   "key",
-        AuthUrl:  "auth_url",
-        Domain:   "domain",  // Name of the domain (v3 auth only)
-        Tenant:   "tenant",  // Name of the tenant (v2 auth only)
-    }
-    // Authenticate
-    err := c.Authenticate()
-    if err != nil {
-        panic(err)
-    }
-    // List all the containers
-    containers, err := c.ContainerNames(nil)
-    fmt.Println(containers)
-    // etc...
-
-Additions
----------
-
-The `rs` sub project contains a wrapper for the Rackspace specific CDN Management interface.
-
-Testing
--------
-
-To run the tests you can either use an embedded fake Swift server
-either use a real Openstack Swift server or a Rackspace Cloud files account.
-
-When using a real Swift server, you need to set these environment variables
-before running the tests
-
-    export SWIFT_API_USER='user'
-    export SWIFT_API_KEY='key'
-    export SWIFT_AUTH_URL='https://url.of.auth.server/v1.0'
-
-And optionally these if using v2 authentication
-
-    export SWIFT_TENANT='TenantName'
-    export SWIFT_TENANT_ID='TenantId'
-
-And optionally these if using v3 authentication
-
-    export SWIFT_TENANT='TenantName'
-    export SWIFT_TENANT_ID='TenantId'
-    export SWIFT_API_DOMAIN_ID='domain id'
-    export SWIFT_API_DOMAIN='domain name'
-
-And optionally these if using v3 trust
-
-    export SWIFT_TRUST_ID='TrustId'
-
-And optionally this if you want to skip server certificate validation
-
-    export SWIFT_AUTH_INSECURE=1
-
-And optionally this to configure the connect channel timeout, in seconds
-
-    export SWIFT_CONNECTION_CHANNEL_TIMEOUT=60
-
-And optionally this to configure the data channel timeout, in seconds
-
-    export SWIFT_DATA_CHANNEL_TIMEOUT=60
-
-Then run the tests with `go test`
-
-License
--------
-
-This is free software under the terms of MIT license (check COPYING file
-included in this package).
-
-Contact and support
--------------------
-
-The project website is at:
-
-- https://github.com/ncw/swift
-
-There you can file bug reports, ask for help or contribute patches.
-
-Authors
--------
-
-- Nick Craig-Wood <nick@craig-wood.com>
-
-Contributors
-------------
-
-- Brian "bojo" Jones <mojobojo@gmail.com>
-- Janika Liiv <janika@toggl.com>
-- Yamamoto, Hirotaka <ymmt2005@gmail.com>
-- Stephen <yo@groks.org>
-- platformpurple <stephen@platformpurple.com>
-- Paul Querna <pquerna@apache.org>
-- Livio Soares <liviobs@gmail.com>
-- thesyncim <thesyncim@gmail.com>
-- lsowen <lsowen@s1network.com>
-- Sylvain Baubeau <sbaubeau@redhat.com>
-- Chris Kastorff <encryptio@gmail.com>
-- Dai HaoJun <haojun.dai@hp.com>
-- Hua Wang <wanghua.humble@gmail.com>
-- Fabian Ruff <fabian@progra.de>
-- Arturo Reuschenbach Puncernau <reuschenbach@gmail.com>
-- Petr Kotek <petr.kotek@bigcommerce.com>
-- Stefan Majewsky <stefan.majewsky@sap.com>
-- Cezar Sa Espinola <cezarsa@gmail.com>
-- Sam Gunaratne <samgzeit@gmail.com>
-- Richard Scothern <richard.scothern@gmail.com>
diff --git a/vendor/github.com/ncw/swift/notes.txt b/vendor/github.com/ncw/swift/notes.txt
deleted file mode 100644
index f738552cd..000000000
--- a/vendor/github.com/ncw/swift/notes.txt
+++ /dev/null
@@ -1,55 +0,0 @@
-Notes on Go Swift
-=================
-
-Make a builder style interface like the Google Go APIs?  Advantages
-are that it is easy to add named methods to the service object to do
-specific things.  Slightly less efficient.  Not sure about how to
-return extra stuff though - in an object?
-
-Make a container struct so these could be methods on it?
-
-Make noResponse check for 204?
-
-Make storage public so it can be extended easily?
-
-Rename to go-swift to match user agent string?
-
-Reconnect on auth error - 401 when token expires isn't tested
-
-Make more api compatible with python cloudfiles?
-
-Retry operations on timeout / network errors?
-- also 408 error
-- GET requests only?
-
-Make Connection thread safe - whenever it is changed take a write lock whenever it is read from a read lock
-
-Add extra headers field to Connection (for via etc)
-
-Make errors use an error heirachy then can catch them with a type assertion
-
- Error(...)
- ObjectCorrupted{ Error }
-
-Make a Debug flag in connection for logging stuff
-
-Object If-Match, If-None-Match, If-Modified-Since, If-Unmodified-Since etc
-
-Object range
-
-Object create, update with X-Delete-At or X-Delete-After
-
-Large object support
-- check uploads are less than 5GB in normal mode?
-
-Access control CORS?
-
-Swift client retries and backs off for all types of errors
-
-Implement net error interface?
-
-type Error interface {
-    error
-    Timeout() bool   // Is the error a timeout?
-    Temporary() bool // Is the error temporary?
-}
diff --git a/vendor/github.com/spf13/cobra/.gitignore b/vendor/github.com/spf13/cobra/.gitignore
deleted file mode 100644
index 36d1a84d3..000000000
--- a/vendor/github.com/spf13/cobra/.gitignore
+++ /dev/null
@@ -1,24 +0,0 @@
-# Compiled Object files, Static and Dynamic libs (Shared Objects)
-*.o
-*.a
-*.so
-
-# Folders
-_obj
-_test
-
-# Architecture specific extensions/prefixes
-*.[568vq]
-[568vq].out
-
-*.cgo1.go
-*.cgo2.c
-_cgo_defun.c
-_cgo_gotypes.go
-_cgo_export.*
-
-_testmain.go
-
-*.exe
-
-cobra.test
diff --git a/vendor/github.com/spf13/cobra/.travis.yml b/vendor/github.com/spf13/cobra/.travis.yml
deleted file mode 100644
index dc43afd61..000000000
--- a/vendor/github.com/spf13/cobra/.travis.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-language: go
-go:
-  - 1.3
-  - 1.4.2
-  - tip
-script:
-  - go test ./...
-  - go build
diff --git a/vendor/github.com/spf13/cobra/LICENSE.txt b/vendor/github.com/spf13/cobra/LICENSE.txt
deleted file mode 100644
index 298f0e266..000000000
--- a/vendor/github.com/spf13/cobra/LICENSE.txt
+++ /dev/null
@@ -1,174 +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.
diff --git a/vendor/github.com/spf13/cobra/README.md b/vendor/github.com/spf13/cobra/README.md
deleted file mode 100644
index b1fb0889e..000000000
--- a/vendor/github.com/spf13/cobra/README.md
+++ /dev/null
@@ -1,485 +0,0 @@
-# Cobra
-
-A Commander for modern go CLI interactions
-
-[![Build Status](https://travis-ci.org/spf13/cobra.svg)](https://travis-ci.org/spf13/cobra)
-
-## Overview
-
-Cobra is a commander providing a simple interface to create powerful modern CLI
-interfaces similar to git & go tools. In addition to providing an interface, Cobra
-simultaneously provides a controller to organize your application code.
-
-Inspired by go, go-Commander, gh and subcommand, Cobra improves on these by
-providing **fully posix compliant flags** (including short & long versions),
-**nesting commands**, and the ability to **define your own help and usage** for any or
-all commands.
-
-Cobra has an exceptionally clean interface and simple design without needless
-constructors or initialization methods.
-
-Applications built with Cobra commands are designed to be as user friendly as
-possible. Flags can be placed before or after the command (as long as a
-confusing space isn’t provided). Both short and long flags can be used. A
-command need not even be fully typed. The shortest unambiguous string will
-suffice. Help is automatically generated and available for the application or
-for a specific command using either the help command or the --help flag.
-
-## Concepts
-
-Cobra is built on a structure of commands & flags.
-
-**Commands** represent actions and **Flags** are modifiers for those actions.
-
-In the following example 'server' is a command and 'port' is a flag.
-
-    hugo server --port=1313
-
-### Commands
-
-Command is the central point of the application. Each interaction that
-the application supports will be contained in a Command. A command can
-have children commands and optionally run an action.
-
-In the example above 'server' is the command
-
-A Command has the following structure:
-
-    type Command struct {
-        Use string // The one-line usage message.
-        Short string // The short description shown in the 'help' output.
-        Long string // The long message shown in the 'help <this-command>' output.
-        Run func(cmd *Command, args []string) // Run runs the command.
-    }
-
-### Flags
-
-A Flag is a way to modify the behavior of an command. Cobra supports
-fully posix compliant flags as well as the go flag package. 
-A Cobra command can define flags that persist through to children commands
-and flags that are only available to that command.
-
-In the example above 'port' is the flag.
-
-Flag functionality is provided by the [pflag
-library](https://github.com/ogier/pflag), a fork of the flag standard library
-which maintains the same interface while adding posix compliance.
-
-## Usage
-
-Cobra works by creating a set of commands and then organizing them into a tree.
-The tree defines the structure of the application.
-
-Once each command is defined with it's corresponding flags, then the
-tree is assigned to the commander which is finally executed.
-
-### Installing
-Using Cobra is easy. First use go get to install the latest version
-of the library.
-
-    $ go get github.com/spf13/cobra
-
-Next include cobra in your application.
-
-    import "github.com/spf13/cobra"
-
-### Create the root command
-
-The root command represents your binary itself.
-
-Cobra doesn't require any special constructors. Simply create your commands.
-
-    var HugoCmd = &cobra.Command{
-        Use:   "hugo",
-        Short: "Hugo is a very fast static site generator",
-        Long: `A Fast and Flexible Static Site Generator built with
-                love by spf13 and friends in Go.
-                Complete documentation is available at http://hugo.spf13.com`,
-        Run: func(cmd *cobra.Command, args []string) {
-            // Do Stuff Here
-        },
-    }
-
-### Create additional commands
-
-Additional commands can be defined.
-
-    var versionCmd = &cobra.Command{
-        Use:   "version",
-        Short: "Print the version number of Hugo",
-        Long:  `All software has versions. This is Hugo's`,
-        Run: func(cmd *cobra.Command, args []string) {
-            fmt.Println("Hugo Static Site Generator v0.9 -- HEAD")
-        },
-    }
-
-### Attach command to its parent
-In this example we are attaching it to the root, but commands can be attached at any level.
-
-	HugoCmd.AddCommand(versionCmd)
-
-### Assign flags to a command
-
-Since the flags are defined and used in different locations, we need to
-define a variable outside with the correct scope to assign the flag to
-work with.
-
-    var Verbose bool
-    var Source string
-
-There are two different approaches to assign a flag.
-
-#### Persistent Flags
-
-A flag can be 'persistent' meaning that this flag will be available to the
-command it's assigned to as well as every command under that command. For
-global flags assign a flag as a persistent flag on the root.
-
-	HugoCmd.PersistentFlags().BoolVarP(&Verbose, "verbose", "v", false, "verbose output")
-
-#### Local Flags
-
-A flag can also be assigned locally which will only apply to that specific command.
-
-	HugoCmd.Flags().StringVarP(&Source, "source", "s", "", "Source directory to read from")
-
-### Remove a command from its parent
-
-Removing a command is not a common action in simple programs but it allows 3rd parties to customize an existing command tree.
-
-In this example, we remove the existing `VersionCmd` command of an existing root command, and we replace it by our own version.
-
-	mainlib.RootCmd.RemoveCommand(mainlib.VersionCmd)
-	mainlib.RootCmd.AddCommand(versionCmd)
-
-### Once all commands and flags are defined, Execute the commands
-
-Execute should be run on the root for clarity, though it can be called on any command.
-
-    HugoCmd.Execute()
-
-## Example
-
-In the example below we have defined three commands. Two are at the top level
-and one (cmdTimes) is a child of one of the top commands. In this case the root
-is not executable meaning that a subcommand is required. This is accomplished
-by not providing a 'Run' for the 'rootCmd'.
-
-We have only defined one flag for a single command.
-
-More documentation about flags is available at https://github.com/spf13/pflag
-
-    import(
-        "github.com/spf13/cobra"
-        "fmt"
-        "strings"
-    )
-
-    func main() {
-
-        var echoTimes int
-
-        var cmdPrint = &cobra.Command{
-            Use:   "print [string to print]",
-            Short: "Print anything to the screen",
-            Long:  `print is for printing anything back to the screen.
-            For many years people have printed back to the screen.
-            `,
-            Run: func(cmd *cobra.Command, args []string) {
-                fmt.Println("Print: " + strings.Join(args, " "))
-            },
-        }
-
-        var cmdEcho = &cobra.Command{
-            Use:   "echo [string to echo]",
-            Short: "Echo anything to the screen",
-            Long:  `echo is for echoing anything back.
-            Echo works a lot like print, except it has a child command.
-            `,
-            Run: func(cmd *cobra.Command, args []string) {
-                fmt.Println("Print: " + strings.Join(args, " "))
-            },
-        }
-
-        var cmdTimes = &cobra.Command{
-            Use:   "times [# times] [string to echo]",
-            Short: "Echo anything to the screen more times",
-            Long:  `echo things multiple times back to the user by providing
-            a count and a string.`,
-            Run: func(cmd *cobra.Command, args []string) {
-                for i:=0; i < echoTimes; i++ {
-                    fmt.Println("Echo: " + strings.Join(args, " "))
-                }
-            },
-        }
-
-        cmdTimes.Flags().IntVarP(&echoTimes, "times", "t", 1, "times to echo the input")
-
-        var rootCmd = &cobra.Command{Use: "app"}
-        rootCmd.AddCommand(cmdPrint, cmdEcho)
-        cmdEcho.AddCommand(cmdTimes)
-        rootCmd.Execute()
-    }
-
-For a more complete example of a larger application, please checkout [Hugo](http://hugo.spf13.com)
-
-## The Help Command
-
-Cobra automatically adds a help command to your application when you have subcommands.
-This will be called when a user runs 'app help'. Additionally help will also
-support all other commands as input. Say for instance you have a command called
-'create' without any additional configuration cobra will work when 'app help
-create' is called.  Every command will automatically have the '--help' flag added.
-
-### Example
-
-The following output is automatically generated by cobra. Nothing beyond the
-command and flag definitions are needed.
-
-    > hugo help
-
-    A Fast and Flexible Static Site Generator built with
-    love by spf13 and friends in Go.
-
-    Complete documentation is available at http://hugo.spf13.com
-
-    Usage:
-      hugo [flags]
-      hugo [command]
-
-    Available Commands:
-      server          :: Hugo runs it's own a webserver to render the files
-      version         :: Print the version number of Hugo
-      check           :: Check content in the source directory
-      benchmark       :: Benchmark hugo by building a site a number of times
-      help [command]  :: Help about any command
-
-     Available Flags:
-      -b, --base-url="": hostname (and path) to the root eg. http://spf13.com/
-      -D, --build-drafts=false: include content marked as draft
-          --config="": config file (default is path/config.yaml|json|toml)
-      -d, --destination="": filesystem path to write files to
-      -s, --source="": filesystem path to read files relative from
-          --stepAnalysis=false: display memory and timing of different steps of the program
-          --uglyurls=false: if true, use /filename.html instead of /filename/
-      -v, --verbose=false: verbose output
-      -w, --watch=false: watch filesystem for changes and recreate as needed
-
-    Use "hugo help [command]" for more information about that command.
-
-
-
-Help is just a command like any other. There is no special logic or behavior
-around it. In fact you can provide your own if you want.
-
-### Defining your own help
-
-You can provide your own Help command or you own template for the default command to use.
-
-The default help command is 
-
-    func (c *Command) initHelp() {
-        if c.helpCommand == nil {
-            c.helpCommand = &Command{
-                Use:   "help [command]",
-                Short: "Help about any command",
-                Long: `Help provides help for any command in the application.
-        Simply type ` + c.Name() + ` help [path to command] for full details.`,
-                Run: c.HelpFunc(),
-            }
-        }
-        c.AddCommand(c.helpCommand)
-    }
-
-You can provide your own command, function or template through the following methods.
-
-    command.SetHelpCommand(cmd *Command)
-
-    command.SetHelpFunc(f func(*Command, []string))
-
-    command.SetHelpTemplate(s string)
-
-The latter two will also apply to any children commands.
-
-## Usage
-
-When the user provides an invalid flag or invalid command Cobra responds by
-showing the user the 'usage'
-
-### Example
-You may recognize this from the help above. That's because the default help
-embeds the usage as part of it's output.
-
-    Usage:
-      hugo [flags]
-      hugo [command]
-
-    Available Commands:
-      server          Hugo runs it's own a webserver to render the files
-      version         Print the version number of Hugo
-      check           Check content in the source directory
-      benchmark       Benchmark hugo by building a site a number of times
-      help [command]  Help about any command
-
-     Available Flags:
-      -b, --base-url="": hostname (and path) to the root eg. http://spf13.com/
-      -D, --build-drafts=false: include content marked as draft
-          --config="": config file (default is path/config.yaml|json|toml)
-      -d, --destination="": filesystem path to write files to
-      -s, --source="": filesystem path to read files relative from
-          --stepAnalysis=false: display memory and timing of different steps of the program
-          --uglyurls=false: if true, use /filename.html instead of /filename/
-      -v, --verbose=false: verbose output
-      -w, --watch=false: watch filesystem for changes and recreate as needed
-
-### Defining your own usage
-You can provide your own usage function or template for cobra to use.
-
-The default usage function is
-
-		return func(c *Command) error {
-			err := tmpl(c.Out(), c.UsageTemplate(), c)
-			return err
-		}
-
-Like help the function and template are over ridable through public methods.
-
-    command.SetUsageFunc(f func(*Command) error)
-
-    command.SetUsageTemplate(s string)
-
-## PreRun or PostRun Hooks
-
-It is possible to run functions before or after the main `Run` function of your command. The `PersistentPreRun` and `PreRun` functions will be executed before `Run`. `PersistendPostRun` and `PostRun` will be executed after `Run`.  The `Persistent*Run` functions will be inherrited by children if they do not declare their own.  These function are run in the following order:
-
-- `PersistentPreRun`
-- `PreRun`
-- `Run`
-- `PostRun`
-- `PersistenPostRun`
-
-And example of two commands which use all of these features is below.  When the subcommand in executed it will run the root command's `PersistentPreRun` but not the root command's `PersistentPostRun`
-
-```go
-package main
-
-import (
-	"fmt"
-
-	"github.com/spf13/cobra"
-)
-
-func main() {
-
-	var rootCmd = &cobra.Command{
-		Use:   "root [sub]",
-		Short: "My root command",
-		PersistentPreRun: func(cmd *cobra.Command, args []string) {
-			fmt.Printf("Inside rootCmd PersistentPreRun with args: %v\n", args)
-		},
-		PreRun: func(cmd *cobra.Command, args []string) {
-			fmt.Printf("Inside rootCmd PreRun with args: %v\n", args)
-		},
-		Run: func(cmd *cobra.Command, args []string) {
-			fmt.Printf("Inside rootCmd Run with args: %v\n", args)
-		},
-		PostRun: func(cmd *cobra.Command, args []string) {
-			fmt.Printf("Inside rootCmd PostRun with args: %v\n", args)
-		},
-		PersistentPostRun: func(cmd *cobra.Command, args []string) {
-			fmt.Printf("Inside rootCmd PersistentPostRun with args: %v\n", args)
-		},
-	}
-
-	var subCmd = &cobra.Command{
-		Use:   "sub [no options!]",
-		Short: "My sub command",
-		PreRun: func(cmd *cobra.Command, args []string) {
-			fmt.Printf("Inside subCmd PreRun with args: %v\n", args)
-		},
-		Run: func(cmd *cobra.Command, args []string) {
-			fmt.Printf("Inside subCmd Run with args: %v\n", args)
-		},
-		PostRun: func(cmd *cobra.Command, args []string) {
-			fmt.Printf("Inside subCmd PostRun with args: %v\n", args)
-		},
-		PersistentPostRun: func(cmd *cobra.Command, args []string) {
-			fmt.Printf("Inside subCmd PersistentPostRun with args: %v\n", args)
-		},
-	}
-
-	rootCmd.AddCommand(subCmd)
-
-	rootCmd.SetArgs([]string{""})
-	_ = rootCmd.Execute()
-	fmt.Print("\n")
-	rootCmd.SetArgs([]string{"sub", "arg1", "arg2"})
-	_ = rootCmd.Execute()
-}
-```
-
-## Generating markdown formatted documentation for your command
-
-Cobra can generate a markdown formatted document based on the subcommands, flags, etc. A simple example of how to do this for your command can be found in [Markdown Docs](md_docs.md)
-
-## Generating bash completions for your command
-
-Cobra can generate a bash completions file. If you add more information to your command these completions can be amazingly powerful and flexible.  Read more about [Bash Completions](bash_completions.md)
-
-## Debugging
-
-Cobra provides a ‘DebugFlags’ method on a command which when called will print
-out everything Cobra knows about the flags for each command
-
-### Example
-
-    command.DebugFlags()
-
-## Release Notes
-* **0.9.0** June 17, 2014
-  * flags can appears anywhere in the args (provided they are unambiguous)
-  * --help prints usage screen for app or command
-  * Prefix matching for commands
-  * Cleaner looking help and usage output
-  * Extensive test suite
-* **0.8.0** Nov 5, 2013
-  * Reworked interface to remove commander completely
-  * Command now primary structure
-  * No initialization needed
-  * Usage & Help templates & functions definable at any level
-  * Updated Readme
-* **0.7.0** Sept 24, 2013
-  * Needs more eyes
-  * Test suite
-  * Support for automatic error messages
-  * Support for help command
-  * Support for printing to any io.Writer instead of os.Stderr
-  * Support for persistent flags which cascade down tree
-  * Ready for integration into Hugo
-* **0.1.0** Sept 3, 2013
-  * Implement first draft
-
-## ToDo
-* Launch proper documentation site
-
-## Contributing
-
-1. Fork it
-2. Create your feature branch (`git checkout -b my-new-feature`)
-3. Commit your changes (`git commit -am 'Add some feature'`)
-4. Push to the branch (`git push origin my-new-feature`)
-5. Create new Pull Request
-
-## Contributors
-
-Names in no particular order:
-
-* [spf13](https://github.com/spf13)
-
-## License
-
-Cobra is released under the Apache 2.0 license. See [LICENSE.txt](https://github.com/spf13/cobra/blob/master/LICENSE.txt)
-
-
-[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/spf13/cobra/trend.png)](https://bitdeli.com/free "Bitdeli Badge")
-
diff --git a/vendor/github.com/spf13/cobra/bash_completions.md b/vendor/github.com/spf13/cobra/bash_completions.md
deleted file mode 100644
index 204704efc..000000000
--- a/vendor/github.com/spf13/cobra/bash_completions.md
+++ /dev/null
@@ -1,149 +0,0 @@
-# Generating Bash Completions For Your Own cobra.Command
-
-Generating bash completions from a cobra command is incredibly easy. An actual program which does so for the kubernetes kubectl binary is as follows:
-
-```go
-package main
-
-import (
-        "io/ioutil"
-        "os"
-
-        "github.com/GoogleCloudPlatform/kubernetes/pkg/kubectl/cmd"
-)
-
-func main() {
-        kubectl := cmd.NewFactory(nil).NewKubectlCommand(os.Stdin, ioutil.Discard, ioutil.Discard)
-        kubectl.GenBashCompletionFile("out.sh")
-}
-```
-
-That will get you completions of subcommands and flags. If you make additional annotations to your code, you can get even more intelligent and flexible behavior.
-
-## Creating your own custom functions
-
-Some more actual code that works in kubernetes:
-
-```bash
-const (
-        bash_completion_func = `__kubectl_parse_get()
-{
-    local kubectl_output out
-    if kubectl_output=$(kubectl get --no-headers "$1" 2>/dev/null); then
-        out=($(echo "${kubectl_output}" | awk '{print $1}'))
-        COMPREPLY=( $( compgen -W "${out[*]}" -- "$cur" ) )
-    fi
-}
-
-__kubectl_get_resource()
-{
-    if [[ ${#nouns[@]} -eq 0 ]]; then
-        return 1
-    fi
-    __kubectl_parse_get ${nouns[${#nouns[@]} -1]}
-    if [[ $? -eq 0 ]]; then
-        return 0
-    fi
-}
-
-__custom_func() {
-    case ${last_command} in
-        kubectl_get | kubectl_describe | kubectl_delete | kubectl_stop)
-            __kubectl_get_resource
-            return
-            ;;
-        *)
-            ;;
-    esac
-}
-`)
-```
-
-And then I set that in my command definition:
-
-```go
-cmds := &cobra.Command{
-	Use:   "kubectl",
-	Short: "kubectl controls the Kubernetes cluster manager",
-	Long: `kubectl controls the Kubernetes cluster manager.
-
-Find more information at https://github.com/GoogleCloudPlatform/kubernetes.`,
-	Run: runHelp,
-	BashCompletionFunction: bash_completion_func,
-}
-```
-
-The `BashCompletionFunction` option is really only valid/useful on the root command. Doing the above will cause `__custom_func()` to be called when the built in processor was unable to find a solution. In the case of kubernetes a valid command might look something like `kubectl get pod [mypod]`. If you type `kubectl get pod [tab][tab]` the `__customc_func()` will run because the cobra.Command only understood "kubectl" and "get." `__custom_func()` will see that the cobra.Command is "kubectl_get" and will thus call another helper `__kubectl_get_resource()`.  `__kubectl_get_resource` will look at the 'nouns' collected. In our example the only noun will be `pod`.  So it will call `__kubectl_parse_get pod`.  `__kubectl_parse_get` will actually call out to kubernetes and get any pods.  It will then set `COMPREPLY` to valid pods!
-
-## Have the completions code complete your 'nouns'
-
-In the above example "pod" was assumed to already be typed. But if you want `kubectl get [tab][tab]` to show a list of valid "nouns" you have to set them. Simplified code from `kubectl get` looks like:
-
-```go
-validArgs []string = { "pods", "nodes", "services", "replicationControllers" }
-
-cmd := &cobra.Command{
-	Use:     "get [(-o|--output=)json|yaml|template|...] (RESOURCE [NAME] | RESOURCE/NAME ...)",
-	Short:   "Display one or many resources",
-	Long:    get_long,
-	Example: get_example,
-	Run: func(cmd *cobra.Command, args []string) {
-		err := RunGet(f, out, cmd, args)
-		util.CheckErr(err)
-	},
-	ValidArgs: validArgs,
-}
-```
-
-Notice we put the "ValidArgs" on the "get" subcommand. Doing so will give results like
-
-```bash
-# kubectl get [tab][tab]
-nodes                 pods                    replicationControllers  services
-```
-
-## Mark flags as required
-
-Most of the time completions will only show subcommands. But if a flag is required to make a subcommand work, you probably want it to show up when the user types [tab][tab].  Marking a flag as 'Required' is incredibly easy.
-
-```go
-cmd.MarkFlagRequired("pod")
-cmd.MarkFlagRequired("container")
-```
-
-and you'll get something like
-
-```bash
-# kubectl exec [tab][tab][tab]
--c            --container=  -p            --pod=  
-```
-
-# Specify valid filename extensions for flags that take a filename
-
-In this example we use --filename= and expect to get a json or yaml file as the argument. To make this easier we annotate the --filename flag with valid filename extensions.
-
-```go
-	annotations := []string{"json", "yaml", "yml"}
-	annotation := make(map[string][]string)
-	annotation[cobra.BashCompFilenameExt] = annotations
-
-	flag := &pflag.Flag{
-		Name:        "filename",
-		Shorthand:   "f",
-		Usage:       usage,
-		Value:       value,
-		DefValue:    value.String(),
-		Annotations: annotation,
-	}
-	cmd.Flags().AddFlag(flag)
-```
-
-Now when you run a command with this filename flag you'll get something like
-
-```bash
-# kubectl create -f 
-test/                         example/                      rpmbuild/
-hello.yml                     test.json
-```
-
-So while there are many other files in the CWD it only shows me subdirs and those with valid extensions.
diff --git a/vendor/github.com/spf13/cobra/md_docs.md b/vendor/github.com/spf13/cobra/md_docs.md
deleted file mode 100644
index 3a0d55ab9..000000000
--- a/vendor/github.com/spf13/cobra/md_docs.md
+++ /dev/null
@@ -1,81 +0,0 @@
-# Generating Markdown Docs For Your Own cobra.Command
-
-## Generate markdown docs for the entire command tree
-
-This program can actually generate docs for the kubectl command in the kubernetes project
-
-```go
-package main
-
-import (
-	"io/ioutil"
-	"os"
-
-	"github.com/GoogleCloudPlatform/kubernetes/pkg/kubectl/cmd"
-	"github.com/spf13/cobra"
-)
-
-func main() {
-	kubectl := cmd.NewFactory(nil).NewKubectlCommand(os.Stdin, ioutil.Discard, ioutil.Discard)
-	cobra.GenMarkdownTree(kubectl, "./")
-}
-```
-
-This will generate a whole series of files, one for each command in the tree, in the directory specified (in this case "./")
-
-## Generate markdown docs for a single command
-
-You may wish to have more control over the output, or only generate for a single command, instead of the entire command tree. If this is the case you may prefer to `GenMarkdown` instead of `GenMarkdownTree`
-
-```go
-	out := new(bytes.Buffer)
-	cobra.GenMarkdown(cmd, out)
-```
-
-This will write the markdown doc for ONLY "cmd" into the out, buffer.
-
-## Customize the output
-
-Both `GenMarkdown` and `GenMarkdownTree` have alternate versions with callbacks to get some control of the output:
-
-```go
-func GenMarkdownTreeCustom(cmd *Command, dir string, filePrepender func(string) string, linkHandler func(string) string) {
-    //...
-}
-```
-
-```go
-func GenMarkdownCustom(cmd *Command, out *bytes.Buffer, linkHandler func(string) string) {
-    //...
-}
-```
-
-The `filePrepender` will prepend the return value given the full filepath to the rendered Markdown file. A common use case is to add front matter to use the generated documentation with [Hugo](http://gohugo.io/):
-
-```go
-const fmTemplate = `---
-date: %s
-title: "%s"
-slug: %s
-url: %s
----
-`
-
-filePrepender := func(filename string) string {
-	now := time.Now().Format(time.RFC3339)
-	name := filepath.Base(filename)
-	base := strings.TrimSuffix(name, path.Ext(name))
-	url := "/commands/" + strings.ToLower(base) + "/"
-	return fmt.Sprintf(fmTemplate, now, strings.Replace(base, "_", " ", -1), base, url)
-}
-```
-
-The `linkHandler` can be used to customize the rendered internal links to the commands, given a filename:
-
-```go
-linkHandler := func(name string) string {
-	base := strings.TrimSuffix(name, path.Ext(name))
-	return "/commands/" + strings.ToLower(base) + "/"
-}
-```
- 
diff --git a/vendor/github.com/spf13/pflag/.travis.yml b/vendor/github.com/spf13/pflag/.travis.yml
deleted file mode 100644
index c4d88e374..000000000
--- a/vendor/github.com/spf13/pflag/.travis.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-sudo: false
-
-language: go
-
-go:
-        - 1.3
-        - 1.4
-        - tip
diff --git a/vendor/github.com/spf13/pflag/README.md b/vendor/github.com/spf13/pflag/README.md
deleted file mode 100644
index f7d63500f..000000000
--- a/vendor/github.com/spf13/pflag/README.md
+++ /dev/null
@@ -1,191 +0,0 @@
-[![Build Status](https://travis-ci.org/spf13/pflag.svg?branch=master)](https://travis-ci.org/spf13/pflag)
-
-## Description
-
-pflag is a drop-in replacement for Go's flag package, implementing
-POSIX/GNU-style --flags.
-
-pflag is compatible with the [GNU extensions to the POSIX recommendations
-for command-line options][1]. For a more precise description, see the
-"Command-line flag syntax" section below.
-
-[1]: http://www.gnu.org/software/libc/manual/html_node/Argument-Syntax.html
-
-pflag is available under the same style of BSD license as the Go language,
-which can be found in the LICENSE file.
-
-## Installation
-
-pflag is available using the standard `go get` command.
-
-Install by running:
-
-    go get github.com/ogier/pflag
-
-Run tests by running:
-
-    go test github.com/ogier/pflag
-
-## Usage
-
-pflag is a drop-in replacement of Go's native flag package. If you import
-pflag under the name "flag" then all code should continue to function
-with no changes.
-
-``` go
-import flag "github.com/ogier/pflag"
-```
-
-There is one exception to this: if you directly instantiate the Flag struct
-there is one more field "Shorthand" that you will need to set.
-Most code never instantiates this struct directly, and instead uses
-functions such as String(), BoolVar(), and Var(), and is therefore
-unaffected.
-
-Define flags using flag.String(), Bool(), Int(), etc.
-
-This declares an integer flag, -flagname, stored in the pointer ip, with type *int.
-
-``` go
-var ip *int = flag.Int("flagname", 1234, "help message for flagname")
-```
-
-If you like, you can bind the flag to a variable using the Var() functions.
-
-``` go
-var flagvar int
-func init() {
-    flag.IntVar(&flagvar, "flagname", 1234, "help message for flagname")
-}
-```
-
-Or you can create custom flags that satisfy the Value interface (with
-pointer receivers) and couple them to flag parsing by
-
-``` go
-flag.Var(&flagVal, "name", "help message for flagname")
-```
-
-For such flags, the default value is just the initial value of the variable.
-
-After all flags are defined, call
-
-``` go
-flag.Parse()
-```
-
-to parse the command line into the defined flags.
-
-Flags may then be used directly. If you're using the flags themselves,
-they are all pointers; if you bind to variables, they're values.
-
-``` go
-fmt.Println("ip has value ", *ip)
-fmt.Println("flagvar has value ", flagvar)
-```
-
-After parsing, the arguments after the flag are available as the
-slice flag.Args() or individually as flag.Arg(i).
-The arguments are indexed from 0 through flag.NArg()-1.
-
-The pflag package also defines some new functions that are not in flag,
-that give one-letter shorthands for flags. You can use these by appending
-'P' to the name of any function that defines a flag.
-
-``` go
-var ip = flag.IntP("flagname", "f", 1234, "help message")
-var flagvar bool
-func init() {
-    flag.BoolVarP("boolname", "b", true, "help message")
-}
-flag.VarP(&flagVar, "varname", "v", 1234, "help message")
-```
-
-Shorthand letters can be used with single dashes on the command line.
-Boolean shorthand flags can be combined with other shorthand flags.
-
-The default set of command-line flags is controlled by
-top-level functions.  The FlagSet type allows one to define
-independent sets of flags, such as to implement subcommands
-in a command-line interface. The methods of FlagSet are
-analogous to the top-level functions for the command-line
-flag set.
-
-## Command line flag syntax
-
-```
---flag    // boolean flags only
---flag=x
-```
-
-Unlike the flag package, a single dash before an option means something
-different than a double dash. Single dashes signify a series of shorthand
-letters for flags. All but the last shorthand letter must be boolean flags.
-
-```
-// boolean flags
--f
--abc
-
-// non-boolean flags
--n 1234
--Ifile
-
-// mixed
--abcs "hello"
--abcn1234
-```
-
-Flag parsing stops after the terminator "--". Unlike the flag package,
-flags can be interspersed with arguments anywhere on the command line
-before this terminator.
-
-Integer flags accept 1234, 0664, 0x1234 and may be negative.
-Boolean flags (in their long form) accept 1, 0, t, f, true, false,
-TRUE, FALSE, True, False.
-Duration flags accept any input valid for time.ParseDuration.
-
-## Mutating or "Normalizing" Flag names
-
-It is possible to set a custom flag name 'normalization function.' It allows flag names to be mutated both when created in the code and when used on the command line to some 'normalized' form. The 'normalized' form is used for comparison. Two examples of using the custom normalization func follow.
-
-**Example #1**: You want -, _, and . in flags to compare the same. aka --my-flag == --my_flag == --my.flag
-
-```go
-func wordSepNormalizeFunc(f *pflag.FlagSet, name string) pflag.NormalizedName {
-	from := []string{"-", "_"}
-	to := "."
-	for _, sep := range from {
-		name = strings.Replace(name, sep, to, -1)
-	}
-	return pflag.NormalizedName(name)
-}
-
-myFlagSet.SetNormalizeFunc(wordSepNormalizeFunc)
-```
-
-**Example #2**: You want to alias two flags. aka --old-flag-name == --new-flag-name
-
-```go
-func aliasNormalizeFunc(f *pflag.FlagSet, name string) pflag.NormalizedName {
-	switch name {
-	case "old-flag-name":
-		name = "new-flag-name"
-		break
-	}
-	return pflag.NormalizedName(name)
-}
-
-myFlagSet.SetNormalizeFunc(aliasNormalizeFunc)
-```
-
-## More info
-
-You can see the full reference documentation of the pflag package
-[at godoc.org][3], or through go's standard documentation system by
-running `godoc -http=:6060` and browsing to
-[http://localhost:6060/pkg/github.com/ogier/pflag][2] after
-installation.
-
-[2]: http://localhost:6060/pkg/github.com/ogier/pflag
-[3]: http://godoc.org/github.com/ogier/pflag
diff --git a/vendor/github.com/stevvooe/resumable/.gitignore b/vendor/github.com/stevvooe/resumable/.gitignore
deleted file mode 100644
index daf913b1b..000000000
--- a/vendor/github.com/stevvooe/resumable/.gitignore
+++ /dev/null
@@ -1,24 +0,0 @@
-# Compiled Object files, Static and Dynamic libs (Shared Objects)
-*.o
-*.a
-*.so
-
-# Folders
-_obj
-_test
-
-# Architecture specific extensions/prefixes
-*.[568vq]
-[568vq].out
-
-*.cgo1.go
-*.cgo2.c
-_cgo_defun.c
-_cgo_gotypes.go
-_cgo_export.*
-
-_testmain.go
-
-*.exe
-*.test
-*.prof
diff --git a/vendor/github.com/stevvooe/resumable/README.md b/vendor/github.com/stevvooe/resumable/README.md
deleted file mode 100644
index d2d3fb89e..000000000
--- a/vendor/github.com/stevvooe/resumable/README.md
+++ /dev/null
@@ -1,6 +0,0 @@
-# go-crypto
-A Subset of the Go `crypto` Package with a Resumable Hash Interface
-
-### Documentation
-
-GoDocs: http://godoc.org/github.com/stevvooe/resumable
diff --git a/vendor/rsc.io/letsencrypt/vendor/github.com/xenolf/lego/LICENSE b/vendor/github.com/xenolf/lego/LICENSE
similarity index 100%
rename from vendor/rsc.io/letsencrypt/vendor/github.com/xenolf/lego/LICENSE
rename to vendor/github.com/xenolf/lego/LICENSE
diff --git a/vendor/rsc.io/letsencrypt/vendor/github.com/xenolf/lego/acme/challenges.go b/vendor/github.com/xenolf/lego/acme/challenges.go
similarity index 100%
rename from vendor/rsc.io/letsencrypt/vendor/github.com/xenolf/lego/acme/challenges.go
rename to vendor/github.com/xenolf/lego/acme/challenges.go
diff --git a/vendor/rsc.io/letsencrypt/vendor/github.com/xenolf/lego/acme/client.go b/vendor/github.com/xenolf/lego/acme/client.go
similarity index 91%
rename from vendor/rsc.io/letsencrypt/vendor/github.com/xenolf/lego/acme/client.go
rename to vendor/github.com/xenolf/lego/acme/client.go
index 16e4cbe00..445dc2bd8 100644
--- a/vendor/rsc.io/letsencrypt/vendor/github.com/xenolf/lego/acme/client.go
+++ b/vendor/github.com/xenolf/lego/acme/client.go
@@ -103,6 +103,8 @@ func (c *Client) SetChallengeProvider(challenge Challenge, p ChallengeProvider)
 		c.solvers[challenge] = &httpChallenge{jws: c.jws, validate: validate, provider: p}
 	case TLSSNI01:
 		c.solvers[challenge] = &tlsSNIChallenge{jws: c.jws, validate: validate, provider: p}
+	case DNS01:
+		c.solvers[challenge] = &dnsChallenge{jws: c.jws, validate: validate, provider: p}
 	default:
 		return fmt.Errorf("Unknown challenge %v", challenge)
 	}
@@ -187,6 +189,68 @@ func (c *Client) Register() (*RegistrationResource, error) {
 	return reg, nil
 }
 
+// DeleteRegistration deletes the client's user registration from the ACME
+// server.
+func (c *Client) DeleteRegistration() error {
+	if c == nil || c.user == nil {
+		return errors.New("acme: cannot unregister a nil client or user")
+	}
+	logf("[INFO] acme: Deleting account for %s", c.user.GetEmail())
+
+	regMsg := registrationMessage{
+		Resource: "reg",
+		Delete:   true,
+	}
+
+	_, err := postJSON(c.jws, c.user.GetRegistration().URI, regMsg, nil)
+	if err != nil {
+		return err
+	}
+
+	return nil
+}
+
+// QueryRegistration runs a POST request on the client's registration and
+// returns the result.
+//
+// This is similar to the Register function, but acting on an existing
+// registration link and resource.
+func (c *Client) QueryRegistration() (*RegistrationResource, error) {
+	if c == nil || c.user == nil {
+		return nil, errors.New("acme: cannot query the registration of a nil client or user")
+	}
+	// Log the URL here instead of the email as the email may not be set
+	logf("[INFO] acme: Querying account for %s", c.user.GetRegistration().URI)
+
+	regMsg := registrationMessage{
+		Resource: "reg",
+	}
+
+	var serverReg Registration
+	hdr, err := postJSON(c.jws, c.user.GetRegistration().URI, regMsg, &serverReg)
+	if err != nil {
+		return nil, err
+	}
+
+	reg := &RegistrationResource{Body: serverReg}
+
+	links := parseLinks(hdr["Link"])
+	// Location: header is not returned so this needs to be populated off of
+	// existing URI
+	reg.URI = c.user.GetRegistration().URI
+	if links["terms-of-service"] != "" {
+		reg.TosURL = links["terms-of-service"]
+	}
+
+	if links["next"] != "" {
+		reg.NewAuthzURL = links["next"]
+	} else {
+		return nil, errors.New("acme: No new-authz link in response to registration query")
+	}
+
+	return reg, nil
+}
+
 // AgreeToTOS updates the Client registration and sends the agreement to
 // the server.
 func (c *Client) AgreeToTOS() error {
diff --git a/vendor/rsc.io/letsencrypt/vendor/github.com/xenolf/lego/acme/crypto.go b/vendor/github.com/xenolf/lego/acme/crypto.go
similarity index 100%
rename from vendor/rsc.io/letsencrypt/vendor/github.com/xenolf/lego/acme/crypto.go
rename to vendor/github.com/xenolf/lego/acme/crypto.go
diff --git a/vendor/github.com/xenolf/lego/acme/dns_challenge.go b/vendor/github.com/xenolf/lego/acme/dns_challenge.go
new file mode 100644
index 000000000..2f45e2a9b
--- /dev/null
+++ b/vendor/github.com/xenolf/lego/acme/dns_challenge.go
@@ -0,0 +1,279 @@
+package acme
+
+import (
+	"crypto/sha256"
+	"encoding/base64"
+	"errors"
+	"fmt"
+	"log"
+	"net"
+	"strings"
+	"time"
+
+	"github.com/miekg/dns"
+	"golang.org/x/net/publicsuffix"
+)
+
+type preCheckDNSFunc func(fqdn, value string) (bool, error)
+
+var (
+	preCheckDNS preCheckDNSFunc = checkDNSPropagation
+	fqdnToZone                  = map[string]string{}
+)
+
+var RecursiveNameservers = []string{
+	"google-public-dns-a.google.com:53",
+	"google-public-dns-b.google.com:53",
+}
+
+// DNSTimeout is used to override the default DNS timeout of 10 seconds.
+var DNSTimeout = 10 * time.Second
+
+// DNS01Record returns a DNS record which will fulfill the `dns-01` challenge
+func DNS01Record(domain, keyAuth string) (fqdn string, value string, ttl int) {
+	keyAuthShaBytes := sha256.Sum256([]byte(keyAuth))
+	// base64URL encoding without padding
+	keyAuthSha := base64.URLEncoding.EncodeToString(keyAuthShaBytes[:sha256.Size])
+	value = strings.TrimRight(keyAuthSha, "=")
+	ttl = 120
+	fqdn = fmt.Sprintf("_acme-challenge.%s.", domain)
+	return
+}
+
+// dnsChallenge implements the dns-01 challenge according to ACME 7.5
+type dnsChallenge struct {
+	jws      *jws
+	validate validateFunc
+	provider ChallengeProvider
+}
+
+func (s *dnsChallenge) Solve(chlng challenge, domain string) error {
+	logf("[INFO][%s] acme: Trying to solve DNS-01", domain)
+
+	if s.provider == nil {
+		return errors.New("No DNS Provider configured")
+	}
+
+	// Generate the Key Authorization for the challenge
+	keyAuth, err := getKeyAuthorization(chlng.Token, s.jws.privKey)
+	if err != nil {
+		return err
+	}
+
+	err = s.provider.Present(domain, chlng.Token, keyAuth)
+	if err != nil {
+		return fmt.Errorf("Error presenting token: %s", err)
+	}
+	defer func() {
+		err := s.provider.CleanUp(domain, chlng.Token, keyAuth)
+		if err != nil {
+			log.Printf("Error cleaning up %s: %v ", domain, err)
+		}
+	}()
+
+	fqdn, value, _ := DNS01Record(domain, keyAuth)
+
+	logf("[INFO][%s] Checking DNS record propagation...", domain)
+
+	var timeout, interval time.Duration
+	switch provider := s.provider.(type) {
+	case ChallengeProviderTimeout:
+		timeout, interval = provider.Timeout()
+	default:
+		timeout, interval = 60*time.Second, 2*time.Second
+	}
+
+	err = WaitFor(timeout, interval, func() (bool, error) {
+		return preCheckDNS(fqdn, value)
+	})
+	if err != nil {
+		return err
+	}
+
+	return s.validate(s.jws, domain, chlng.URI, challenge{Resource: "challenge", Type: chlng.Type, Token: chlng.Token, KeyAuthorization: keyAuth})
+}
+
+// checkDNSPropagation checks if the expected TXT record has been propagated to all authoritative nameservers.
+func checkDNSPropagation(fqdn, value string) (bool, error) {
+	// Initial attempt to resolve at the recursive NS
+	r, err := dnsQuery(fqdn, dns.TypeTXT, RecursiveNameservers, true)
+	if err != nil {
+		return false, err
+	}
+	if r.Rcode == dns.RcodeSuccess {
+		// If we see a CNAME here then use the alias
+		for _, rr := range r.Answer {
+			if cn, ok := rr.(*dns.CNAME); ok {
+				if cn.Hdr.Name == fqdn {
+					fqdn = cn.Target
+					break
+				}
+			}
+		}
+	}
+
+	authoritativeNss, err := lookupNameservers(fqdn)
+	if err != nil {
+		return false, err
+	}
+
+	return checkAuthoritativeNss(fqdn, value, authoritativeNss)
+}
+
+// checkAuthoritativeNss queries each of the given nameservers for the expected TXT record.
+func checkAuthoritativeNss(fqdn, value string, nameservers []string) (bool, error) {
+	for _, ns := range nameservers {
+		r, err := dnsQuery(fqdn, dns.TypeTXT, []string{net.JoinHostPort(ns, "53")}, false)
+		if err != nil {
+			return false, err
+		}
+
+		if r.Rcode != dns.RcodeSuccess {
+			return false, fmt.Errorf("NS %s returned %s for %s", ns, dns.RcodeToString[r.Rcode], fqdn)
+		}
+
+		var found bool
+		for _, rr := range r.Answer {
+			if txt, ok := rr.(*dns.TXT); ok {
+				if strings.Join(txt.Txt, "") == value {
+					found = true
+					break
+				}
+			}
+		}
+
+		if !found {
+			return false, fmt.Errorf("NS %s did not return the expected TXT record", ns)
+		}
+	}
+
+	return true, nil
+}
+
+// dnsQuery will query a nameserver, iterating through the supplied servers as it retries
+// The nameserver should include a port, to facilitate testing where we talk to a mock dns server.
+func dnsQuery(fqdn string, rtype uint16, nameservers []string, recursive bool) (in *dns.Msg, err error) {
+	m := new(dns.Msg)
+	m.SetQuestion(fqdn, rtype)
+	m.SetEdns0(4096, false)
+
+	if !recursive {
+		m.RecursionDesired = false
+	}
+
+	// Will retry the request based on the number of servers (n+1)
+	for i := 1; i <= len(nameservers)+1; i++ {
+		ns := nameservers[i%len(nameservers)]
+		udp := &dns.Client{Net: "udp", Timeout: DNSTimeout}
+		in, _, err = udp.Exchange(m, ns)
+
+		if err == dns.ErrTruncated {
+			tcp := &dns.Client{Net: "tcp", Timeout: DNSTimeout}
+			// If the TCP request suceeds, the err will reset to nil
+			in, _, err = tcp.Exchange(m, ns)
+		}
+
+		if err == nil {
+			break
+		}
+	}
+	return
+}
+
+// lookupNameservers returns the authoritative nameservers for the given fqdn.
+func lookupNameservers(fqdn string) ([]string, error) {
+	var authoritativeNss []string
+
+	zone, err := FindZoneByFqdn(fqdn, RecursiveNameservers)
+	if err != nil {
+		return nil, err
+	}
+
+	r, err := dnsQuery(zone, dns.TypeNS, RecursiveNameservers, true)
+	if err != nil {
+		return nil, err
+	}
+
+	for _, rr := range r.Answer {
+		if ns, ok := rr.(*dns.NS); ok {
+			authoritativeNss = append(authoritativeNss, strings.ToLower(ns.Ns))
+		}
+	}
+
+	if len(authoritativeNss) > 0 {
+		return authoritativeNss, nil
+	}
+	return nil, fmt.Errorf("Could not determine authoritative nameservers")
+}
+
+// FindZoneByFqdn determines the zone of the given fqdn
+func FindZoneByFqdn(fqdn string, nameservers []string) (string, error) {
+	// Do we have it cached?
+	if zone, ok := fqdnToZone[fqdn]; ok {
+		return zone, nil
+	}
+
+	// Query the authoritative nameserver for a hopefully non-existing SOA record,
+	// in the authority section of the reply it will have the SOA of the
+	// containing zone. rfc2308 has this to say on the subject:
+	//   Name servers authoritative for a zone MUST include the SOA record of
+	//   the zone in the authority section of the response when reporting an
+	//   NXDOMAIN or indicating that no data (NODATA) of the requested type exists
+	in, err := dnsQuery(fqdn, dns.TypeSOA, nameservers, true)
+	if err != nil {
+		return "", err
+	}
+	if in.Rcode != dns.RcodeNameError {
+		if in.Rcode != dns.RcodeSuccess {
+			return "", fmt.Errorf("The NS returned %s for %s", dns.RcodeToString[in.Rcode], fqdn)
+		}
+		// We have a success, so one of the answers has to be a SOA RR
+		for _, ans := range in.Answer {
+			if soa, ok := ans.(*dns.SOA); ok {
+				return checkIfTLD(fqdn, soa)
+			}
+		}
+		// Or it is NODATA, fall through to NXDOMAIN
+	}
+	// Search the authority section for our precious SOA RR
+	for _, ns := range in.Ns {
+		if soa, ok := ns.(*dns.SOA); ok {
+			return checkIfTLD(fqdn, soa)
+		}
+	}
+	return "", fmt.Errorf("The NS did not return the expected SOA record in the authority section")
+}
+
+func checkIfTLD(fqdn string, soa *dns.SOA) (string, error) {
+	zone := soa.Hdr.Name
+	// If we ended up on one of the TLDs, it means the domain did not exist.
+	publicsuffix, _ := publicsuffix.PublicSuffix(UnFqdn(zone))
+	if publicsuffix == UnFqdn(zone) {
+		return "", fmt.Errorf("Could not determine zone authoritatively")
+	}
+	fqdnToZone[fqdn] = zone
+	return zone, nil
+}
+
+// ClearFqdnCache clears the cache of fqdn to zone mappings. Primarily used in testing.
+func ClearFqdnCache() {
+	fqdnToZone = map[string]string{}
+}
+
+// ToFqdn converts the name into a fqdn appending a trailing dot.
+func ToFqdn(name string) string {
+	n := len(name)
+	if n == 0 || name[n-1] == '.' {
+		return name
+	}
+	return name + "."
+}
+
+// UnFqdn converts the fqdn into a name removing the trailing dot.
+func UnFqdn(name string) string {
+	n := len(name)
+	if n != 0 && name[n-1] == '.' {
+		return name[:n-1]
+	}
+	return name
+}
diff --git a/vendor/github.com/xenolf/lego/acme/dns_challenge_manual.go b/vendor/github.com/xenolf/lego/acme/dns_challenge_manual.go
new file mode 100644
index 000000000..240384e60
--- /dev/null
+++ b/vendor/github.com/xenolf/lego/acme/dns_challenge_manual.go
@@ -0,0 +1,53 @@
+package acme
+
+import (
+	"bufio"
+	"fmt"
+	"os"
+)
+
+const (
+	dnsTemplate = "%s %d IN TXT \"%s\""
+)
+
+// DNSProviderManual is an implementation of the ChallengeProvider interface
+type DNSProviderManual struct{}
+
+// NewDNSProviderManual returns a DNSProviderManual instance.
+func NewDNSProviderManual() (*DNSProviderManual, error) {
+	return &DNSProviderManual{}, nil
+}
+
+// Present prints instructions for manually creating the TXT record
+func (*DNSProviderManual) Present(domain, token, keyAuth string) error {
+	fqdn, value, ttl := DNS01Record(domain, keyAuth)
+	dnsRecord := fmt.Sprintf(dnsTemplate, fqdn, ttl, value)
+
+	authZone, err := FindZoneByFqdn(fqdn, RecursiveNameservers)
+	if err != nil {
+		return err
+	}
+
+	logf("[INFO] acme: Please create the following TXT record in your %s zone:", authZone)
+	logf("[INFO] acme: %s", dnsRecord)
+	logf("[INFO] acme: Press 'Enter' when you are done")
+
+	reader := bufio.NewReader(os.Stdin)
+	_, _ = reader.ReadString('\n')
+	return nil
+}
+
+// CleanUp prints instructions for manually removing the TXT record
+func (*DNSProviderManual) CleanUp(domain, token, keyAuth string) error {
+	fqdn, _, ttl := DNS01Record(domain, keyAuth)
+	dnsRecord := fmt.Sprintf(dnsTemplate, fqdn, ttl, "...")
+
+	authZone, err := FindZoneByFqdn(fqdn, RecursiveNameservers)
+	if err != nil {
+		return err
+	}
+
+	logf("[INFO] acme: You can now remove this TXT record from your %s zone:", authZone)
+	logf("[INFO] acme: %s", dnsRecord)
+	return nil
+}
diff --git a/vendor/rsc.io/letsencrypt/vendor/github.com/xenolf/lego/acme/error.go b/vendor/github.com/xenolf/lego/acme/error.go
similarity index 78%
rename from vendor/rsc.io/letsencrypt/vendor/github.com/xenolf/lego/acme/error.go
rename to vendor/github.com/xenolf/lego/acme/error.go
index b32561a3a..2aa690b33 100644
--- a/vendor/rsc.io/letsencrypt/vendor/github.com/xenolf/lego/acme/error.go
+++ b/vendor/github.com/xenolf/lego/acme/error.go
@@ -3,6 +3,7 @@ package acme
 import (
 	"encoding/json"
 	"fmt"
+	"io/ioutil"
 	"net/http"
 	"strings"
 )
@@ -52,10 +53,22 @@ func (c challengeError) Error() string {
 
 func handleHTTPError(resp *http.Response) error {
 	var errorDetail RemoteError
-	decoder := json.NewDecoder(resp.Body)
-	err := decoder.Decode(&errorDetail)
-	if err != nil {
-		return err
+
+	contenType := resp.Header.Get("Content-Type")
+	// try to decode the content as JSON
+	if contenType == "application/json" || contenType == "application/problem+json" {
+		decoder := json.NewDecoder(resp.Body)
+		err := decoder.Decode(&errorDetail)
+		if err != nil {
+			return err
+		}
+	} else {
+		detailBytes, err := ioutil.ReadAll(limitReader(resp.Body, 1024*1024))
+		if err != nil {
+			return err
+		}
+
+		errorDetail.Detail = string(detailBytes)
 	}
 
 	errorDetail.StatusCode = resp.StatusCode
diff --git a/vendor/rsc.io/letsencrypt/vendor/github.com/xenolf/lego/acme/http.go b/vendor/github.com/xenolf/lego/acme/http.go
similarity index 95%
rename from vendor/rsc.io/letsencrypt/vendor/github.com/xenolf/lego/acme/http.go
rename to vendor/github.com/xenolf/lego/acme/http.go
index 410aead6d..3b5a37cbd 100644
--- a/vendor/rsc.io/letsencrypt/vendor/github.com/xenolf/lego/acme/http.go
+++ b/vendor/github.com/xenolf/lego/acme/http.go
@@ -14,8 +14,11 @@ import (
 // UserAgent (if non-empty) will be tacked onto the User-Agent string in requests.
 var UserAgent string
 
+// HTTPTimeout is used to override the default HTTP timeout of 10 seconds.
+var HTTPTimeout = 10 * time.Second
+
 // defaultClient is an HTTP client with a reasonable timeout value.
-var defaultClient = http.Client{Timeout: 10 * time.Second}
+var defaultClient = http.Client{Timeout: HTTPTimeout}
 
 const (
 	// defaultGoUserAgent is the Go HTTP package user agent string. Too
diff --git a/vendor/rsc.io/letsencrypt/vendor/github.com/xenolf/lego/acme/http_challenge.go b/vendor/github.com/xenolf/lego/acme/http_challenge.go
similarity index 100%
rename from vendor/rsc.io/letsencrypt/vendor/github.com/xenolf/lego/acme/http_challenge.go
rename to vendor/github.com/xenolf/lego/acme/http_challenge.go
diff --git a/vendor/rsc.io/letsencrypt/vendor/github.com/xenolf/lego/acme/http_challenge_server.go b/vendor/github.com/xenolf/lego/acme/http_challenge_server.go
similarity index 100%
rename from vendor/rsc.io/letsencrypt/vendor/github.com/xenolf/lego/acme/http_challenge_server.go
rename to vendor/github.com/xenolf/lego/acme/http_challenge_server.go
diff --git a/vendor/rsc.io/letsencrypt/vendor/github.com/xenolf/lego/acme/jws.go b/vendor/github.com/xenolf/lego/acme/jws.go
similarity index 96%
rename from vendor/rsc.io/letsencrypt/vendor/github.com/xenolf/lego/acme/jws.go
rename to vendor/github.com/xenolf/lego/acme/jws.go
index 8435d0cfc..e000bc645 100644
--- a/vendor/rsc.io/letsencrypt/vendor/github.com/xenolf/lego/acme/jws.go
+++ b/vendor/github.com/xenolf/lego/acme/jws.go
@@ -101,7 +101,9 @@ func (j *jws) Nonce() (string, error) {
 			return nonce, err
 		}
 	}
-
+	if len(j.nonces) == 0 {
+		return "", fmt.Errorf("Can't get nonce")
+	}
 	nonce, j.nonces = j.nonces[len(j.nonces)-1], j.nonces[:len(j.nonces)-1]
 	return nonce, nil
 }
diff --git a/vendor/rsc.io/letsencrypt/vendor/github.com/xenolf/lego/acme/messages.go b/vendor/github.com/xenolf/lego/acme/messages.go
similarity index 98%
rename from vendor/rsc.io/letsencrypt/vendor/github.com/xenolf/lego/acme/messages.go
rename to vendor/github.com/xenolf/lego/acme/messages.go
index d1fac9200..a6539b96e 100644
--- a/vendor/rsc.io/letsencrypt/vendor/github.com/xenolf/lego/acme/messages.go
+++ b/vendor/github.com/xenolf/lego/acme/messages.go
@@ -22,6 +22,7 @@ type recoveryKeyMessage struct {
 type registrationMessage struct {
 	Resource string   `json:"resource"`
 	Contact  []string `json:"contact"`
+	Delete   bool     `json:"delete,omitempty"`
 	//	RecoveryKey recoveryKeyMessage `json:"recoveryKey,omitempty"`
 }
 
diff --git a/vendor/github.com/xenolf/lego/acme/pop_challenge.go b/vendor/github.com/xenolf/lego/acme/pop_challenge.go
new file mode 100644
index 000000000..8d2a213b0
--- /dev/null
+++ b/vendor/github.com/xenolf/lego/acme/pop_challenge.go
@@ -0,0 +1 @@
+package acme
diff --git a/vendor/rsc.io/letsencrypt/vendor/github.com/xenolf/lego/acme/provider.go b/vendor/github.com/xenolf/lego/acme/provider.go
similarity index 100%
rename from vendor/rsc.io/letsencrypt/vendor/github.com/xenolf/lego/acme/provider.go
rename to vendor/github.com/xenolf/lego/acme/provider.go
diff --git a/vendor/rsc.io/letsencrypt/vendor/github.com/xenolf/lego/acme/tls_sni_challenge.go b/vendor/github.com/xenolf/lego/acme/tls_sni_challenge.go
similarity index 85%
rename from vendor/rsc.io/letsencrypt/vendor/github.com/xenolf/lego/acme/tls_sni_challenge.go
rename to vendor/github.com/xenolf/lego/acme/tls_sni_challenge.go
index f184b17a5..34383cbfa 100644
--- a/vendor/rsc.io/letsencrypt/vendor/github.com/xenolf/lego/acme/tls_sni_challenge.go
+++ b/vendor/github.com/xenolf/lego/acme/tls_sni_challenge.go
@@ -41,7 +41,7 @@ func (t *tlsSNIChallenge) Solve(chlng challenge, domain string) error {
 }
 
 // TLSSNI01ChallengeCert returns a certificate and target domain for the `tls-sni-01` challenge
-func TLSSNI01ChallengeCertDomain(keyAuth string) (tls.Certificate, string, error) {
+func TLSSNI01ChallengeCert(keyAuth string) (tls.Certificate, string, error) {
 	// generate a new RSA key for the certificates
 	tempPrivKey, err := generatePrivateKey(RSA2048)
 	if err != nil {
@@ -65,9 +65,3 @@ func TLSSNI01ChallengeCertDomain(keyAuth string) (tls.Certificate, string, error
 
 	return certificate, domain, nil
 }
-
-// TLSSNI01ChallengeCert returns a certificate for the `tls-sni-01` challenge
-func TLSSNI01ChallengeCert(keyAuth string) (tls.Certificate, error) {
-	cert, _, err := TLSSNI01ChallengeCertDomain(keyAuth)
-	return cert, err
-}
diff --git a/vendor/rsc.io/letsencrypt/vendor/github.com/xenolf/lego/acme/tls_sni_challenge_server.go b/vendor/github.com/xenolf/lego/acme/tls_sni_challenge_server.go
similarity index 96%
rename from vendor/rsc.io/letsencrypt/vendor/github.com/xenolf/lego/acme/tls_sni_challenge_server.go
rename to vendor/github.com/xenolf/lego/acme/tls_sni_challenge_server.go
index faaf16f6b..df00fbb5a 100644
--- a/vendor/rsc.io/letsencrypt/vendor/github.com/xenolf/lego/acme/tls_sni_challenge_server.go
+++ b/vendor/github.com/xenolf/lego/acme/tls_sni_challenge_server.go
@@ -30,7 +30,7 @@ func (s *TLSProviderServer) Present(domain, token, keyAuth string) error {
 		s.port = "443"
 	}
 
-	cert, err := TLSSNI01ChallengeCert(keyAuth)
+	cert, _, err := TLSSNI01ChallengeCert(keyAuth)
 	if err != nil {
 		return err
 	}
diff --git a/vendor/rsc.io/letsencrypt/vendor/github.com/xenolf/lego/acme/utils.go b/vendor/github.com/xenolf/lego/acme/utils.go
similarity index 100%
rename from vendor/rsc.io/letsencrypt/vendor/github.com/xenolf/lego/acme/utils.go
rename to vendor/github.com/xenolf/lego/acme/utils.go
diff --git a/vendor/github.com/yvasiyarov/go-metrics/.gitignore b/vendor/github.com/yvasiyarov/go-metrics/.gitignore
deleted file mode 100644
index 83c8f8237..000000000
--- a/vendor/github.com/yvasiyarov/go-metrics/.gitignore
+++ /dev/null
@@ -1,9 +0,0 @@
-*.[68]
-*.a
-*.out
-*.swp
-_obj
-_testmain.go
-cmd/metrics-bench/metrics-bench
-cmd/metrics-example/metrics-example
-cmd/never-read/never-read
diff --git a/vendor/github.com/yvasiyarov/go-metrics/README.md b/vendor/github.com/yvasiyarov/go-metrics/README.md
deleted file mode 100644
index e0091a4bd..000000000
--- a/vendor/github.com/yvasiyarov/go-metrics/README.md
+++ /dev/null
@@ -1,104 +0,0 @@
-go-metrics
-==========
-
-Go port of Coda Hale's Metrics library: <https://github.com/codahale/metrics>.
-
-Documentation: <http://godoc.org/github.com/rcrowley/go-metrics>.
-
-Usage
------
-
-Create and update metrics:
-
-```go
-c := metrics.NewCounter()
-metrics.Register("foo", c)
-c.Inc(47)
-
-g := metrics.NewGauge()
-metrics.Register("bar", g)
-g.Update(47)
-
-s := metrics.NewExpDecaySample(1028, 0.015) // or metrics.NewUniformSample(1028)
-h := metrics.NewHistogram(s)
-metrics.Register("baz", h)
-h.Update(47)
-
-m := metrics.NewMeter()
-metrics.Register("quux", m)
-m.Mark(47)
-
-t := metrics.NewTimer()
-metrics.Register("bang", t)
-t.Time(func() {})
-t.Update(47)
-```
-
-Periodically log every metric in human-readable form to standard error:
-
-```go
-go metrics.Log(metrics.DefaultRegistry, 60e9, log.New(os.Stderr, "metrics: ", log.Lmicroseconds))
-```
-
-Periodically log every metric in slightly-more-parseable form to syslog:
-
-```go
-w, _ := syslog.Dial("unixgram", "/dev/log", syslog.LOG_INFO, "metrics")
-go metrics.Syslog(metrics.DefaultRegistry, 60e9, w)
-```
-
-Periodically emit every metric to Graphite:
-
-```go
-addr, _ := net.ResolveTCPAddr("tcp", "127.0.0.1:2003")
-go metrics.Graphite(metrics.DefaultRegistry, 10e9, "metrics", addr)
-```
-
-Periodically emit every metric into InfluxDB:
-
-```go
-import "github.com/rcrowley/go-metrics/influxdb"
-
-go influxdb.Influxdb(metrics.DefaultRegistry, 10e9, &influxdb.Config{
-    Host:     "127.0.0.1:8086",
-    Database: "metrics",
-    Username: "test",
-    Password: "test",
-})
-```
-
-Periodically upload every metric to Librato:
-
-```go
-import "github.com/rcrowley/go-metrics/librato"
-
-go librato.Librato(metrics.DefaultRegistry,
-    10e9,                  // interval
-    "example@example.com", // account owner email address
-    "token",               // Librato API token
-    "hostname",            // source
-    []float64{0.95},       // precentiles to send
-    time.Millisecond,      // time unit
-)
-```
-
-Periodically emit every metric to StatHat:
-
-```go
-import "github.com/rcrowley/go-metrics/stathat"
-
-go stathat.Stathat(metrics.DefaultRegistry, 10e9, "example@example.com")
-```
-
-Installation
-------------
-
-```sh
-go get github.com/rcrowley/go-metrics
-```
-
-StatHat support additionally requires their Go client:
-
-```sh
-go get github.com/stathat/go
-```
diff --git a/vendor/github.com/yvasiyarov/go-metrics/memory.md b/vendor/github.com/yvasiyarov/go-metrics/memory.md
deleted file mode 100644
index 47454f54b..000000000
--- a/vendor/github.com/yvasiyarov/go-metrics/memory.md
+++ /dev/null
@@ -1,285 +0,0 @@
-Memory usage
-============
-
-(Highly unscientific.)
-
-Command used to gather static memory usage:
-
-```sh
-grep ^Vm "/proc/$(ps fax | grep [m]etrics-bench | awk '{print $1}')/status"
-```
-
-Program used to gather baseline memory usage:
-
-```go
-package main
-
-import "time"
-
-func main() {
-	time.Sleep(600e9)
-}
-```
-
-Baseline
---------
-
-```
-VmPeak:    42604 kB
-VmSize:    42604 kB
-VmLck:         0 kB
-VmHWM:      1120 kB
-VmRSS:      1120 kB
-VmData:    35460 kB
-VmStk:       136 kB
-VmExe:      1020 kB
-VmLib:      1848 kB
-VmPTE:        36 kB
-VmSwap:        0 kB
-```
-
-Program used to gather metric memory usage (with other metrics being similar):
-
-```go
-package main
-
-import (
-	"fmt"
-	"metrics"
-	"time"
-)
-
-func main() {
-	fmt.Sprintf("foo")
-	metrics.NewRegistry()
-	time.Sleep(600e9)
-}
-```
-
-1000 counters registered
-------------------------
-
-```
-VmPeak:    44016 kB
-VmSize:    44016 kB
-VmLck:         0 kB
-VmHWM:      1928 kB
-VmRSS:      1928 kB
-VmData:    36868 kB
-VmStk:       136 kB
-VmExe:      1024 kB
-VmLib:      1848 kB
-VmPTE:        40 kB
-VmSwap:        0 kB
-```
-
-**1.412 kB virtual, TODO 0.808 kB resident per counter.**
-
-100000 counters registered
---------------------------
-
-```
-VmPeak:    55024 kB
-VmSize:    55024 kB
-VmLck:         0 kB
-VmHWM:     12440 kB
-VmRSS:     12440 kB
-VmData:    47876 kB
-VmStk:       136 kB
-VmExe:      1024 kB
-VmLib:      1848 kB
-VmPTE:        64 kB
-VmSwap:        0 kB
-```
-
-**0.1242 kB virtual, 0.1132 kB resident per counter.**
-
-1000 gauges registered
-----------------------
-
-```
-VmPeak:    44012 kB
-VmSize:    44012 kB
-VmLck:         0 kB
-VmHWM:      1928 kB
-VmRSS:      1928 kB
-VmData:    36868 kB
-VmStk:       136 kB
-VmExe:      1020 kB
-VmLib:      1848 kB
-VmPTE:        40 kB
-VmSwap:        0 kB
-```
-
-**1.408 kB virtual, 0.808 kB resident per counter.**
-
-100000 gauges registered
-------------------------
-
-```
-VmPeak:    55020 kB
-VmSize:    55020 kB
-VmLck:         0 kB
-VmHWM:     12432 kB
-VmRSS:     12432 kB
-VmData:    47876 kB
-VmStk:       136 kB
-VmExe:      1020 kB
-VmLib:      1848 kB
-VmPTE:        60 kB
-VmSwap:        0 kB
-```
-
-**0.12416 kB virtual, 0.11312 resident per gauge.**
-
-1000 histograms with a uniform sample size of 1028
---------------------------------------------------
-
-```
-VmPeak:    72272 kB
-VmSize:    72272 kB
-VmLck:         0 kB
-VmHWM:     16204 kB
-VmRSS:     16204 kB
-VmData:    65100 kB
-VmStk:       136 kB
-VmExe:      1048 kB
-VmLib:      1848 kB
-VmPTE:        80 kB
-VmSwap:        0 kB
-```
-
-**29.668 kB virtual, TODO 15.084 resident per histogram.**
-
-10000 histograms with a uniform sample size of 1028
----------------------------------------------------
-
-```
-VmPeak:   256912 kB
-VmSize:   256912 kB
-VmLck:         0 kB
-VmHWM:    146204 kB
-VmRSS:    146204 kB
-VmData:   249740 kB
-VmStk:       136 kB
-VmExe:      1048 kB
-VmLib:      1848 kB
-VmPTE:       448 kB
-VmSwap:        0 kB
-```
-
-**21.4308 kB virtual, 14.5084 kB resident per histogram.**
-
-50000 histograms with a uniform sample size of 1028
----------------------------------------------------
-
-```
-VmPeak:   908112 kB
-VmSize:   908112 kB
-VmLck:         0 kB
-VmHWM:    645832 kB
-VmRSS:    645588 kB
-VmData:   900940 kB
-VmStk:       136 kB
-VmExe:      1048 kB
-VmLib:      1848 kB
-VmPTE:      1716 kB
-VmSwap:     1544 kB
-```
-
-**17.31016 kB virtual, 12.88936 kB resident per histogram.**
-
-1000 histograms with an exponentially-decaying sample size of 1028 and alpha of 0.015
--------------------------------------------------------------------------------------
-
-```
-VmPeak:    62480 kB
-VmSize:    62480 kB
-VmLck:         0 kB
-VmHWM:     11572 kB
-VmRSS:     11572 kB
-VmData:    55308 kB
-VmStk:       136 kB
-VmExe:      1048 kB
-VmLib:      1848 kB
-VmPTE:        64 kB
-VmSwap:        0 kB
-```
-
-**19.876 kB virtual, 10.452 kB resident per histogram.**
-
-10000 histograms with an exponentially-decaying sample size of 1028 and alpha of 0.015
---------------------------------------------------------------------------------------
-
-```
-VmPeak:   153296 kB
-VmSize:   153296 kB
-VmLck:         0 kB
-VmHWM:    101176 kB
-VmRSS:    101176 kB
-VmData:   146124 kB
-VmStk:       136 kB
-VmExe:      1048 kB
-VmLib:      1848 kB
-VmPTE:       240 kB
-VmSwap:        0 kB
-```
-
-**11.0692 kB virtual, 10.0056 kB resident per histogram.**
-
-50000 histograms with an exponentially-decaying sample size of 1028 and alpha of 0.015
---------------------------------------------------------------------------------------
-
-```
-VmPeak:   557264 kB
-VmSize:   557264 kB
-VmLck:         0 kB
-VmHWM:    501056 kB
-VmRSS:    501056 kB
-VmData:   550092 kB
-VmStk:       136 kB
-VmExe:      1048 kB
-VmLib:      1848 kB
-VmPTE:      1032 kB
-VmSwap:        0 kB
-```
-
-**10.2932 kB virtual, 9.99872 kB resident per histogram.**
-
-1000 meters
------------
-
-```
-VmPeak:    74504 kB
-VmSize:    74504 kB
-VmLck:         0 kB
-VmHWM:     24124 kB
-VmRSS:     24124 kB
-VmData:    67340 kB
-VmStk:       136 kB
-VmExe:      1040 kB
-VmLib:      1848 kB
-VmPTE:        92 kB
-VmSwap:        0 kB
-```
-
-**31.9 kB virtual, 23.004 kB resident per meter.**
-
-10000 meters
-------------
-
-```
-VmPeak:   278920 kB
-VmSize:   278920 kB
-VmLck:         0 kB
-VmHWM:    227300 kB
-VmRSS:    227300 kB
-VmData:   271756 kB
-VmStk:       136 kB
-VmExe:      1040 kB
-VmLib:      1848 kB
-VmPTE:       488 kB
-VmSwap:        0 kB
-```
-
-**23.6316 kB virtual, 22.618 kB resident per meter.**
diff --git a/vendor/github.com/yvasiyarov/gorelic/.gitignore b/vendor/github.com/yvasiyarov/gorelic/.gitignore
deleted file mode 100644
index ca502e294..000000000
--- a/vendor/github.com/yvasiyarov/gorelic/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-*.nut
-*.swp
-examples/example1
-examples/example_web
diff --git a/vendor/github.com/yvasiyarov/gorelic/.travis.yml b/vendor/github.com/yvasiyarov/gorelic/.travis.yml
deleted file mode 100644
index 4f2ee4d97..000000000
--- a/vendor/github.com/yvasiyarov/gorelic/.travis.yml
+++ /dev/null
@@ -1 +0,0 @@
-language: go
diff --git a/vendor/github.com/yvasiyarov/gorelic/README.md b/vendor/github.com/yvasiyarov/gorelic/README.md
deleted file mode 100644
index 61068a82a..000000000
--- a/vendor/github.com/yvasiyarov/gorelic/README.md
+++ /dev/null
@@ -1,119 +0,0 @@
-# GoRelic
-
-New Relic agent for Go runtime. It collect a lot of metrics about scheduler, garbage collector and memory allocator and 
-send them to NewRelic.
-
-### Requirements  
-- Go 1.1 or higher
-- github.com/yvasiyarov/gorelic
-- github.com/yvasiyarov/newrelic_platform_go
-- github.com/yvasiyarov/go-metrics
-
-You have to install manually only first two dependencies. All other dependencies will be installed automatically 
-by Go toolchain.   
-
-### Installation   
-```bash
-go get github.com/yvasiyarov/gorelic
-```
-and add to the initialization part of your application following code:  
-```go
-import (
-    "github.com/yvasiyarov/gorelic"
-)
-....
-
-agent := gorelic.NewAgent()
-agent.Verbose = true
-agent.NewrelicLicense = "YOUR NEWRELIC LICENSE KEY THERE"
-agent.Run()
-
-```
-
-### Middleware  
-If you using Beego, Martini, Revel or Gin framework you can hook up gorelic with your application by using the following middleware:
-- https://github.com/yvasiyarov/beego_gorelic   
-- https://github.com/yvasiyarov/martini_gorelic   
-- https://github.com/yvasiyarov/gocraft_gorelic   
-- http://wiki.colar.net/revel_newelic
-- https://github.com/jingweno/negroni-gorelic
-- https://github.com/brandfolder/gin-gorelic
-   
-
-### Configuration  
-- NewrelicLicense - its the only mandatory setting of this agent.
-- NewrelicName - component name in NewRelic dashboard. Default value: "Go daemon"
-- NewrelicPollInterval - how often metrics will be sent to NewRelic. Default value: 60 seconds
-- Verbose - print some usefull for debugging information. Default value: false
-- CollectGcStat - should agent collect garbage collector statistic or not. Default value: true
-- CollectHTTPStat - should agent collect HTTP metrics. Default value: false
-- CollectMemoryStat - should agent collect memory allocator statistic or not. Default value: true
-- GCPollInterval - how often should GC statistic collected. Default value: 10 seconds. It has performance impact. For more information, please, see metrics documentation.
-- MemoryAllocatorPollInterval - how often should memory allocator statistic collected. Default value: 60 seconds. It has performance impact. For more information, please, read metrics documentation.
-
-
-## Metrics reported by plugin
-This agent use functions exposed by runtime or runtime/debug packages to collect most important information about Go runtime.
-
-### General metrics   
-- Runtime/General/NOGoroutines - number of runned go routines, as it reported by NumGoroutine() from runtime package
-- Runtime/General/NOCgoCalls - number of runned cgo calls, as it reported by NumCgoCall() from runtime package
-
-### Garbage collector metrics      
-- Runtime/GC/NumberOfGCCalls - Nuber of GC calls, as it reported by ReadGCStats() from runtime/debug 
-- Runtime/GC/PauseTotalTime - Total pause time diring GC calls, as it reported by ReadGCStats() from runtime/debug (in nanoseconds)
-- Runtime/GC/GCTime/Max - max GC time
-- Runtime/GC/GCTime/Min - min GC time
-- Runtime/GC/GCTime/Mean - GC mean time
-- Runtime/GC/GCTime/Percentile95 - 95% percentile of GC time
-
-All this metrics are measured in nanoseconds. Last 4 of them can be inaccurate if GC called more often then once in GCPollInterval. 
-If in your workload GC is called more often - you can consider decreasing value of GCPollInterval. 
-But be carefull, ReadGCStats() blocks mheap, so its not good idea to set GCPollInterval to very low values.
-
-### Memory allocator 
-- Component/Runtime/Memory/SysMem/Total - number of bytes/minute allocated from OS totally. 
-- Component/Runtime/Memory/SysMem/Stack - number of bytes/minute allocated from OS for stacks.
-- Component/Runtime/Memory/SysMem/MSpan - number of bytes/minute allocated from OS for internal MSpan structs.
-- Component/Runtime/Memory/SysMem/MCache - number of bytes/minute allocated from OS for internal MCache structs.
-- Component/Runtime/Memory/SysMem/Heap - number of bytes/minute allocated from OS for heap.
-- Component/Runtime/Memory/SysMem/BuckHash - number of bytes/minute allocated from OS for internal BuckHash structs.
-- Component/Runtime/Memory/Operations/NoFrees - number of memory frees per minute
-- Component/Runtime/Memory/Operations/NoMallocs - number of memory allocations per minute
-- Component/Runtime/Memory/Operations/NoPointerLookups - number of pointer lookups per minute
-- Component/Runtime/Memory/InUse/Total - total amount of memory in use
-- Component/Runtime/Memory/InUse/Heap - amount of memory in use for heap
-- Component/Runtime/Memory/InUse/MCacheInuse - amount of memory in use for MCache internal structures
-- Component/Runtime/Memory/InUse/MSpanInuse - amount of memory in use for MSpan internal structures  
-- Component/Runtime/Memory/InUse/Stack - amount of memory in use for stacks
-
-### Process metrics
-- Component/Runtime/System/Threads - number of OS threads used
-- Runtime/System/FDSize - number of file descriptors, used by process
-- Runtime/System/Memory/VmPeakSize - VM max size
-- Runtime/System/Memory/VmCurrent  - VM current size
-- Runtime/System/Memory/RssPeak    - max size of resident memory set
-- Runtime/System/Memory/RssCurrent - current size of resident memory set   
-
-All this metrics collected once in MemoryAllocatorPollInterval. In order to collect this statistic agent use ReadMemStats() routine.
-This routine calls stoptheworld() internally and it block everything. So, please, consider this when you change MemoryAllocatorPollInterval value.
-
-### HTTP metrics   
-- throughput (requests per second), calculated for last minute  
-- mean throughput (requests per second)   
-- mean response time  
-- min response time  
-- max response time  
-- 75%, 90%, 95% percentiles for response time
- 
-
-In order to collect HTTP metrics, handler functions must be wrapped using WrapHTTPHandlerFunc:
-
-```go
-http.HandleFunc("/", agent.WrapHTTPHandlerFunc(handler))
-```
-
-## TODO
-- Collect per-size allocation statistic
-- Collect user defined metrics
-
diff --git a/vendor/github.com/yvasiyarov/gorelic/nut.json b/vendor/github.com/yvasiyarov/gorelic/nut.json
deleted file mode 100644
index 7abb8ec69..000000000
--- a/vendor/github.com/yvasiyarov/gorelic/nut.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-  "Version": "0.0.6",
-  "Vendor": "yvasiyarov",
-  "Authors": [
-    {
-      "FullName": "Yuriy Vasiyarov",
-      "Email": "varyous@gmail.com"
-    }
-  ],
-  "ExtraFiles": [
-    "README.md",
-    "LICENSE"
-  ],
-  "Homepage": "https://github.com/yvasiyarov/gorelic"
-}
diff --git a/vendor/github.com/yvasiyarov/newrelic_platform_go/.travis.yml b/vendor/github.com/yvasiyarov/newrelic_platform_go/.travis.yml
deleted file mode 100644
index 4f2ee4d97..000000000
--- a/vendor/github.com/yvasiyarov/newrelic_platform_go/.travis.yml
+++ /dev/null
@@ -1 +0,0 @@
-language: go
diff --git a/vendor/github.com/yvasiyarov/newrelic_platform_go/README.md b/vendor/github.com/yvasiyarov/newrelic_platform_go/README.md
deleted file mode 100644
index 344623440..000000000
--- a/vendor/github.com/yvasiyarov/newrelic_platform_go/README.md
+++ /dev/null
@@ -1,11 +0,0 @@
-New Relic Platform Agent SDK for Go(golang)
-====================
-
-[![Build Status](https://travis-ci.org/yvasiyarov/newrelic_platform_go.png?branch=master)](https://travis-ci.org/yvasiyarov/newrelic_platform_go)
-
-This package provide very simple interface to NewRelic Platform http://newrelic.com/platform
-
-For example of usage see examples/wave_plugin.go
-
-For real-word example, you can have a look at:   
-https://github.com/yvasiyarov/newrelic_sphinx   
diff --git a/vendor/github.com/yvasiyarov/newrelic_platform_go/nut.json b/vendor/github.com/yvasiyarov/newrelic_platform_go/nut.json
deleted file mode 100644
index 1e57c3952..000000000
--- a/vendor/github.com/yvasiyarov/newrelic_platform_go/nut.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-  "Version": "0.0.1",
-  "Vendor": "yvasiyarov",
-  "Authors": [
-    {
-      "FullName": "Yuriy Vasiyarov",
-      "Email": "varyous@gmail.com"
-    }
-  ],
-  "ExtraFiles": [
-    "README.md",
-    "LICENSE"
-  ],
-  "Homepage": "https://github.com/yvasiyarov/newrelic_platform_go"
-}
diff --git a/vendor/golang.org/x/crypto/bcrypt/bcrypt.go b/vendor/golang.org/x/crypto/bcrypt/bcrypt.go
index b8e18d744..f8b807f9c 100644
--- a/vendor/golang.org/x/crypto/bcrypt/bcrypt.go
+++ b/vendor/golang.org/x/crypto/bcrypt/bcrypt.go
@@ -4,7 +4,7 @@
 
 // Package bcrypt implements Provos and Mazières's bcrypt adaptive hashing
 // algorithm. See http://www.usenix.org/event/usenix99/provos/provos.pdf
-package bcrypt
+package bcrypt // import "golang.org/x/crypto/bcrypt"
 
 // The code is a port of Provos and Mazières's C implementation.
 import (
diff --git a/vendor/golang.org/x/crypto/blowfish/cipher.go b/vendor/golang.org/x/crypto/blowfish/cipher.go
index 5019658a4..542984aa8 100644
--- a/vendor/golang.org/x/crypto/blowfish/cipher.go
+++ b/vendor/golang.org/x/crypto/blowfish/cipher.go
@@ -3,7 +3,7 @@
 // license that can be found in the LICENSE file.
 
 // Package blowfish implements Bruce Schneier's Blowfish encryption algorithm.
-package blowfish
+package blowfish // import "golang.org/x/crypto/blowfish"
 
 // The code is a port of Bruce Schneier's C implementation.
 // See http://www.schneier.com/blowfish.html.
diff --git a/vendor/golang.org/x/crypto/ocsp/ocsp.go b/vendor/golang.org/x/crypto/ocsp/ocsp.go
index f6a1bd4da..602fefa67 100644
--- a/vendor/golang.org/x/crypto/ocsp/ocsp.go
+++ b/vendor/golang.org/x/crypto/ocsp/ocsp.go
@@ -5,7 +5,7 @@
 // Package ocsp parses OCSP responses as specified in RFC 2560. OCSP responses
 // are signed messages attesting to the validity of a certificate for a small
 // period of time. This is used to manage revocation for X.509 certificates.
-package ocsp
+package ocsp // import "golang.org/x/crypto/ocsp"
 
 import (
 	"crypto"
diff --git a/vendor/golang.org/x/net/context/context.go b/vendor/golang.org/x/net/context/context.go
index 46629881b..19235cf26 100644
--- a/vendor/golang.org/x/net/context/context.go
+++ b/vendor/golang.org/x/net/context/context.go
@@ -34,7 +34,7 @@
 //
 // See http://blog.golang.org/context for example code for a server that uses
 // Contexts.
-package context
+package context // import "golang.org/x/net/context"
 
 import (
 	"errors"
diff --git a/vendor/golang.org/x/net/context/ctxhttp/ctxhttp.go b/vendor/golang.org/x/net/context/ctxhttp/ctxhttp.go
index e35860a70..a7ed8d810 100644
--- a/vendor/golang.org/x/net/context/ctxhttp/ctxhttp.go
+++ b/vendor/golang.org/x/net/context/ctxhttp/ctxhttp.go
@@ -3,7 +3,7 @@
 // license that can be found in the LICENSE file.
 
 // Package ctxhttp provides helper functions for performing context-aware HTTP requests.
-package ctxhttp
+package ctxhttp // import "golang.org/x/net/context/ctxhttp"
 
 import (
 	"io"
diff --git a/vendor/golang.org/x/net/http2/.gitignore b/vendor/golang.org/x/net/http2/.gitignore
deleted file mode 100644
index 190f12234..000000000
--- a/vendor/golang.org/x/net/http2/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-*~
-h2i/h2i
diff --git a/vendor/golang.org/x/net/http2/Dockerfile b/vendor/golang.org/x/net/http2/Dockerfile
deleted file mode 100644
index 53fc52579..000000000
--- a/vendor/golang.org/x/net/http2/Dockerfile
+++ /dev/null
@@ -1,51 +0,0 @@
-#
-# This Dockerfile builds a recent curl with HTTP/2 client support, using
-# a recent nghttp2 build.
-#
-# See the Makefile for how to tag it. If Docker and that image is found, the
-# Go tests use this curl binary for integration tests.
-#
-
-FROM ubuntu:trusty
-
-RUN apt-get update && \
-    apt-get upgrade -y && \
-    apt-get install -y git-core build-essential wget
-
-RUN apt-get install -y --no-install-recommends \
-       autotools-dev libtool pkg-config zlib1g-dev \
-       libcunit1-dev libssl-dev libxml2-dev libevent-dev \
-       automake autoconf
-
-# The list of packages nghttp2 recommends for h2load:
-RUN apt-get install -y --no-install-recommends make binutils \
-        autoconf automake autotools-dev \
-        libtool pkg-config zlib1g-dev libcunit1-dev libssl-dev libxml2-dev \
-        libev-dev libevent-dev libjansson-dev libjemalloc-dev \
-        cython python3.4-dev python-setuptools
-
-# Note: setting NGHTTP2_VER before the git clone, so an old git clone isn't cached:
-ENV NGHTTP2_VER 895da9a
-RUN cd /root && git clone https://github.com/tatsuhiro-t/nghttp2.git
-
-WORKDIR /root/nghttp2
-RUN git reset --hard $NGHTTP2_VER
-RUN autoreconf -i
-RUN automake
-RUN autoconf
-RUN ./configure
-RUN make
-RUN make install
-
-WORKDIR /root
-RUN wget http://curl.haxx.se/download/curl-7.45.0.tar.gz
-RUN tar -zxvf curl-7.45.0.tar.gz
-WORKDIR /root/curl-7.45.0
-RUN ./configure --with-ssl --with-nghttp2=/usr/local
-RUN make
-RUN make install
-RUN ldconfig
-
-CMD ["-h"]
-ENTRYPOINT ["/usr/local/bin/curl"]
-
diff --git a/vendor/golang.org/x/net/http2/Makefile b/vendor/golang.org/x/net/http2/Makefile
deleted file mode 100644
index 55fd826f7..000000000
--- a/vendor/golang.org/x/net/http2/Makefile
+++ /dev/null
@@ -1,3 +0,0 @@
-curlimage:
-	docker build -t gohttp2/curl .
-
diff --git a/vendor/golang.org/x/net/http2/README b/vendor/golang.org/x/net/http2/README
deleted file mode 100644
index 360d5aa37..000000000
--- a/vendor/golang.org/x/net/http2/README
+++ /dev/null
@@ -1,20 +0,0 @@
-This is a work-in-progress HTTP/2 implementation for Go.
-
-It will eventually live in the Go standard library and won't require
-any changes to your code to use.  It will just be automatic.
-
-Status:
-
-* The server support is pretty good. A few things are missing
-  but are being worked on.
-* The client work has just started but shares a lot of code
-  is coming along much quicker.
-
-Docs are at https://godoc.org/golang.org/x/net/http2
-
-Demo test server at https://http2.golang.org/
-
-Help & bug reports welcome!
-
-Contributing: https://golang.org/doc/contribute.html
-Bugs:         https://golang.org/issue/new?title=x/net/http2:+
diff --git a/vendor/golang.org/x/net/idna/idna.go b/vendor/golang.org/x/net/idna/idna.go
new file mode 100644
index 000000000..3daa8979e
--- /dev/null
+++ b/vendor/golang.org/x/net/idna/idna.go
@@ -0,0 +1,68 @@
+// Copyright 2012 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package idna implements IDNA2008 (Internationalized Domain Names for
+// Applications), defined in RFC 5890, RFC 5891, RFC 5892, RFC 5893 and
+// RFC 5894.
+package idna // import "golang.org/x/net/idna"
+
+import (
+	"strings"
+	"unicode/utf8"
+)
+
+// TODO(nigeltao): specify when errors occur. For example, is ToASCII(".") or
+// ToASCII("foo\x00") an error? See also http://www.unicode.org/faq/idn.html#11
+
+// acePrefix is the ASCII Compatible Encoding prefix.
+const acePrefix = "xn--"
+
+// ToASCII converts a domain or domain label to its ASCII form. For example,
+// ToASCII("bücher.example.com") is "xn--bcher-kva.example.com", and
+// ToASCII("golang") is "golang".
+func ToASCII(s string) (string, error) {
+	if ascii(s) {
+		return s, nil
+	}
+	labels := strings.Split(s, ".")
+	for i, label := range labels {
+		if !ascii(label) {
+			a, err := encode(acePrefix, label)
+			if err != nil {
+				return "", err
+			}
+			labels[i] = a
+		}
+	}
+	return strings.Join(labels, "."), nil
+}
+
+// ToUnicode converts a domain or domain label to its Unicode form. For example,
+// ToUnicode("xn--bcher-kva.example.com") is "bücher.example.com", and
+// ToUnicode("golang") is "golang".
+func ToUnicode(s string) (string, error) {
+	if !strings.Contains(s, acePrefix) {
+		return s, nil
+	}
+	labels := strings.Split(s, ".")
+	for i, label := range labels {
+		if strings.HasPrefix(label, acePrefix) {
+			u, err := decode(label[len(acePrefix):])
+			if err != nil {
+				return "", err
+			}
+			labels[i] = u
+		}
+	}
+	return strings.Join(labels, "."), nil
+}
+
+func ascii(s string) bool {
+	for i := 0; i < len(s); i++ {
+		if s[i] >= utf8.RuneSelf {
+			return false
+		}
+	}
+	return true
+}
diff --git a/vendor/golang.org/x/net/idna/punycode.go b/vendor/golang.org/x/net/idna/punycode.go
new file mode 100644
index 000000000..92e733f6a
--- /dev/null
+++ b/vendor/golang.org/x/net/idna/punycode.go
@@ -0,0 +1,200 @@
+// Copyright 2012 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package idna
+
+// This file implements the Punycode algorithm from RFC 3492.
+
+import (
+	"fmt"
+	"math"
+	"strings"
+	"unicode/utf8"
+)
+
+// These parameter values are specified in section 5.
+//
+// All computation is done with int32s, so that overflow behavior is identical
+// regardless of whether int is 32-bit or 64-bit.
+const (
+	base        int32 = 36
+	damp        int32 = 700
+	initialBias int32 = 72
+	initialN    int32 = 128
+	skew        int32 = 38
+	tmax        int32 = 26
+	tmin        int32 = 1
+)
+
+// decode decodes a string as specified in section 6.2.
+func decode(encoded string) (string, error) {
+	if encoded == "" {
+		return "", nil
+	}
+	pos := 1 + strings.LastIndex(encoded, "-")
+	if pos == 1 {
+		return "", fmt.Errorf("idna: invalid label %q", encoded)
+	}
+	if pos == len(encoded) {
+		return encoded[:len(encoded)-1], nil
+	}
+	output := make([]rune, 0, len(encoded))
+	if pos != 0 {
+		for _, r := range encoded[:pos-1] {
+			output = append(output, r)
+		}
+	}
+	i, n, bias := int32(0), initialN, initialBias
+	for pos < len(encoded) {
+		oldI, w := i, int32(1)
+		for k := base; ; k += base {
+			if pos == len(encoded) {
+				return "", fmt.Errorf("idna: invalid label %q", encoded)
+			}
+			digit, ok := decodeDigit(encoded[pos])
+			if !ok {
+				return "", fmt.Errorf("idna: invalid label %q", encoded)
+			}
+			pos++
+			i += digit * w
+			if i < 0 {
+				return "", fmt.Errorf("idna: invalid label %q", encoded)
+			}
+			t := k - bias
+			if t < tmin {
+				t = tmin
+			} else if t > tmax {
+				t = tmax
+			}
+			if digit < t {
+				break
+			}
+			w *= base - t
+			if w >= math.MaxInt32/base {
+				return "", fmt.Errorf("idna: invalid label %q", encoded)
+			}
+		}
+		x := int32(len(output) + 1)
+		bias = adapt(i-oldI, x, oldI == 0)
+		n += i / x
+		i %= x
+		if n > utf8.MaxRune || len(output) >= 1024 {
+			return "", fmt.Errorf("idna: invalid label %q", encoded)
+		}
+		output = append(output, 0)
+		copy(output[i+1:], output[i:])
+		output[i] = n
+		i++
+	}
+	return string(output), nil
+}
+
+// encode encodes a string as specified in section 6.3 and prepends prefix to
+// the result.
+//
+// The "while h < length(input)" line in the specification becomes "for
+// remaining != 0" in the Go code, because len(s) in Go is in bytes, not runes.
+func encode(prefix, s string) (string, error) {
+	output := make([]byte, len(prefix), len(prefix)+1+2*len(s))
+	copy(output, prefix)
+	delta, n, bias := int32(0), initialN, initialBias
+	b, remaining := int32(0), int32(0)
+	for _, r := range s {
+		if r < 0x80 {
+			b++
+			output = append(output, byte(r))
+		} else {
+			remaining++
+		}
+	}
+	h := b
+	if b > 0 {
+		output = append(output, '-')
+	}
+	for remaining != 0 {
+		m := int32(0x7fffffff)
+		for _, r := range s {
+			if m > r && r >= n {
+				m = r
+			}
+		}
+		delta += (m - n) * (h + 1)
+		if delta < 0 {
+			return "", fmt.Errorf("idna: invalid label %q", s)
+		}
+		n = m
+		for _, r := range s {
+			if r < n {
+				delta++
+				if delta < 0 {
+					return "", fmt.Errorf("idna: invalid label %q", s)
+				}
+				continue
+			}
+			if r > n {
+				continue
+			}
+			q := delta
+			for k := base; ; k += base {
+				t := k - bias
+				if t < tmin {
+					t = tmin
+				} else if t > tmax {
+					t = tmax
+				}
+				if q < t {
+					break
+				}
+				output = append(output, encodeDigit(t+(q-t)%(base-t)))
+				q = (q - t) / (base - t)
+			}
+			output = append(output, encodeDigit(q))
+			bias = adapt(delta, h+1, h == b)
+			delta = 0
+			h++
+			remaining--
+		}
+		delta++
+		n++
+	}
+	return string(output), nil
+}
+
+func decodeDigit(x byte) (digit int32, ok bool) {
+	switch {
+	case '0' <= x && x <= '9':
+		return int32(x - ('0' - 26)), true
+	case 'A' <= x && x <= 'Z':
+		return int32(x - 'A'), true
+	case 'a' <= x && x <= 'z':
+		return int32(x - 'a'), true
+	}
+	return 0, false
+}
+
+func encodeDigit(digit int32) byte {
+	switch {
+	case 0 <= digit && digit < 26:
+		return byte(digit + 'a')
+	case 26 <= digit && digit < 36:
+		return byte(digit + ('0' - 26))
+	}
+	panic("idna: internal error in punycode encoding")
+}
+
+// adapt is the bias adaptation function specified in section 6.1.
+func adapt(delta, numPoints int32, firstTime bool) int32 {
+	if firstTime {
+		delta /= damp
+	} else {
+		delta /= 2
+	}
+	delta += delta / numPoints
+	k := int32(0)
+	for delta > ((base-tmin)*tmax)/2 {
+		delta /= base - tmin
+		k += base
+	}
+	return k + (base-tmin+1)*delta/(delta+skew)
+}
diff --git a/vendor/golang.org/x/net/internal/timeseries/timeseries.go b/vendor/golang.org/x/net/internal/timeseries/timeseries.go
index 3f90b7300..1119f3448 100644
--- a/vendor/golang.org/x/net/internal/timeseries/timeseries.go
+++ b/vendor/golang.org/x/net/internal/timeseries/timeseries.go
@@ -3,7 +3,7 @@
 // license that can be found in the LICENSE file.
 
 // Package timeseries implements a time series structure for stats collection.
-package timeseries
+package timeseries // import "golang.org/x/net/internal/timeseries"
 
 import (
 	"fmt"
diff --git a/vendor/golang.org/x/net/publicsuffix/gen.go b/vendor/golang.org/x/net/publicsuffix/gen.go
new file mode 100644
index 000000000..5c8d7b5fb
--- /dev/null
+++ b/vendor/golang.org/x/net/publicsuffix/gen.go
@@ -0,0 +1,663 @@
+// Copyright 2012 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build ignore
+
+package main
+
+// This program generates table.go and table_test.go.
+// Invoke as:
+//
+//	go run gen.go -version "xxx"       >table.go
+//	go run gen.go -version "xxx" -test >table_test.go
+//
+// Pass -v to print verbose progress information.
+//
+// The version is derived from information found at
+// https://github.com/publicsuffix/list/commits/master/public_suffix_list.dat
+//
+// To fetch a particular git revision, such as 5c70ccd250, pass
+// -url "https://raw.githubusercontent.com/publicsuffix/list/5c70ccd250/public_suffix_list.dat"
+
+import (
+	"bufio"
+	"bytes"
+	"flag"
+	"fmt"
+	"go/format"
+	"io"
+	"net/http"
+	"os"
+	"regexp"
+	"sort"
+	"strings"
+
+	"golang.org/x/net/idna"
+)
+
+const (
+	// These sum of these four values must be no greater than 32.
+	nodesBitsChildren   = 9
+	nodesBitsICANN      = 1
+	nodesBitsTextOffset = 15
+	nodesBitsTextLength = 6
+
+	// These sum of these four values must be no greater than 32.
+	childrenBitsWildcard = 1
+	childrenBitsNodeType = 2
+	childrenBitsHi       = 14
+	childrenBitsLo       = 14
+)
+
+var (
+	maxChildren   int
+	maxTextOffset int
+	maxTextLength int
+	maxHi         uint32
+	maxLo         uint32
+)
+
+func max(a, b int) int {
+	if a < b {
+		return b
+	}
+	return a
+}
+
+func u32max(a, b uint32) uint32 {
+	if a < b {
+		return b
+	}
+	return a
+}
+
+const (
+	nodeTypeNormal     = 0
+	nodeTypeException  = 1
+	nodeTypeParentOnly = 2
+	numNodeType        = 3
+)
+
+func nodeTypeStr(n int) string {
+	switch n {
+	case nodeTypeNormal:
+		return "+"
+	case nodeTypeException:
+		return "!"
+	case nodeTypeParentOnly:
+		return "o"
+	}
+	panic("unreachable")
+}
+
+var (
+	labelEncoding = map[string]uint32{}
+	labelsList    = []string{}
+	labelsMap     = map[string]bool{}
+	rules         = []string{}
+
+	// validSuffix is used to check that the entries in the public suffix list
+	// are in canonical form (after Punycode encoding). Specifically, capital
+	// letters are not allowed.
+	validSuffix = regexp.MustCompile(`^[a-z0-9_\!\*\-\.]+$`)
+
+	subset = flag.Bool("subset", false, "generate only a subset of the full table, for debugging")
+	url    = flag.String("url",
+		"https://publicsuffix.org/list/effective_tld_names.dat",
+		"URL of the publicsuffix.org list. If empty, stdin is read instead")
+	v       = flag.Bool("v", false, "verbose output (to stderr)")
+	version = flag.String("version", "", "the effective_tld_names.dat version")
+	test    = flag.Bool("test", false, "generate table_test.go")
+)
+
+func main() {
+	if err := main1(); err != nil {
+		fmt.Fprintln(os.Stderr, err)
+		os.Exit(1)
+	}
+}
+
+func main1() error {
+	flag.Parse()
+	if nodesBitsTextLength+nodesBitsTextOffset+nodesBitsICANN+nodesBitsChildren > 32 {
+		return fmt.Errorf("not enough bits to encode the nodes table")
+	}
+	if childrenBitsLo+childrenBitsHi+childrenBitsNodeType+childrenBitsWildcard > 32 {
+		return fmt.Errorf("not enough bits to encode the children table")
+	}
+	if *version == "" {
+		return fmt.Errorf("-version was not specified")
+	}
+	var r io.Reader = os.Stdin
+	if *url != "" {
+		res, err := http.Get(*url)
+		if err != nil {
+			return err
+		}
+		if res.StatusCode != http.StatusOK {
+			return fmt.Errorf("bad GET status for %s: %d", *url, res.Status)
+		}
+		r = res.Body
+		defer res.Body.Close()
+	}
+
+	var root node
+	icann := false
+	buf := new(bytes.Buffer)
+	br := bufio.NewReader(r)
+	for {
+		s, err := br.ReadString('\n')
+		if err != nil {
+			if err == io.EOF {
+				break
+			}
+			return err
+		}
+		s = strings.TrimSpace(s)
+		if strings.Contains(s, "BEGIN ICANN DOMAINS") {
+			icann = true
+			continue
+		}
+		if strings.Contains(s, "END ICANN DOMAINS") {
+			icann = false
+			continue
+		}
+		if s == "" || strings.HasPrefix(s, "//") {
+			continue
+		}
+		s, err = idna.ToASCII(s)
+		if err != nil {
+			return err
+		}
+		if !validSuffix.MatchString(s) {
+			return fmt.Errorf("bad publicsuffix.org list data: %q", s)
+		}
+
+		if *subset {
+			switch {
+			case s == "ac.jp" || strings.HasSuffix(s, ".ac.jp"):
+			case s == "ak.us" || strings.HasSuffix(s, ".ak.us"):
+			case s == "ao" || strings.HasSuffix(s, ".ao"):
+			case s == "ar" || strings.HasSuffix(s, ".ar"):
+			case s == "arpa" || strings.HasSuffix(s, ".arpa"):
+			case s == "cy" || strings.HasSuffix(s, ".cy"):
+			case s == "dyndns.org" || strings.HasSuffix(s, ".dyndns.org"):
+			case s == "jp":
+			case s == "kobe.jp" || strings.HasSuffix(s, ".kobe.jp"):
+			case s == "kyoto.jp" || strings.HasSuffix(s, ".kyoto.jp"):
+			case s == "om" || strings.HasSuffix(s, ".om"):
+			case s == "uk" || strings.HasSuffix(s, ".uk"):
+			case s == "uk.com" || strings.HasSuffix(s, ".uk.com"):
+			case s == "tw" || strings.HasSuffix(s, ".tw"):
+			case s == "zw" || strings.HasSuffix(s, ".zw"):
+			case s == "xn--p1ai" || strings.HasSuffix(s, ".xn--p1ai"):
+				// xn--p1ai is Russian-Cyrillic "рф".
+			default:
+				continue
+			}
+		}
+
+		rules = append(rules, s)
+
+		nt, wildcard := nodeTypeNormal, false
+		switch {
+		case strings.HasPrefix(s, "*."):
+			s, nt = s[2:], nodeTypeParentOnly
+			wildcard = true
+		case strings.HasPrefix(s, "!"):
+			s, nt = s[1:], nodeTypeException
+		}
+		labels := strings.Split(s, ".")
+		for n, i := &root, len(labels)-1; i >= 0; i-- {
+			label := labels[i]
+			n = n.child(label)
+			if i == 0 {
+				if nt != nodeTypeParentOnly && n.nodeType == nodeTypeParentOnly {
+					n.nodeType = nt
+				}
+				n.icann = n.icann && icann
+				n.wildcard = n.wildcard || wildcard
+			}
+			labelsMap[label] = true
+		}
+	}
+	labelsList = make([]string, 0, len(labelsMap))
+	for label := range labelsMap {
+		labelsList = append(labelsList, label)
+	}
+	sort.Strings(labelsList)
+
+	p := printReal
+	if *test {
+		p = printTest
+	}
+	if err := p(buf, &root); err != nil {
+		return err
+	}
+
+	b, err := format.Source(buf.Bytes())
+	if err != nil {
+		return err
+	}
+	_, err = os.Stdout.Write(b)
+	return err
+}
+
+func printTest(w io.Writer, n *node) error {
+	fmt.Fprintf(w, "// generated by go run gen.go; DO NOT EDIT\n\n")
+	fmt.Fprintf(w, "package publicsuffix\n\nvar rules = [...]string{\n")
+	for _, rule := range rules {
+		fmt.Fprintf(w, "%q,\n", rule)
+	}
+	fmt.Fprintf(w, "}\n\nvar nodeLabels = [...]string{\n")
+	if err := n.walk(w, printNodeLabel); err != nil {
+		return err
+	}
+	fmt.Fprintf(w, "}\n")
+	return nil
+}
+
+func printReal(w io.Writer, n *node) error {
+	const header = `// generated by go run gen.go; DO NOT EDIT
+
+package publicsuffix
+
+const version = %q
+
+const (
+	nodesBitsChildren   = %d
+	nodesBitsICANN      = %d
+	nodesBitsTextOffset = %d
+	nodesBitsTextLength = %d
+
+	childrenBitsWildcard = %d
+	childrenBitsNodeType = %d
+	childrenBitsHi       = %d
+	childrenBitsLo       = %d
+)
+
+const (
+	nodeTypeNormal     = %d
+	nodeTypeException  = %d
+	nodeTypeParentOnly = %d
+)
+
+// numTLD is the number of top level domains.
+const numTLD = %d
+
+`
+	fmt.Fprintf(w, header, *version,
+		nodesBitsChildren, nodesBitsICANN, nodesBitsTextOffset, nodesBitsTextLength,
+		childrenBitsWildcard, childrenBitsNodeType, childrenBitsHi, childrenBitsLo,
+		nodeTypeNormal, nodeTypeException, nodeTypeParentOnly, len(n.children))
+
+	text := combineText(labelsList)
+	if text == "" {
+		return fmt.Errorf("internal error: makeText returned no text")
+	}
+	for _, label := range labelsList {
+		offset, length := strings.Index(text, label), len(label)
+		if offset < 0 {
+			return fmt.Errorf("internal error: could not find %q in text %q", label, text)
+		}
+		maxTextOffset, maxTextLength = max(maxTextOffset, offset), max(maxTextLength, length)
+		if offset >= 1<<nodesBitsTextOffset {
+			return fmt.Errorf("text offset %d is too large, or nodeBitsTextOffset is too small", offset)
+		}
+		if length >= 1<<nodesBitsTextLength {
+			return fmt.Errorf("text length %d is too large, or nodeBitsTextLength is too small", length)
+		}
+		labelEncoding[label] = uint32(offset)<<nodesBitsTextLength | uint32(length)
+	}
+	fmt.Fprintf(w, "// Text is the combined text of all labels.\nconst text = ")
+	for len(text) > 0 {
+		n, plus := len(text), ""
+		if n > 64 {
+			n, plus = 64, " +"
+		}
+		fmt.Fprintf(w, "%q%s\n", text[:n], plus)
+		text = text[n:]
+	}
+
+	if err := n.walk(w, assignIndexes); err != nil {
+		return err
+	}
+
+	fmt.Fprintf(w, `
+
+// nodes is the list of nodes. Each node is represented as a uint32, which
+// encodes the node's children, wildcard bit and node type (as an index into
+// the children array), ICANN bit and text.
+//
+// In the //-comment after each node's data, the nodes indexes of the children
+// are formatted as (n0x1234-n0x1256), with * denoting the wildcard bit. The
+// nodeType is printed as + for normal, ! for exception, and o for parent-only
+// nodes that have children but don't match a domain label in their own right.
+// An I denotes an ICANN domain.
+//
+// The layout within the uint32, from MSB to LSB, is:
+//	[%2d bits] unused
+//	[%2d bits] children index
+//	[%2d bits] ICANN bit
+//	[%2d bits] text index
+//	[%2d bits] text length
+var nodes = [...]uint32{
+`,
+		32-nodesBitsChildren-nodesBitsICANN-nodesBitsTextOffset-nodesBitsTextLength,
+		nodesBitsChildren, nodesBitsICANN, nodesBitsTextOffset, nodesBitsTextLength)
+	if err := n.walk(w, printNode); err != nil {
+		return err
+	}
+	fmt.Fprintf(w, `}
+
+// children is the list of nodes' children, the parent's wildcard bit and the
+// parent's node type. If a node has no children then their children index
+// will be in the range [0, 6), depending on the wildcard bit and node type.
+//
+// The layout within the uint32, from MSB to LSB, is:
+//	[%2d bits] unused
+//	[%2d bits] wildcard bit
+//	[%2d bits] node type
+//	[%2d bits] high nodes index (exclusive) of children
+//	[%2d bits] low nodes index (inclusive) of children
+var children=[...]uint32{
+`,
+		32-childrenBitsWildcard-childrenBitsNodeType-childrenBitsHi-childrenBitsLo,
+		childrenBitsWildcard, childrenBitsNodeType, childrenBitsHi, childrenBitsLo)
+	for i, c := range childrenEncoding {
+		s := "---------------"
+		lo := c & (1<<childrenBitsLo - 1)
+		hi := (c >> childrenBitsLo) & (1<<childrenBitsHi - 1)
+		if lo != hi {
+			s = fmt.Sprintf("n0x%04x-n0x%04x", lo, hi)
+		}
+		nodeType := int(c>>(childrenBitsLo+childrenBitsHi)) & (1<<childrenBitsNodeType - 1)
+		wildcard := c>>(childrenBitsLo+childrenBitsHi+childrenBitsNodeType) != 0
+		fmt.Fprintf(w, "0x%08x, // c0x%04x (%s)%s %s\n",
+			c, i, s, wildcardStr(wildcard), nodeTypeStr(nodeType))
+	}
+	fmt.Fprintf(w, "}\n\n")
+	fmt.Fprintf(w, "// max children %d (capacity %d)\n", maxChildren, 1<<nodesBitsChildren-1)
+	fmt.Fprintf(w, "// max text offset %d (capacity %d)\n", maxTextOffset, 1<<nodesBitsTextOffset-1)
+	fmt.Fprintf(w, "// max text length %d (capacity %d)\n", maxTextLength, 1<<nodesBitsTextLength-1)
+	fmt.Fprintf(w, "// max hi %d (capacity %d)\n", maxHi, 1<<childrenBitsHi-1)
+	fmt.Fprintf(w, "// max lo %d (capacity %d)\n", maxLo, 1<<childrenBitsLo-1)
+	return nil
+}
+
+type node struct {
+	label    string
+	nodeType int
+	icann    bool
+	wildcard bool
+	// nodesIndex and childrenIndex are the index of this node in the nodes
+	// and the index of its children offset/length in the children arrays.
+	nodesIndex, childrenIndex int
+	// firstChild is the index of this node's first child, or zero if this
+	// node has no children.
+	firstChild int
+	// children are the node's children, in strictly increasing node label order.
+	children []*node
+}
+
+func (n *node) walk(w io.Writer, f func(w1 io.Writer, n1 *node) error) error {
+	if err := f(w, n); err != nil {
+		return err
+	}
+	for _, c := range n.children {
+		if err := c.walk(w, f); err != nil {
+			return err
+		}
+	}
+	return nil
+}
+
+// child returns the child of n with the given label. The child is created if
+// it did not exist beforehand.
+func (n *node) child(label string) *node {
+	for _, c := range n.children {
+		if c.label == label {
+			return c
+		}
+	}
+	c := &node{
+		label:    label,
+		nodeType: nodeTypeParentOnly,
+		icann:    true,
+	}
+	n.children = append(n.children, c)
+	sort.Sort(byLabel(n.children))
+	return c
+}
+
+type byLabel []*node
+
+func (b byLabel) Len() int           { return len(b) }
+func (b byLabel) Swap(i, j int)      { b[i], b[j] = b[j], b[i] }
+func (b byLabel) Less(i, j int) bool { return b[i].label < b[j].label }
+
+var nextNodesIndex int
+
+// childrenEncoding are the encoded entries in the generated children array.
+// All these pre-defined entries have no children.
+var childrenEncoding = []uint32{
+	0 << (childrenBitsLo + childrenBitsHi), // Without wildcard bit, nodeTypeNormal.
+	1 << (childrenBitsLo + childrenBitsHi), // Without wildcard bit, nodeTypeException.
+	2 << (childrenBitsLo + childrenBitsHi), // Without wildcard bit, nodeTypeParentOnly.
+	4 << (childrenBitsLo + childrenBitsHi), // With wildcard bit, nodeTypeNormal.
+	5 << (childrenBitsLo + childrenBitsHi), // With wildcard bit, nodeTypeException.
+	6 << (childrenBitsLo + childrenBitsHi), // With wildcard bit, nodeTypeParentOnly.
+}
+
+var firstCallToAssignIndexes = true
+
+func assignIndexes(w io.Writer, n *node) error {
+	if len(n.children) != 0 {
+		// Assign nodesIndex.
+		n.firstChild = nextNodesIndex
+		for _, c := range n.children {
+			c.nodesIndex = nextNodesIndex
+			nextNodesIndex++
+		}
+
+		// The root node's children is implicit.
+		if firstCallToAssignIndexes {
+			firstCallToAssignIndexes = false
+			return nil
+		}
+
+		// Assign childrenIndex.
+		maxChildren = max(maxChildren, len(childrenEncoding))
+		if len(childrenEncoding) >= 1<<nodesBitsChildren {
+			return fmt.Errorf("children table size %d is too large, or nodeBitsChildren is too small", len(childrenEncoding))
+		}
+		n.childrenIndex = len(childrenEncoding)
+		lo := uint32(n.firstChild)
+		hi := lo + uint32(len(n.children))
+		maxLo, maxHi = u32max(maxLo, lo), u32max(maxHi, hi)
+		if lo >= 1<<childrenBitsLo {
+			return fmt.Errorf("children lo %d is too large, or childrenBitsLo is too small", lo)
+		}
+		if hi >= 1<<childrenBitsHi {
+			return fmt.Errorf("children hi %d is too large, or childrenBitsHi is too small", hi)
+		}
+		enc := hi<<childrenBitsLo | lo
+		enc |= uint32(n.nodeType) << (childrenBitsLo + childrenBitsHi)
+		if n.wildcard {
+			enc |= 1 << (childrenBitsLo + childrenBitsHi + childrenBitsNodeType)
+		}
+		childrenEncoding = append(childrenEncoding, enc)
+	} else {
+		n.childrenIndex = n.nodeType
+		if n.wildcard {
+			n.childrenIndex += numNodeType
+		}
+	}
+	return nil
+}
+
+func printNode(w io.Writer, n *node) error {
+	for _, c := range n.children {
+		s := "---------------"
+		if len(c.children) != 0 {
+			s = fmt.Sprintf("n0x%04x-n0x%04x", c.firstChild, c.firstChild+len(c.children))
+		}
+		encoding := labelEncoding[c.label]
+		if c.icann {
+			encoding |= 1 << (nodesBitsTextLength + nodesBitsTextOffset)
+		}
+		encoding |= uint32(c.childrenIndex) << (nodesBitsTextLength + nodesBitsTextOffset + nodesBitsICANN)
+		fmt.Fprintf(w, "0x%08x, // n0x%04x c0x%04x (%s)%s %s %s %s\n",
+			encoding, c.nodesIndex, c.childrenIndex, s, wildcardStr(c.wildcard),
+			nodeTypeStr(c.nodeType), icannStr(c.icann), c.label,
+		)
+	}
+	return nil
+}
+
+func printNodeLabel(w io.Writer, n *node) error {
+	for _, c := range n.children {
+		fmt.Fprintf(w, "%q,\n", c.label)
+	}
+	return nil
+}
+
+func icannStr(icann bool) string {
+	if icann {
+		return "I"
+	}
+	return " "
+}
+
+func wildcardStr(wildcard bool) string {
+	if wildcard {
+		return "*"
+	}
+	return " "
+}
+
+// combineText combines all the strings in labelsList to form one giant string.
+// Overlapping strings will be merged: "arpa" and "parliament" could yield
+// "arparliament".
+func combineText(labelsList []string) string {
+	beforeLength := 0
+	for _, s := range labelsList {
+		beforeLength += len(s)
+	}
+
+	text := crush(removeSubstrings(labelsList))
+	if *v {
+		fmt.Fprintf(os.Stderr, "crushed %d bytes to become %d bytes\n", beforeLength, len(text))
+	}
+	return text
+}
+
+type byLength []string
+
+func (s byLength) Len() int           { return len(s) }
+func (s byLength) Swap(i, j int)      { s[i], s[j] = s[j], s[i] }
+func (s byLength) Less(i, j int) bool { return len(s[i]) < len(s[j]) }
+
+// removeSubstrings returns a copy of its input with any strings removed
+// that are substrings of other provided strings.
+func removeSubstrings(input []string) []string {
+	// Make a copy of input.
+	ss := append(make([]string, 0, len(input)), input...)
+	sort.Sort(byLength(ss))
+
+	for i, shortString := range ss {
+		// For each string, only consider strings higher than it in sort order, i.e.
+		// of equal length or greater.
+		for _, longString := range ss[i+1:] {
+			if strings.Contains(longString, shortString) {
+				ss[i] = ""
+				break
+			}
+		}
+	}
+
+	// Remove the empty strings.
+	sort.Strings(ss)
+	for len(ss) > 0 && ss[0] == "" {
+		ss = ss[1:]
+	}
+	return ss
+}
+
+// crush combines a list of strings, taking advantage of overlaps. It returns a
+// single string that contains each input string as a substring.
+func crush(ss []string) string {
+	maxLabelLen := 0
+	for _, s := range ss {
+		if maxLabelLen < len(s) {
+			maxLabelLen = len(s)
+		}
+	}
+
+	for prefixLen := maxLabelLen; prefixLen > 0; prefixLen-- {
+		prefixes := makePrefixMap(ss, prefixLen)
+		for i, s := range ss {
+			if len(s) <= prefixLen {
+				continue
+			}
+			mergeLabel(ss, i, prefixLen, prefixes)
+		}
+	}
+
+	return strings.Join(ss, "")
+}
+
+// mergeLabel merges the label at ss[i] with the first available matching label
+// in prefixMap, where the last "prefixLen" characters in ss[i] match the first
+// "prefixLen" characters in the matching label.
+// It will merge ss[i] repeatedly until no more matches are available.
+// All matching labels merged into ss[i] are replaced by "".
+func mergeLabel(ss []string, i, prefixLen int, prefixes prefixMap) {
+	s := ss[i]
+	suffix := s[len(s)-prefixLen:]
+	for _, j := range prefixes[suffix] {
+		// Empty strings mean "already used." Also avoid merging with self.
+		if ss[j] == "" || i == j {
+			continue
+		}
+		if *v {
+			fmt.Fprintf(os.Stderr, "%d-length overlap at (%4d,%4d): %q and %q share %q\n",
+				prefixLen, i, j, ss[i], ss[j], suffix)
+		}
+		ss[i] += ss[j][prefixLen:]
+		ss[j] = ""
+		// ss[i] has a new suffix, so merge again if possible.
+		// Note: we only have to merge again at the same prefix length. Shorter
+		// prefix lengths will be handled in the next iteration of crush's for loop.
+		// Can there be matches for longer prefix lengths, introduced by the merge?
+		// I believe that any such matches would by necessity have been eliminated
+		// during substring removal or merged at a higher prefix length. For
+		// instance, in crush("abc", "cde", "bcdef"), combining "abc" and "cde"
+		// would yield "abcde", which could be merged with "bcdef." However, in
+		// practice "cde" would already have been elimintated by removeSubstrings.
+		mergeLabel(ss, i, prefixLen, prefixes)
+		return
+	}
+}
+
+// prefixMap maps from a prefix to a list of strings containing that prefix. The
+// list of strings is represented as indexes into a slice of strings stored
+// elsewhere.
+type prefixMap map[string][]int
+
+// makePrefixMap constructs a prefixMap from a slice of strings.
+func makePrefixMap(ss []string, prefixLen int) prefixMap {
+	prefixes := make(prefixMap)
+	for i, s := range ss {
+		// We use < rather than <= because if a label matches on a prefix equal to
+		// its full length, that's actually a substring match handled by
+		// removeSubstrings.
+		if prefixLen < len(s) {
+			prefix := s[:prefixLen]
+			prefixes[prefix] = append(prefixes[prefix], i)
+		}
+	}
+
+	return prefixes
+}
diff --git a/vendor/golang.org/x/net/publicsuffix/list.go b/vendor/golang.org/x/net/publicsuffix/list.go
new file mode 100644
index 000000000..9419ca992
--- /dev/null
+++ b/vendor/golang.org/x/net/publicsuffix/list.go
@@ -0,0 +1,133 @@
+// Copyright 2012 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package publicsuffix provides a public suffix list based on data from
+// http://publicsuffix.org/. A public suffix is one under which Internet users
+// can directly register names.
+package publicsuffix // import "golang.org/x/net/publicsuffix"
+
+// TODO: specify case sensitivity and leading/trailing dot behavior for
+// func PublicSuffix and func EffectiveTLDPlusOne.
+
+import (
+	"fmt"
+	"net/http/cookiejar"
+	"strings"
+)
+
+// List implements the cookiejar.PublicSuffixList interface by calling the
+// PublicSuffix function.
+var List cookiejar.PublicSuffixList = list{}
+
+type list struct{}
+
+func (list) PublicSuffix(domain string) string {
+	ps, _ := PublicSuffix(domain)
+	return ps
+}
+
+func (list) String() string {
+	return version
+}
+
+// PublicSuffix returns the public suffix of the domain using a copy of the
+// publicsuffix.org database compiled into the library.
+//
+// icann is whether the public suffix is managed by the Internet Corporation
+// for Assigned Names and Numbers. If not, the public suffix is privately
+// managed. For example, foo.org and foo.co.uk are ICANN domains,
+// foo.dyndns.org and foo.blogspot.co.uk are private domains.
+//
+// Use cases for distinguishing ICANN domains like foo.com from private
+// domains like foo.appspot.com can be found at
+// https://wiki.mozilla.org/Public_Suffix_List/Use_Cases
+func PublicSuffix(domain string) (publicSuffix string, icann bool) {
+	lo, hi := uint32(0), uint32(numTLD)
+	s, suffix, wildcard := domain, len(domain), false
+loop:
+	for {
+		dot := strings.LastIndex(s, ".")
+		if wildcard {
+			suffix = 1 + dot
+		}
+		if lo == hi {
+			break
+		}
+		f := find(s[1+dot:], lo, hi)
+		if f == notFound {
+			break
+		}
+
+		u := nodes[f] >> (nodesBitsTextOffset + nodesBitsTextLength)
+		icann = u&(1<<nodesBitsICANN-1) != 0
+		u >>= nodesBitsICANN
+		u = children[u&(1<<nodesBitsChildren-1)]
+		lo = u & (1<<childrenBitsLo - 1)
+		u >>= childrenBitsLo
+		hi = u & (1<<childrenBitsHi - 1)
+		u >>= childrenBitsHi
+		switch u & (1<<childrenBitsNodeType - 1) {
+		case nodeTypeNormal:
+			suffix = 1 + dot
+		case nodeTypeException:
+			suffix = 1 + len(s)
+			break loop
+		}
+		u >>= childrenBitsNodeType
+		wildcard = u&(1<<childrenBitsWildcard-1) != 0
+
+		if dot == -1 {
+			break
+		}
+		s = s[:dot]
+	}
+	if suffix == len(domain) {
+		// If no rules match, the prevailing rule is "*".
+		return domain[1+strings.LastIndex(domain, "."):], icann
+	}
+	return domain[suffix:], icann
+}
+
+const notFound uint32 = 1<<32 - 1
+
+// find returns the index of the node in the range [lo, hi) whose label equals
+// label, or notFound if there is no such node. The range is assumed to be in
+// strictly increasing node label order.
+func find(label string, lo, hi uint32) uint32 {
+	for lo < hi {
+		mid := lo + (hi-lo)/2
+		s := nodeLabel(mid)
+		if s < label {
+			lo = mid + 1
+		} else if s == label {
+			return mid
+		} else {
+			hi = mid
+		}
+	}
+	return notFound
+}
+
+// nodeLabel returns the label for the i'th node.
+func nodeLabel(i uint32) string {
+	x := nodes[i]
+	length := x & (1<<nodesBitsTextLength - 1)
+	x >>= nodesBitsTextLength
+	offset := x & (1<<nodesBitsTextOffset - 1)
+	return text[offset : offset+length]
+}
+
+// EffectiveTLDPlusOne returns the effective top level domain plus one more
+// label. For example, the eTLD+1 for "foo.bar.golang.org" is "golang.org".
+func EffectiveTLDPlusOne(domain string) (string, error) {
+	suffix, _ := PublicSuffix(domain)
+	if len(domain) <= len(suffix) {
+		return "", fmt.Errorf("publicsuffix: cannot derive eTLD+1 for domain %q", domain)
+	}
+	i := len(domain) - len(suffix) - 1
+	if domain[i] != '.' {
+		return "", fmt.Errorf("publicsuffix: invalid public suffix %q for domain %q", suffix, domain)
+	}
+	return domain[1+strings.LastIndex(domain[:i], "."):], nil
+}
diff --git a/vendor/golang.org/x/net/publicsuffix/table.go b/vendor/golang.org/x/net/publicsuffix/table.go
new file mode 100644
index 000000000..ebcb13952
--- /dev/null
+++ b/vendor/golang.org/x/net/publicsuffix/table.go
@@ -0,0 +1,8786 @@
+// generated by go run gen.go; DO NOT EDIT
+
+package publicsuffix
+
+const version = "publicsuffix.org's public_suffix_list.dat, git revision bade64c (2016-03-01)"
+
+const (
+	nodesBitsChildren   = 9
+	nodesBitsICANN      = 1
+	nodesBitsTextOffset = 15
+	nodesBitsTextLength = 6
+
+	childrenBitsWildcard = 1
+	childrenBitsNodeType = 2
+	childrenBitsHi       = 14
+	childrenBitsLo       = 14
+)
+
+const (
+	nodeTypeNormal     = 0
+	nodeTypeException  = 1
+	nodeTypeParentOnly = 2
+)
+
+// numTLD is the number of top level domains.
+const numTLD = 1545
+
+// Text is the combined text of all labels.
+const text = "bievatmallorcadaquesanfranciscotlandupontarioceanographiquebifuk" +
+	"agawalmartateshinanomachintaijinuyamanouchikuhokuryugasakitashio" +
+	"barabihorologyusuharabikedagestangebilbaogakievenesangoddabillus" +
+	"trationikkoebenhavnikolaeverbankashiwarabiomutashinainvestmentsa" +
+	"njotateyamabirdartcenterprisesakikonaircraftraeumtgeradealstahau" +
+	"gesundurbanamexeterbirkenesoddtangenovaravennaharimalvikashiwaza" +
+	"kiyokawarabirthplacebjarkoyusuisservicesannanikonantanangerbjerk" +
+	"reimmobilieninohelplfinancialipetskasukabedzin-the-bandaioiraseb" +
+	"astopologyeongnamegawakembuchikumagayagawakkanaibetsubamericanfa" +
+	"milydscloudappspotenzachpomorskienebakkeshibechambagriculturenne" +
+	"budapest-a-la-masioninomiyakonojoshkar-olayangroupaleostrowiecar" +
+	"toonartdecoffeedbackasumigaurawa-mazowszextraspace-to-rentalstom" +
+	"akomaibarabjugnirasakis-a-candidateblockbusternidurhamburgliwice" +
+	"bloombergbauernrtatsunostrowwlkpmglobalashovhachinoheguris-a-cat" +
+	"ererbluedatingloboehringerikebmoattachmentsannohelsinkitahiroshi" +
+	"marshallstatebankasuyakutiabmsanokaszubyuudmurtiabmwegroweibolza" +
+	"nore-og-uvdalivornobnpparibaselburglogoweirbomloansantabarbarabo" +
+	"ndvrdnsantacruzsantafedexhibitionishiazais-a-celticsfanishigotpa" +
+	"ntheonishiharabonnishiizunazukis-a-chefarsundwgloppenzaogashimad" +
+	"achicagobododgemologicallyngenglandyndns-homednsanukis-a-conserv" +
+	"ativefsncfailomzansimagicasadelamonedavvesiidazaifudaigodoesntex" +
+	"istanbullensakerbookingmbhartiffanynysafetysfjordyndns-ip6bootsa" +
+	"otomeldalorenskogminakamichigangwonishikatakazakis-a-cpadoval-da" +
+	"ostavalleyuzawaboschaefflerdalotenkawabostikatowicebostonakijins" +
+	"ekikogentingmodenakasatsunairtrafficaseihichisobetsuitairabotani" +
+	"calgardenishikatsuragithubusercontentattoolsztynsettlersapodhale" +
+	"vangerbotanicgardenishikawazukanazawabotanyuzhno-sakhalinskatsus" +
+	"hikabeeldengeluidyndns-mailotteboutiquebecngmxboxenapponazure-mo" +
+	"bilebozentsujiiebradescorporationishimerabrandywinevalleybrasilj" +
+	"an-mayenishinomiyashironobresciabrindisibenikebristolgalsacebrit" +
+	"ishcolumbialowiezagannakadomari-elasticbeanstalkatsuyamasfjorden" +
+	"ishinoomotegotsukisosakitagatakamatsukawabroadcastlebtimnetzgora" +
+	"broadwaybroke-itaxihuanishinoshimatta-varjjatgorybrokerrypropert" +
+	"iesapporobronnoysundyndns-office-on-the-webcambridgestonewspaper" +
+	"brothermesaverdefensejnybrumunddalottokigawabrunelblagdenesnaase" +
+	"ralingenkainanaejrietisalatinabenogatachikawakayamagadancebetsuk" +
+	"ubabia-goracleaningatlantagajobojis-a-cubicle-slavellinowtvallea" +
+	"ostavernishiokoppegardyndns-picsaratovalled-aostavropolicebrusse" +
+	"lsardegnamsskoganeis-a-democratjeldsundyndns-remotegildeskalmyki" +
+	"abruxellesardiniabryanskjakdnepropetrovskiervaapsteiermarkaufeni" +
+	"shitosashimizunaminamiashigarabryneustarhubalestrandabergamoarek" +
+	"ehimejibestadishakotankarmoyokozembroideryomitanobninskarpaczela" +
+	"dz-1buskerudinewhampshirechtrainingretakamoriokamchatkameokameya" +
+	"mashinatsukigatakanabeatsarlouvrepairbusantiquest-a-la-maisondre" +
+	"-landebusinessebykleclercasertaishinomakikuchikuseikarugapartmen" +
+	"tsarpsborgrimstadyndns-serverbaniabuzenishiwakis-a-designerbuzzg" +
+	"orzeleccollegersundyndns-weberlincolnissandnessjoenissayokoshiba" +
+	"hikariwanumataketomisatokuyamatteledatabaseballooningripebwfashi" +
+	"onissedalovegaskimitsubatamicabbottjmaxxxfinitybzhitomirkutskjer" +
+	"voyagecloudfunctionsaudacntkmaxxn--11b4c3dcolognewmexicoldwarmia" +
+	"miastaplesauheradcolonialwilliamsburguideventsavannahgacoloradop" +
+	"lateaudiocolumbusheycommunitysnesaves-the-whalessandria-trani-ba" +
+	"rletta-andriatranibarlettaandriacomobaracomparemarkerryhotelsavo" +
+	"naplesaxocompute-1computerhistoryofscience-fictioncomsecuritysva" +
+	"rdoharuhrcondoshichinohedmarkhangelskypescaravantaaconferencecon" +
+	"structionconsuladollsbschokoladenconsultanthropologyconsultingvo" +
+	"llutskddielddanuorrikuzentakatajirissagaeroclubmedecincinnationw" +
+	"idealerimo-i-ranadexchangeiseiyoichiropracticbcn-north-1contactm" +
+	"palmspringsakercontemporaryarteducationalchikugojomedicaltanisse" +
+	"ttaiwanairguardcontractorskenconventureshinodesashibetsuikimobet" +
+	"suliguriacookingchannelveruminamibosogndaluxembourguitarscholars" +
+	"hipschooluxurycoolkuszgradcoopocznorthwesternmutualuzerncopenhag" +
+	"encyclopedicdn77-sslattumetlifeinsurancecorsicagliaridagawarszaw" +
+	"ashingtondclkfhskhabarovskhakassiacorvettemasekharkivguccipriani" +
+	"igataitogitsuldalvivano-frankivskharkovalledaostakkofuelcosenzam" +
+	"amibuilderschulexuslivinghistorycostumedio-campidano-mediocampid" +
+	"anomediocouncilcouponschwarzgwangjuifminamidaitomangotembaixadac" +
+	"ourseschweizippodlasiellakasamatsudovre-eikercq-acranbrookuwanal" +
+	"yticsciencecentersciencehistorycreditcardcreditunioncremonashoro" +
+	"kanaiecrewiiheyaizuwakamatsubushikusakadogawacricketrzyncrimeacr" +
+	"otonewportlligatewaycrowncrscientistor-elvdalcruisescjohnsoncuis" +
+	"inellajollamericanexpressexyzjcbnlculturalcentertainmentoyokawac" +
+	"uneocupcakecxn--1ck2e1balsanagochihayaakasakawaharaumakeupowiath" +
+	"letajimabariakepnordkappgjesdalillyonabaruconnectarnobrzegjovika" +
+	"ruizawaugustowadaegubs3-ap-southeast-2cymruovatoyonakagyokutoshi" +
+	"macyouthdfcbankhersonfilateliafilminamiechizenfinalfinancefinear" +
+	"tsettsurfastlyfinlandfinnoyfirebaseappamperedchefauskedsmokorset" +
+	"agayaseljordfirenzefirestonextdirectoryfirmdalegoldpointelligenc" +
+	"efishingolfbsbxn--1ctwolominamatamayukis-a-geekhmelnitskiyamashi" +
+	"kefitjarqhachiojiyahikobeautydalfitnessettlementoyookarasjohkami" +
+	"noyamatsuris-a-greenfjalerflickragerotikaluganskhmelnytskyivalle" +
+	"e-aosteroyflightsevastopolezajskhvalleeaosteigenflirumansionseve" +
+	"nassisicilyfloguchikuzenfloraflorencefloridafloristanohatakaharu" +
+	"ssiafloromskoguovdageaidnulminamifuranoflowersewildlifestyleflsm" +
+	"idthruhereggio-emilia-romagnakanotoddenflynnhubalsfjordiskstatio" +
+	"naustdalimanowarudaukraanghke164fndfolldalfoodnetworkangerfor-be" +
+	"tter-thandafor-ourfor-somedizinhistorischesfranziskanerimamatera" +
+	"mochizukirafor-theaterforexrothachirogatakanezawaforgotdnshangri" +
+	"langevagrarboretumbriaforli-cesena-forlicesenaforlikes-piedmontb" +
+	"lancomeeresharis-a-gurulsandoyforsaleikangerforsandasuolodingenf" +
+	"ortmissoulan-udell-ogliastrakhanawawilliamhillfortworthadanotoga" +
+	"waforuminamiiselectoyosatotalfosnesharpanamafotoyotaris-a-hard-w" +
+	"orkerfoxn--1lqs03nfreiburgushikamifuranotaireshawaiijimarylandfr" +
+	"eightcmwinbaltimore-og-romsdalimitedunetflixilimoliserniaurskog-" +
+	"holandroverhalla-speziaetnagahamaroygardendoftheinternetcimdbala" +
+	"tinordre-landds3-ap-northeast-2freseniusdecorativeartshellaspezi" +
+	"afribourgxn--1lqs71dfriuli-v-giuliafriuli-ve-giuliafriuli-vegiul" +
+	"iafriuli-venezia-giuliafriuli-veneziagiuliafriuli-vgiuliafriuliv" +
+	"-giuliafriulive-giuliafriulivegiuliafriulivenezia-giuliafriulive" +
+	"neziagiuliafriulivgiuliafrlfroganshimokawafrognfrolandfrom-akreh" +
+	"amnfrom-alfrom-arfrom-azlgzpanasonicheltenham-radio-operaunitele" +
+	"markautokeinofrom-canonoichikawamisatodayfrom-collectionfrom-cto" +
+	"yotomiyazakis-a-hunterfrom-dchelyabinskodjeffersonisshinguernsey" +
+	"from-dellogliastraderfrom-flandershimokitayamafrom-gaulardalfrom" +
+	"-higashiagatsumagoirmitakeharafrom-iafrom-idfrom-ilfrom-incheonf" +
+	"rom-kshimonitayanagivestbytomaritimekeepingfrom-kyknetoyotsukaid" +
+	"ownloadfrom-lanbibaidarfrom-manxn--1qqw23afrom-mdfrom-meetoyoura" +
+	"from-microsoftbanklabudhabikinokawabarthadselfipirangafrom-mnfro" +
+	"m-modalenfrom-mshimonosekikawafrom-mtnfrom-nchernigovernmentjome" +
+	"morialucaniafrom-ndfrom-nexusgardenfrom-nhktoystre-slidrettozawa" +
+	"from-njcparaglidingfrom-nminamiizukamitondabayashiogamagoriziafr" +
+	"om-nvanylvenicefrom-nyfrom-ohkurafrom-oketogurafrom-orfrom-pader" +
+	"bornfrom-pratohmaoris-a-knightozsdefrom-ris-a-landscaperugiafrom" +
+	"-schoenbrunnfrom-sdnipropetrovskmpspbambleborkarumaifarmsteadivt" +
+	"asvuodnakaiwamizawaustevollavangenativeamericanantiques3-eu-cent" +
+	"ral-1from-tnfrom-txn--2m4a15efrom-utazuerichardlikescandyndns-at" +
+	"-homedepotaruis-a-lawyerfrom-vadsochildrensgardenfrom-vtranbyfro" +
+	"m-wafrom-wielunnerfrom-wvaolbia-tempio-olbiatempioolbialystokkem" +
+	"erovodkagoshimaintenancefrom-wyfrosinonefrostalowa-wolawafroyaha" +
+	"badajozorahkkeravjudygarlandfstcgrouparisor-fronfujiiderafujikaw" +
+	"aguchikonefujiminohtawaramotoineppugliafujinomiyadafujiokayamarb" +
+	"urgfujisatoshonairportland-4-salernogiessengerdalaskanittedallas" +
+	"alleaseeklogesquarezzoologyfujisawafujishiroishidakabiratoridelm" +
+	"enhorstalbanshimosuwalkis-a-liberalfujitsurugashimarinefujixerox" +
+	"n--30rr7yfujiyoshidafukayabeardubaiduckdnsdojoburgfukuchiyamadaf" +
+	"ukudominichernihivanovosibirskydivingrondarfukuis-a-libertarianf" +
+	"ukumitsubishigakirkeneshimotsukefukuokazakirovogradoyfukuroishik" +
+	"arikaturindalfukusakiryuohaebaruminamimakis-a-linux-useranishiar" +
+	"itabashikaoizumizakitaurayasudafukuyamagatakahashimamakisarazure" +
+	"websiteshikagamiishibukawafunabashiriuchinadafunagatakahatakaish" +
+	"imoichinosekigaharafunahashikamiamakusatsumasendaisennangonoheji" +
+	"s-a-llamarylhursteinkjerusalembetsukuis-a-musicianfundaciofuoisk" +
+	"ujukuriyamarcheaparliamentrani-andria-barletta-trani-andriafuoss" +
+	"koczowindmillfurnitureggiocalabriafurubiraquarelleasingleshimots" +
+	"umafurudonostiafurukawairtelecityeatshinichinanfusodegaurafussai" +
+	"kishiwadafutabayamaguchinomigawafutboldlygoingnowhere-for-morego" +
+	"ntrailroadfuttsurugiminamiminowafvgfyis-a-nascarfanfylkesbiblack" +
+	"fridayfyresdalhannovareserveftparocherkasyzrankoshigayaltaikis-a" +
+	"-painteractivegarsheis-a-patsfanhanyuzenhapmirhappoulvikokonoeha" +
+	"reidsbergenharstadharvestcelebrationhasamarahasaminami-alpssells" +
+	"-for-unzenhashbanghasudahasvikolobrzegyptianpachigasakidsmynaspe" +
+	"rschlesischesurancehatogayahoooshikamaishimofusartshinkamigotoyo" +
+	"hashimotomobellunordreisa-geekomaganehatoyamazakitahatakaokamiki" +
+	"tayamatotakadahatsukaichiharahattfjelldalhayashimamotobuildingha" +
+	"zuminobusells-itraniandriabarlettatraniandriahbofagehembygdsforb" +
+	"undhemneshinshinotsurgeonshalloffamelhustkamisunagawahemsedalher" +
+	"okussldheroyhgtvarggatranoyhigashichichibungotakadatsunanjoetsuw" +
+	"anouchikujogaszkoladbrokesennumamurogawalterhigashihiroshimanehi" +
+	"gashiizumozakitakamiizumisanofiatransportrapaniimimatakatoris-a-" +
+	"personaltrainerhigashikagawahigashikagurasoedahigashikawakitaaik" +
+	"itakatakarazukamikoaniikappulawyhigashikurumeguroroskoleirvikoma" +
+	"kiyosatokamachippubetsubetsugaruhigashimatsushimarugame-hostingh" +
+	"igashimatsuyamakitaakitadaitoigawahigashimurayamalatvuopmidoris-" +
+	"a-photographerokuapparshinshirohigashinarusellsyourhomegoodshint" +
+	"okushimahigashinehigashiomihachimanchesterhigashiosakasayamamoto" +
+	"rcycleshintomikasaharahigashishirakawamatakasagooglecodespotrave" +
+	"lchannelhigashisumiyoshikawaminamiaikitakyushuaiahigashitsunowru" +
+	"zhgorodoyhigashiurausukitamidsundhigashiyamatokoriyamanakakogawa" +
+	"higashiyodogawahigashiyoshinogaris-a-playerhiraizumisatohnoshooh" +
+	"irakatashinagawahiranais-a-republicancerresearchaeologicaliforni" +
+	"ahirarahiratsukagawahirayaitakasakitamotosumitakaginankokubunjis" +
+	"-a-rockstarachowicehisayamanashiibaghdadultravelersinsurancehist" +
+	"orichouseshinyoshitomiokaniepcehitachiomiyaginowaniihamatamakawa" +
+	"jimaritimodellinghitachiotagopartis-a-socialistmeindianapolis-a-" +
+	"bloggerhitoyoshimifunehitradinghjartdalhjelmelandholeckobierzyce" +
+	"holidayhomeipartnershiojirishirifujiedahomelinuxn--32vp30hagebos" +
+	"tadhomesensembokukitanakagusukumoduminamiogunicomcastresistanceh" +
+	"omeunixn--3bst00minamisanrikubetsupplyhondahonefosshioyameloyali" +
+	"stockholmestrandhoneywellhongorgehonjyoitakashimarumorimachidaho" +
+	"rnindalhorseminehortendofinternetrdhoteleshirahamatonbetsurgeryh" +
+	"otmailhoyangerhoylandetroitskomatsushimashikiyosemitehumanitiesh" +
+	"irakoenighurdalhurumajis-a-soxfanhyllestadhyogoris-a-studentalhy" +
+	"ugawarahyundaiwafunejgorajlchitachinakagawatchandclockazimierz-d" +
+	"olnyjlljmpartshishikuis-an-actorjnjelenia-gorajoyokaichibahcavuo" +
+	"tnagaraholtalenjpmorganichitosetogakushimotoganewjerseyjpnchloej" +
+	"prshisognejuniperjurkristiansandcatshisuifuettertdasnetzwindowsh" +
+	"itaramakristiansundkrodsheradkrokstadelvaldaostarostwodzislawinn" +
+	"ershizukuishimogosenkryminamitanekumatorinokumejimasudakumenanyo" +
+	"kkaichirurgiens-dentisteshizuokanoyakagekunisakis-an-entertainer" +
+	"kunitachiarailwaykunitomigusukumamotoyamassa-carrara-massacarrar" +
+	"amassabunkyonanaoshimageandsoundandvisionkunneppupartykunstsamml" +
+	"ungkunstunddesignkuokgroupasadenamsosnowiechocolatelevisionrwhal" +
+	"ingrongausdaluccapebretonamiasakuchinotsuchiurakawassamukawatari" +
+	"cohdavvenjargamvikazokureitrentino-stirolkurgankurobelaudiblebes" +
+	"byglandkurogimilitarykuroisoftwarendalenugkuromatsunais-bykurota" +
+	"kikawasakis-certifiedekakegawakurskomonokushirogawakustanais-fou" +
+	"ndationkusupersportrentino-sud-tirolkutchanelkutnokuzbassnillfjo" +
+	"rdkuzumakis-gonekvafjordkvalsundkvamlidlugolekagaminord-aurdalvd" +
+	"alipayufuchukotkafjordkvanangenkvinesdalkvinnheradkviteseidskogk" +
+	"vitsoykwpspjelkavikomorotsukamishihoronobeokaminokawanishiaizuba" +
+	"ngekyotobetsupplieshoujis-into-animeiwamaseratis-a-therapistoiak" +
+	"yowariasahikawamishimatsumotofukemissileksvikongsbergmisugitokon" +
+	"amegatakayamatsunomitourismolanciamitoyoakemiuramiyazumiyotamano" +
+	"mjondalenmlbarclaycards3-us-west-1monmouthaibarakitagawamonsterm" +
+	"onticellolmontrealestatefarmequipmentrentino-sudtirolmonza-brian" +
+	"zaporizhzhekinannestadmonza-e-della-brianzaporizhzhiamonzabrianz" +
+	"apposlombardiamondshowtimemerckongsvingermonzaebrianzaramonzaede" +
+	"llabrianzamoparachutingmordoviajessheiminamiuonumatsumaebashimod" +
+	"atemoriyamatsusakahoginozawaonsenmoriyoshiokamitsuemormoneymoroy" +
+	"amatsushigemortgagemoscowiostrolekaneyamaxunjargamoseushistorymo" +
+	"sjoenmoskeneshriramsterdambulanceomossienarashinomosvikoninjamis" +
+	"onmoviemovistargardmtpccwitdkonskowolancashirehabmermtranakayama" +
+	"tsuuramuenstermugithubcloudusercontentrentino-sued-tirolmuikamog" +
+	"awamukochikushinonsenergymulhouservebbsigdalmultichoicemunakatan" +
+	"emuncieszynmuosattemupassagensimbirskonsulatrobeermurmanskonyvel" +
+	"oftrentino-s-tirollagrigentomologyeonggiehtavuoatnagaivuotnagaok" +
+	"akyotambabydgoszczecinemailmurotorcraftrentino-suedtirolmusashim" +
+	"urayamatsuzakis-leetrentino-a-adigemusashinoharamuseetrentinoa-a" +
+	"digemuseumverenigingmutsuzawamutuellelmyokohamamatsudamypetsimpl" +
+	"e-urlmyphotoshibahccavuotnagareyamaizurubtsovskiptveterinairebun" +
+	"goonomichinomiyakemytis-a-bookkeeperminamiyamashirokawanabelgoro" +
+	"deophiladelphiaareadmyblogsitephilatelyphilipsyphoenixn--3e0b707" +
+	"ephotographysiopiagetmyipassenger-associationpictetrentinoaadige" +
+	"pictureslupskooris-an-actresshiraois-a-techietis-a-teacherkassym" +
+	"antechnologypiemontepilotsmolenskopervikommunalforbundpinkoryola" +
+	"sitepioneerpippupiszpittsburghofedjejuegoshikiminokamoenairlineb" +
+	"raskaunbieidsvollpiwatepizzapkosaigawaplanetariuminanoplantation" +
+	"plantsnoasaitamatsukuris-lostre-toteneis-an-accountantshiranukan" +
+	"makiwakunigamihamadaplatformincommbankomvuxn--3ds443gplaystation" +
+	"plazaplchofunatorientexpressasayamaplombardyndns-at-workinggroup" +
+	"aviancapetownplumbingotvbarclays3-us-west-2plusterpmnpodzonepohl" +
+	"pokerpokrovskosakaerodromegallupinbarcelonagasakijobservercellie" +
+	"rneues3-us-gov-west-1politiendapolkowicepoltavalle-aostathellewi" +
+	"smillerpomorzeszowithgoogleapisa-hockeynutrentinoalto-adigeporde" +
+	"nonepornporsangerporsangugeporsgrunnanpoznanpraxis-a-bruinsfansn" +
+	"zprdpreservationpresidioprgmrprimelbourneprincipeprivneprochowic" +
+	"eproductionsokanraprofermobilyprogressivenneslaskerrylogisticsok" +
+	"ndalprojectrentinoaltoadigepromombetsupportrentinos-tirolpropert" +
+	"yprotectionprudentialpruszkowithyoutubeneventochiokinoshimalselv" +
+	"endrellprzeworskogptzpvtrentinostirolpwchonanbugattipschmidtre-g" +
+	"auldalucernepzqldqponqslgbtrentinosud-tirolqvchoseiroumuenchenst" +
+	"orfjordstpetersburgstreamurskinderoystudiostudyndns-freemasonryo" +
+	"kamikawanehonbetsurutaharastuff-4-salestuttgartrentinosuedtirols" +
+	"urnadalsurreysusakis-slickomforbananarepublicargodaddynathomebui" +
+	"ltarumizusawaustinnaturalhistorymuseumcentereviewskrakowebhopage" +
+	"frontappagespeedmobilizerobihirosakikamijimagroks-thisamitsukeis" +
+	"enbahnasushiobaraeroportalabamagasakishimabarackmaze-burggfarmer" +
+	"seinewyorkshireggio-calabriabruzzoologicalvinklein-addrammenuern" +
+	"bergdyniabogadocscbg12000susonosuzakanumazurysuzukanzakiwiensuzu" +
+	"kis-uberleetrentino-aadigesvalbardudinkakamigaharasveiosvelvikos" +
+	"himizumakiyosumykolaivaroysvizzeraswedenswidnicapitalonewholland" +
+	"swiebodzindianmarketingswiftcoverisignswinoujscienceandhistorysw" +
+	"isshikis-very-badaddjamalborkdalsxn--3oq18vl8pn36atuscanytushuis" +
+	"sier-justicetuvalle-daostavangervestnesopotrentinosudtirolvestre" +
+	"-slidreamhostersor-odalvestre-totennishiawakuravestvagoyvevelsta" +
+	"dvibo-valentiavibovalentiavideovillaskoyabearalvahkihokumakogeni" +
+	"waizumiotsukumiyamazonawsabaerobaticketsor-varangervinnicarbonia" +
+	"-iglesias-carboniaiglesiascarboniavinnytsiavipsinaappfizervirgin" +
+	"iavirtualvirtuelvisakatakinouevistaprintuitrentottoris-very-evil" +
+	"lageviterboltrevisohughesolognevivoldavladikavkazanvladimirvladi" +
+	"vostokaizukarasuyamazoevlogvolkenkunderseaportroandinosaurepbody" +
+	"ndns-blogdnsolundbeckoseis-an-anarchistoricalsocietyvolkswagents" +
+	"orfoldvologdanskostromahachijorpelandvolvolgogradvolyngdalvorone" +
+	"zhytomyrvossevangenvotevotingvotoursorreisahayakawakamiichikaise" +
+	"is-saveducatorahimeshimakanegasakinkobayashikshacknetnedalvrnwor" +
+	"se-thangglidingwowiwatsukiyonowritesthisblogspotrogstadwroclawlo" +
+	"clawekosugewtchoshibuyachiyodawtferrarawuozuwwworldwzmiuwajimaxn" +
+	"--4gq48lf9jeonnamerikawauexn--4it168dxn--4it797kotouraxn--4pvxso" +
+	"rtlandxn--54b7fta0cchromediaxn--55qw42gxn--55qx5dxn--5js045dxn--" +
+	"5rtp49chryslerxn--5rtq34kouhokutamakis-an-artistjohnxn--5su34j93" +
+	"6bgsgxn--5tzm5gxn--6btw5axn--6frz82gxn--6orx2rxn--6qq986b3xlxn--" +
+	"7t0a264chungbukazunoxn--80adxhksoruminnesotaketakatsukis-into-ca" +
+	"rshiraokannamiharuxn--80ao21axn--80aqecdr1axn--80asehdbarefootba" +
+	"llangenoamishirasatobishimalopolskanlandivttasvuotnakamagayachts" +
+	"akuraibigawaustraliaisondriodejaneirochesterhcloudcontrolledigit" +
+	"alaziobirakunedre-eikereportarantomsk-uralsk12xn--80aswgxn--80au" +
+	"dnedalnxn--8ltr62kounosunndalxn--8pvr4uxn--8y0a063axn--90a3acade" +
+	"mydroboatsaritsynologyeongbukouyamashikokuchuoxn--90aishobaraomo" +
+	"riguchiharagusaarlandxn--90azhair-surveillancexn--9dbhblg6diethn" +
+	"ologyxn--9dbq2axn--9et52uxn--9krt00axn--andy-iraxn--aroport-byan" +
+	"agawaxn--asky-iraxn--aurskog-hland-jnbargainstitutelefonicafeder" +
+	"ationaval-d-aosta-valleyonagoyaustrheimatunduhrennesoyekaterinbu" +
+	"rgjemnes3-eu-west-1xn--avery-yuasakegawaxn--b-5gaxn--b4w605ferdx" +
+	"n--bck1b9a5dre4chungnamdalseidfjordyroyrvikingrossetouchijiwadel" +
+	"tajimicrolightingroundhandlingroznyxn--bdddj-mrabdxn--bearalvhki" +
+	"-y4axn--berlevg-jxaxn--bhcavuotna-s4axn--bhccavuotna-k7axn--bidr" +
+	"-5nachikatsuuraxn--bievt-0qa2xn--bjarky-fyanaizuxn--bjddar-ptamb" +
+	"oversaillesooxn--blt-elaborxn--bmlo-graingerxn--bod-2naroyxn--br" +
+	"nny-wuaccident-investigationjukudoyamaceratabuseat-band-campania" +
+	"mallamadridvagsoyericssonlineat-urlxn--brnnysund-m8accident-prev" +
+	"entionxn--brum-voagatromsakakinokiaxn--btsfjord-9zaxn--c1avgxn--" +
+	"c2br7gxn--c3s14minternationalfirearmshowaxn--cck2b3barreauctiona" +
+	"vigationavuotnakhodkanagawauthordalandroidiscountyumenaturalscie" +
+	"ncesnaturelles3-external-1xn--cg4bkis-very-goodhandsonxn--ciqpnx" +
+	"n--clchc0ea0b2g2a9gcdn77-securecipesaro-urbino-pesarourbinopesar" +
+	"omaniwakuratelekommunikationxn--comunicaes-v6a2oxn--correios-e-t" +
+	"elecomunicaes-ghc29axn--czr694barrel-of-knowledgeometre-experts-" +
+	"comptablesakyotanabellevuelosangelesjaguarchitecturealtychyattor" +
+	"neyagawalbrzycharternopilawalesundiyonaguniversityoriikasaokamio" +
+	"kamiminersalangenayoroceanographicsalondonetskashibatakasugaibmd" +
+	"npalacemergencyberlevagangaviikanonjiinetatamotorsaltdalindasiau" +
+	"tomotivecodyn-o-saurlandes3-external-2xn--czrs0tromsojavald-aost" +
+	"arnbergxn--czru2dxn--czrw28barrell-of-knowledgeorgeorgiautoscana" +
+	"daejeonbukariyakumoldebinagisoccertificationaturbruksgymnaturhis" +
+	"torisches3-fips-us-gov-west-1xn--d1acj3bashkiriaveroykenvironmen" +
+	"talconservationatuurwetenschappenaumburgjerdrumckinseyokosukarel" +
+	"iancebinosegawasmatartanddesignieznorddalavagiske12xn--d1alfarom" +
+	"eoxn--d1atrusteexn--d5qv7z876churchaseljeepilepsydneyxn--davvenj" +
+	"rga-y4axn--djrs72d6uyxn--djty4kouzushimasoyxn--dnna-grajewolters" +
+	"kluwerxn--drbak-wuaxn--dyry-iraxn--eckvdtc9dxn--efvn9southcaroli" +
+	"nazawaxn--efvy88hakatanotteroyxn--ehqz56nxn--elqq16hakodatevaksd" +
+	"alxn--estv75gxn--eveni-0qa01gaxn--f6qx53axn--fct429kozagawaxn--f" +
+	"hbeiarnxn--finny-yuaxn--fiq228c5hsouthwestfalenxn--fiq64basilica" +
+	"taniavocatanzaroweddingjerstadotsuruokamakurazakisofukushimarnar" +
+	"dalillesandefjordiscoveryggeelvinckarlsoyokotebizenakaniikawatan" +
+	"agurasnesoddenmarkets3-ap-southeast-1kappleangaviikadenaamesjevu" +
+	"emielnoboribetsucks3-ap-northeast-1xn--fiqs8sowaxn--fiqz9spreadb" +
+	"ettingxn--fjord-lraxn--fjq720axn--fl-ziaxn--flor-jraxn--flw351ex" +
+	"n--fpcrj9c3dxn--frde-grandrapidspydebergxn--frna-woaraisaijosoyr" +
+	"ovigorlicexn--frya-hraxn--fzc2c9e2chuvashiaxn--fzys8d69uvgmailxn" +
+	"--g2xx48circlegallocuscountryestateofdelawarecreationxn--gckr3f0" +
+	"ferrarittogokasells-for-lesscrapper-sitexn--gecrj9circuscultured" +
+	"umbrellahppiacenzakopanerairforcechirealtorlandxn--ggaviika-8ya4" +
+	"7hakonexn--gildeskl-g0axn--givuotna-8yandexn--3pxu8kotohiradomai" +
+	"nsureisenxn--gjvik-wuaxn--gk3at1exn--gls-elacaixaxn--gmq050is-ve" +
+	"ry-nicexn--gmqw5axn--h-2fairwindsrlxn--h1aeghakubankmshinjournal" +
+	"ismailillehammerfest-mon-blogueurovisionxn--h2brj9citadeliverybn" +
+	"ikahokutogliattiresaskatchewanggouvicenzaxn--hbmer-xqaxn--hcesuo" +
+	"lo-7ya35basketballfinanz-2xn--hery-iraxn--hgebostad-g3axn--hmmrf" +
+	"easta-s4acctrverranzanxn--hnefoss-q1axn--hobl-iraxn--holtlen-hxa" +
+	"xn--hpmir-xqaxn--hxt814exn--hyanger-q1axn--hylandet-54axn--i1b6b" +
+	"1a6a2exn--imr513nxn--indery-fyaotsurgutsiracusaitokyotangovtrysi" +
+	"lkoshunantokashikizunokunimilanoxn--io0a7is-very-sweetrentino-al" +
+	"to-adigexn--j1aeferreroticampobassociatescrappingujolsterxn--j1a" +
+	"mhakuis-a-nurseoullensvanguardxn--j6w193gxn--jlq61u9w7batochigif" +
+	"tsalvadordalibabaikaliszczytnordlandrangedalindesnesalzburgladel" +
+	"oittenrightathomeftpaccessamegawavoues3-sa-east-1xn--jlster-byar" +
+	"oslavlaanderenxn--jrpeland-54axn--jvr189misakis-into-cartoonshir" +
+	"atakahagivingxn--k7yn95exn--karmy-yuaxn--kbrq7oxn--kcrx77d1x4axn" +
+	"--kfjord-iuaxn--klbu-woaxn--klt787dxn--kltp7dxn--kltx9axn--klty5" +
+	"xn--42c2d9axn--koluokta-7ya57hakusandiegoodyearthagakhanamigawax" +
+	"n--kprw13dxn--kpry57dxn--kpu716fetsundxn--kput3is-with-thebandoo" +
+	"mdnsaliascolipicenord-odalxn--krager-gyasakaiminatoyakokamisatoh" +
+	"obby-sitexasdaburyatiaarpharmaciensirdalxn--kranghke-b0axn--krds" +
+	"herad-m8axn--krehamn-dxaxn--krjohka-hwab49jetztrentino-altoadige" +
+	"xn--ksnes-uuaxn--kvfjord-nxaxn--kvitsy-fyasugisleofmandalxn--kvn" +
+	"angen-k0axn--l-1faitheguardianquanconagawakuyabukicks-assediciti" +
+	"cateringebudejjuedischesapeakebayernurembergriwataraidyndns-work" +
+	"shoppdalowiczest-le-patrondheimperiaxn--l1accentureklamborghinii" +
+	"zaxn--laheadju-7yasuokaratexn--langevg-jxaxn--lcvr32dxn--ldingen" +
+	"-q1axn--leagaviika-52batsfjordrivelandrobaknoluoktainaikawachina" +
+	"ganoharamcoalaheadjudaicaaarborteaches-yogasawaracingroks-theatr" +
+	"eemersongdalenviknakanojohanamakinoharaxastronomydstvedestrandgc" +
+	"ahcesuolocalhistoryazannefrankfurtargets-itargi234xn--lesund-hua" +
+	"xn--lgbbat1ad8jevnakerxn--lgrd-poacoachampionshiphopenair-traffi" +
+	"c-controlleyxn--lhppi-xqaxn--linds-pramericanartulansolutionsola" +
+	"rssonxn--lns-qlanxessrtrentinosued-tirolxn--loabt-0qaxn--lrdal-s" +
+	"raxn--lrenskog-54axn--lt-liacivilaviationxn--lten-granexn--lury-" +
+	"iraxn--mely-iraxn--merker-kuaxn--mgb2ddesrvdonskosherbrookegawax" +
+	"n--mgb9awbfgulenxn--mgba3a3ejtunesomaxn--mgba3a4f16axn--mgba3a4f" +
+	"ranamizuholdingsmileirfjordxn--mgba7c0bbn0axn--mgbaakc7dvfidelit" +
+	"yxn--mgbaam7a8haldenxn--mgbab2bdxn--mgbai9a5eva00bauhausposts-an" +
+	"d-telecommunicationsnasadoes-itveronagasukemrxn--mgbai9azgqp6jew" +
+	"elryxn--mgbayh7gpaduaxn--mgbb9fbpobanazawaxn--mgbbh1a71exn--mgbc" +
+	"0a9azcgxn--mgbca7dzdoxn--mgberp4a5d4a87gxn--mgberp4a5d4arxn--mgb" +
+	"i4ecexposedxn--mgbpl2fhvalerxn--mgbqly7c0a67fbcivilisationxn--mg" +
+	"bqly7cvafredrikstadtvstoragexn--mgbt3dhdxn--mgbtf8flekkefjordxn-" +
+	"-mgbtx2bbcarrierxn--mgbx4cd0abbvieeexn--mix082fidonnakamuratakah" +
+	"amannortonsbergunmarriottoyonezawaxn--mix891fieldxn--mjndalen-64" +
+	"axn--mk0axindustriesteamfamberkeleyxn--mk1bu44civilizationxn--mk" +
+	"ru45issmarterthanyouxn--mlatvuopmi-s4axn--mli-tlapyatigorskozaki" +
+	"s-an-engineeringxn--mlselv-iuaxn--moreke-juaxn--mori-qsakuhokkai" +
+	"dontexisteingeekpnxn--mosjen-eyatominamiawajikiwchiryukyuragifue" +
+	"fukihaborokunohealthcareersarufutsunomiyawakasaikaitakoelniyodog" +
+	"awaxn--mot-tlaquilancasterxn--mre-og-romsdal-qqbbtatarstanflatan" +
+	"gerxn--msy-ula0halsaintlouis-a-anarchistoireggioemiliaromagnakat" +
+	"ombetsumidatlantichernivtsiciliaxn--mtta-vrjjat-k7afamilycompany" +
+	"civilwarmanagementjxjaworznoxn--muost-0qaxn--mxtq1misasaguris-in" +
+	"to-gamessinashikitchenxn--ngbc5azdxn--ngbe9e0axn--ngbrxn--45brj9" +
+	"choyodobashichikashukujitawaraxn--nit225kppspiegelxn--nmesjevuem" +
+	"ie-tcbajddarchaeologyxn--nnx388axn--nodessakuragawaxn--nqv7fs00e" +
+	"maxn--nry-yla5gxn--ntso0iqx3axn--ntsq17gxn--nttery-byaeservegame" +
+	"-serverdalxn--nvuotna-hwaxn--nyqy26axn--o1achattanooganorilsklep" +
+	"pharmacyslingxn--o3cw4hammarfeastafricamagichernovtsykkylvenetoe" +
+	"iheijis-a-doctorayxn--od0algxn--od0aq3bbvacationswatch-and-clock" +
+	"erxn--ogbpf8flesbergxn--oppegrd-ixaxn--ostery-fyatsukaratsuginam" +
+	"ikatagamihoboleslawieclaimsassaris-a-financialadvisor-aurdaluroy" +
+	"xn--osyro-wuaxn--p1acfdxn--p1aixn--pbt977clickchristiansburgrpal" +
+	"ermomasvuotnakatsugawaxn--pgbs0dhlxn--porsgu-sta26figuerestauran" +
+	"toyonoxn--pssu33lxn--pssy2uxn--q9jyb4clinicatholicasinorfolkebib" +
+	"lefrakkestadyndns-wikindlegnicamerakershus-east-1xn--qcka1pmcdon" +
+	"aldstordalxn--qqqt11misawaxn--qxamusementurystykarasjoksnesomnar" +
+	"itakurashikis-not-certifiedogawarabikomaezakirunoshiroomuraxn--r" +
+	"ady-iraxn--rdal-poaxn--rde-ularvikrasnodarxn--rdy-0nabarixn--ren" +
+	"nesy-v1axn--rhkkervju-01aflakstadaokagakibichuoxn--rholt-mragowo" +
+	"odsidexn--rhqv96gxn--rht27zxn--rht3dxn--rht61exn--risa-5narusawa" +
+	"xn--risr-iraxn--rland-uuaxn--rlingen-mxaxn--rmskog-byatsushiroxn" +
+	"--rny31hamurakamigoriginshinjukumanoxn--rovu88bentleyukuhashimoj" +
+	"iitatebayashijonawatextileitungsenfshostrodawaraxn--rros-granvin" +
+	"dafjordxn--rskog-uuaxn--rst-0narutokorozawaxn--rsta-francaisehar" +
+	"axn--ryken-vuaxn--ryrvik-byawaraxn--s-1fareastcoastaldefencexn--" +
+	"s9brj9cliniquenoharaxn--sandnessjen-ogbizhevskrasnoyarskommunexn" +
+	"--sandy-yuaxn--seral-lraxn--ses554gxn--sgne-gratangenxn--skierv-" +
+	"utazaskvolloabathsbclintonoshoesatxn--0trq7p7nnxn--skjervy-v1axn" +
+	"--skjk-soaxn--sknit-yqaxn--sknland-fxaxn--slat-5narviikananporov" +
+	"noxn--slt-elabourxn--smla-hraxn--smna-gratis-a-bulls-fanxn--snas" +
+	"e-nraxn--sndre-land-0cbremangerxn--snes-poaxn--snsa-roaxn--sr-au" +
+	"rdal-l8axn--sr-fron-q1axn--sr-odal-q1axn--sr-varanger-ggbeppubol" +
+	"ognagatorockartuzyurihonjournalistjordalshalsenhsamnangerxn--srf" +
+	"old-byawatahamaxn--srreisa-q1axn--srum-grazxn--stfold-9xaxn--stj" +
+	"rdal-s1axn--stjrdalshalsen-sqberndunloppacificartierxn--stre-tot" +
+	"en-zcbstorenburgxn--t60b56axn--tckweatherchannelxn--tiq49xqyjewi" +
+	"shartgalleryxn--tjme-hraxn--tn0agrinetbankzxn--tnsberg-q1axn--to" +
+	"r131oxn--trany-yuaxn--trgstad-r1axn--trna-woaxn--troms-zuaxn--ty" +
+	"svr-vraxn--uc0atversicherungxn--uc0ay4axn--uist22hangoutsystemsc" +
+	"loudcontrolapparmaxn--uisz3gxn--unjrga-rtaobaokinawashirosatobam" +
+	"agazinemurorangeologyxn--unup4yxn--uuwu58axn--vads-jraxn--vard-j" +
+	"raxn--vegrshei-c0axn--vermgensberater-ctbeskidynaliascoli-piceno" +
+	"rd-frontierxn--vermgensberatung-pwbestbuyshousesamsclubindalinka" +
+	"shiharaxn--vestvgy-ixa6oxn--vg-yiabcgxn--vgan-qoaxn--vgsy-qoa0jf" +
+	"komitamamuraxn--vgu402clothingruexn--vhquvestfoldxn--vler-qoaxn-" +
+	"-vre-eiker-k8axn--vrggt-xqadxn--vry-yla5gxn--vuq861betainaboxfor" +
+	"deatnuorogersvpalanaklodzkodairaxn--w4r85el8fhu5dnraxn--w4rs40lx" +
+	"n--wcvs22dxn--wgbh1cloudfrontdoorxn--wgbl6axn--xhq521bielawallon" +
+	"ieruchomoscienceandindustrynikiiyamanobeauxartsandcraftsamsungla" +
+	"ssassinationalheritagematsubarakawagoepostfoldnavyatkakudamatsue" +
+	"psonyoursidegreevje-og-hornnesandvikcoromantovalle-d-aostatoilin" +
+	"zainfinitinfoggiaxn--xkc2al3hye2axn--xkc2dl3a5ee0hannanmokuizumo" +
+	"dernxn--y9a3aquariumisconfusedxn--yer-znarvikredstonexn--yfro4i6" +
+	"7oxn--ygarden-p1axn--ygbi2ammxn--45q11christmasakikugawatchesase" +
+	"boknowsitallukowhoswhokksundynv6xn--ystre-slidre-ujbiellaakesvue" +
+	"mieleccexn--zbx025dxn--zf0ao64axn--zf0avxn--4gbriminingxn--zfr16" +
+	"4bieszczadygeyachimataipeigersundunsagamiharaxperiaxz"
+
+// nodes is the list of nodes. Each node is represented as a uint32, which
+// encodes the node's children, wildcard bit and node type (as an index into
+// the children array), ICANN bit and text.
+//
+// In the //-comment after each node's data, the nodes indexes of the children
+// are formatted as (n0x1234-n0x1256), with * denoting the wildcard bit. The
+// nodeType is printed as + for normal, ! for exception, and o for parent-only
+// nodes that have children but don't match a domain label in their own right.
+// An I denotes an ICANN domain.
+//
+// The layout within the uint32, from MSB to LSB, is:
+//	[ 1 bits] unused
+//	[ 9 bits] children index
+//	[ 1 bits] ICANN bit
+//	[15 bits] text index
+//	[ 6 bits] text length
+var nodes = [...]uint32{
+	0x00355603, // n0x0000 c0x0000 (---------------)  + I aaa
+	0x0034d544, // n0x0001 c0x0000 (---------------)  + I aarp
+	0x0026b886, // n0x0002 c0x0000 (---------------)  + I abarth
+	0x00230743, // n0x0003 c0x0000 (---------------)  + I abb
+	0x00230746, // n0x0004 c0x0000 (---------------)  + I abbott
+	0x00365706, // n0x0005 c0x0000 (---------------)  + I abbvie
+	0x00399843, // n0x0006 c0x0000 (---------------)  + I abc
+	0x0031f144, // n0x0007 c0x0000 (---------------)  + I able
+	0x002ee207, // n0x0008 c0x0000 (---------------)  + I abogado
+	0x0026b4c8, // n0x0009 c0x0000 (---------------)  + I abudhabi
+	0x01a01542, // n0x000a c0x0006 (n0x0609-n0x060f)  + I ac
+	0x0030aec7, // n0x000b c0x0000 (---------------)  + I academy
+	0x00352a89, // n0x000c c0x0000 (---------------)  + I accenture
+	0x002d9b0a, // n0x000d c0x0000 (---------------)  + I accountant
+	0x002d9b0b, // n0x000e c0x0000 (---------------)  + I accountants
+	0x00232d83, // n0x000f c0x0000 (---------------)  + I aco
+	0x0028a206, // n0x0010 c0x0000 (---------------)  + I active
+	0x0023b505, // n0x0011 c0x0000 (---------------)  + I actor
+	0x01e00342, // n0x0012 c0x0007 (n0x060f-n0x0610)  + I ad
+	0x00212f84, // n0x0013 c0x0000 (---------------)  + I adac
+	0x0026ba03, // n0x0014 c0x0000 (---------------)  + I ads
+	0x002a1985, // n0x0015 c0x0000 (---------------)  + I adult
+	0x022035c2, // n0x0016 c0x0008 (n0x0610-n0x0618)  + I ae
+	0x0024a403, // n0x0017 c0x0000 (---------------)  + I aeg
+	0x026389c4, // n0x0018 c0x0009 (n0x0618-n0x066f)  + I aero
+	0x0025e585, // n0x0019 c0x0000 (---------------)  + I aetna
+	0x02a04a42, // n0x001a c0x000a (n0x066f-n0x0674)  + I af
+	0x0036ec8e, // n0x001b c0x0000 (---------------)  + I afamilycompany
+	0x00252703, // n0x001c c0x0000 (---------------)  + I afl
+	0x00375846, // n0x001d c0x0000 (---------------)  + I africa
+	0x0037584b, // n0x001e c0x0000 (---------------)  + I africamagic
+	0x02e01002, // n0x001f c0x000b (n0x0674-n0x0679)  + I ag
+	0x0034ac47, // n0x0020 c0x0000 (---------------)  + I agakhan
+	0x0023df86, // n0x0021 c0x0000 (---------------)  + I agency
+	0x032016c2, // n0x0022 c0x000c (n0x0679-n0x067d)  + I ai
+	0x00214d03, // n0x0023 c0x0000 (---------------)  + I aig
+	0x00214d04, // n0x0024 c0x0000 (---------------)  + I aigo
+	0x0022b886, // n0x0025 c0x0000 (---------------)  + I airbus
+	0x00338648, // n0x0026 c0x0000 (---------------)  + I airforce
+	0x00286586, // n0x0027 c0x0000 (---------------)  + I airtel
+	0x00227644, // n0x0028 c0x0000 (---------------)  + I akdn
+	0x036001c2, // n0x0029 c0x000d (n0x067d-n0x0684)  + I al
+	0x00328e49, // n0x002a c0x0000 (---------------)  + I alfaromeo
+	0x00345287, // n0x002b c0x0000 (---------------)  + I alibaba
+	0x002bc006, // n0x002c c0x0000 (---------------)  + I alipay
+	0x0033e3c9, // n0x002d c0x0000 (---------------)  + I allfinanz
+	0x0020f148, // n0x002e c0x0000 (---------------)  + I allstate
+	0x00213584, // n0x002f c0x0000 (---------------)  + I ally
+	0x0021dd86, // n0x0030 c0x0000 (---------------)  + I alsace
+	0x0020be86, // n0x0031 c0x0000 (---------------)  + I alstom
+	0x03a01882, // n0x0032 c0x000e (n0x0684-n0x0685)  + I am
+	0x0024728f, // n0x0033 c0x0000 (---------------)  + I americanexpress
+	0x00208d8e, // n0x0034 c0x0000 (---------------)  + I americanfamily
+	0x002052c4, // n0x0035 c0x0000 (---------------)  + I amex
+	0x00367585, // n0x0036 c0x0000 (---------------)  + I amfam
+	0x00230645, // n0x0037 c0x0000 (---------------)  + I amica
+	0x002c8449, // n0x0038 c0x0000 (---------------)  + I amsterdam
+	0x00243f09, // n0x0039 c0x0000 (---------------)  + I analytics
+	0x0031a8c7, // n0x003a c0x0000 (---------------)  + I android
+	0x00350706, // n0x003b c0x0000 (---------------)  + I anquan
+	0x00256b43, // n0x003c c0x0000 (---------------)  + I anz
+	0x03e029c2, // n0x003d c0x000f (n0x0685-n0x068b)  + I ao
+	0x00275643, // n0x003e c0x0000 (---------------)  + I aol
+	0x0022ce0a, // n0x003f c0x0000 (---------------)  + I apartments
+	0x002092c3, // n0x0040 c0x0000 (---------------)  + I app
+	0x00331985, // n0x0041 c0x0000 (---------------)  + I apple
+	0x002003c2, // n0x0042 c0x0000 (---------------)  + I aq
+	0x00285a49, // n0x0043 c0x0000 (---------------)  + I aquarelle
+	0x04200a42, // n0x0044 c0x0010 (n0x068b-n0x0694)  + I ar
+	0x00202044, // n0x0045 c0x0000 (---------------)  + I arab
+	0x00355146, // n0x0046 c0x0000 (---------------)  + I aramco
+	0x002fb805, // n0x0047 c0x0000 (---------------)  + I archi
+	0x00348744, // n0x0048 c0x0000 (---------------)  + I army
+	0x04a29dc4, // n0x0049 c0x0012 (n0x0695-n0x069b)  + I arpa
+	0x0023a6c4, // n0x004a c0x0000 (---------------)  + I arte
+	0x04e01d42, // n0x004b c0x0013 (n0x069b-n0x069c)  + I as
+	0x0034d284, // n0x004c c0x0000 (---------------)  + I asda
+	0x00322ec4, // n0x004d c0x0000 (---------------)  + I asia
+	0x003437ca, // n0x004e c0x0000 (---------------)  + I associates
+	0x05200102, // n0x004f c0x0014 (n0x069c-n0x06a3)  + I at
+	0x00248f47, // n0x0050 c0x0000 (---------------)  + I athleta
+	0x0031fec8, // n0x0051 c0x0000 (---------------)  + I attorney
+	0x05a04f82, // n0x0052 c0x0016 (n0x06a4-n0x06b6)  + I au
+	0x00319e07, // n0x0053 c0x0000 (---------------)  + I auction
+	0x00233104, // n0x0054 c0x0000 (---------------)  + I audi
+	0x002b7d87, // n0x0055 c0x0000 (---------------)  + I audible
+	0x00233105, // n0x0056 c0x0000 (---------------)  + I audio
+	0x0035fd47, // n0x0057 c0x0000 (---------------)  + I auspost
+	0x0031a686, // n0x0058 c0x0000 (---------------)  + I author
+	0x00265104, // n0x0059 c0x0000 (---------------)  + I auto
+	0x00324dc5, // n0x005a c0x0000 (---------------)  + I autos
+	0x002dc007, // n0x005b c0x0000 (---------------)  + I avianca
+	0x06a01082, // n0x005c c0x001a (n0x06c4-n0x06c5)  + I aw
+	0x002f6583, // n0x005d c0x0000 (---------------)  + I aws
+	0x00220402, // n0x005e c0x0000 (---------------)  + I ax
+	0x00356983, // n0x005f c0x0000 (---------------)  + I axa
+	0x06e05f42, // n0x0060 c0x001b (n0x06c5-n0x06d1)  + I az
+	0x0021be05, // n0x0061 c0x0000 (---------------)  + I azure
+	0x07202002, // n0x0062 c0x001c (n0x06d1-n0x06dc)  + I ba
+	0x002ce1c4, // n0x0063 c0x0000 (---------------)  + I baby
+	0x0027c805, // n0x0064 c0x0000 (---------------)  + I baidu
+	0x00205207, // n0x0065 c0x0000 (---------------)  + I banamex
+	0x002e97ce, // n0x0066 c0x0000 (---------------)  + I bananarepublic
+	0x00207cc4, // n0x0067 c0x0000 (---------------)  + I band
+	0x00203704, // n0x0068 c0x0000 (---------------)  + I bank
+	0x00202003, // n0x0069 c0x0000 (---------------)  + I bar
+	0x002dd889, // n0x006a c0x0000 (---------------)  + I barcelona
+	0x002c12cb, // n0x006b c0x0000 (---------------)  + I barclaycard
+	0x002dc608, // n0x006c c0x0000 (---------------)  + I barclays
+	0x00306d88, // n0x006d c0x0000 (---------------)  + I barefoot
+	0x0030e948, // n0x006e c0x0000 (---------------)  + I bargains
+	0x0022f9c8, // n0x006f c0x0000 (---------------)  + I baseball
+	0x0033e20a, // n0x0070 c0x0000 (---------------)  + I basketball
+	0x0035fc47, // n0x0071 c0x0000 (---------------)  + I bauhaus
+	0x00351786, // n0x0072 c0x0000 (---------------)  + I bayern
+	0x07630782, // n0x0073 c0x001d (n0x06dc-n0x06e6)  + I bb
+	0x003651c3, // n0x0074 c0x0000 (---------------)  + I bbc
+	0x0036cbc3, // n0x0075 c0x0000 (---------------)  + I bbt
+	0x00376984, // n0x0076 c0x0000 (---------------)  + I bbva
+	0x00399883, // n0x0077 c0x0000 (---------------)  + I bcg
+	0x00239b43, // n0x0078 c0x0000 (---------------)  + I bcn
+	0x017129c2, // n0x0079 c0x0005 (---------------)* o I bd
+	0x07a03302, // n0x007a c0x001e (n0x06e6-n0x06e8)  + I be
+	0x0022b505, // n0x007b c0x0000 (---------------)  + I beats
+	0x0024f5c6, // n0x007c c0x0000 (---------------)  + I beauty
+	0x002ccb84, // n0x007d c0x0000 (---------------)  + I beer
+	0x00383b87, // n0x007e c0x0000 (---------------)  + I bentley
+	0x0022e6c6, // n0x007f c0x0000 (---------------)  + I berlin
+	0x002291c4, // n0x0080 c0x0000 (---------------)  + I best
+	0x00398887, // n0x0081 c0x0000 (---------------)  + I bestbuy
+	0x00208c03, // n0x0082 c0x0000 (---------------)  + I bet
+	0x07f5d242, // n0x0083 c0x001f (n0x06e8-n0x06e9)  + I bf
+	0x082ee482, // n0x0084 c0x0020 (n0x06e9-n0x070e)  + I bg
+	0x08615602, // n0x0085 c0x0021 (n0x070e-n0x0713)  + I bh
+	0x00215606, // n0x0086 c0x0000 (---------------)  + I bharti
+	0x08a00002, // n0x0087 c0x0022 (n0x0713-n0x0718)  + I bi
+	0x0037bf45, // n0x0088 c0x0000 (---------------)  + I bible
+	0x00313f03, // n0x0089 c0x0000 (---------------)  + I bid
+	0x00202544, // n0x008a c0x0000 (---------------)  + I bike
+	0x002dc444, // n0x008b c0x0000 (---------------)  + I bing
+	0x002dc445, // n0x008c c0x0000 (---------------)  + I bingo
+	0x00203a03, // n0x008d c0x0000 (---------------)  + I bio
+	0x08f30b83, // n0x008e c0x0023 (n0x0718-n0x0720)  + I biz
+	0x09206502, // n0x008f c0x0024 (n0x0720-n0x0724)  + I bj
+	0x00288ec5, // n0x0090 c0x0000 (---------------)  + I black
+	0x00288ecb, // n0x0091 c0x0000 (---------------)  + I blackfriday
+	0x00258fc6, // n0x0092 c0x0000 (---------------)  + I blanco
+	0x0020c8cb, // n0x0093 c0x0000 (---------------)  + I blockbuster
+	0x002a4004, // n0x0094 c0x0000 (---------------)  + I blog
+	0x0020d009, // n0x0095 c0x0000 (---------------)  + I bloomberg
+	0x0020e104, // n0x0096 c0x0000 (---------------)  + I blue
+	0x0960e742, // n0x0097 c0x0025 (n0x0724-n0x0729)  + I bm
+	0x0020f6c3, // n0x0098 c0x0000 (---------------)  + I bms
+	0x0020fc43, // n0x0099 c0x0000 (---------------)  + I bmw
+	0x016104c2, // n0x009a c0x0005 (---------------)* o I bn
+	0x002477c3, // n0x009b c0x0000 (---------------)  + I bnl
+	0x002104ca, // n0x009c c0x0000 (---------------)  + I bnpparibas
+	0x09a0e402, // n0x009d c0x0026 (n0x0729-n0x0732)  + I bo
+	0x0030b145, // n0x009e c0x0000 (---------------)  + I boats
+	0x0020e40a, // n0x009f c0x0000 (---------------)  + I boehringer
+	0x00290b84, // n0x00a0 c0x0000 (---------------)  + I bofa
+	0x00210ac3, // n0x00a1 c0x0000 (---------------)  + I bom
+	0x00210f84, // n0x00a2 c0x0000 (---------------)  + I bond
+	0x00215403, // n0x00a3 c0x0000 (---------------)  + I boo
+	0x00215404, // n0x00a4 c0x0000 (---------------)  + I book
+	0x00215407, // n0x00a5 c0x0000 (---------------)  + I booking
+	0x00215e85, // n0x00a6 c0x0000 (---------------)  + I boots
+	0x002173c5, // n0x00a7 c0x0000 (---------------)  + I bosch
+	0x00217986, // n0x00a8 c0x0000 (---------------)  + I bostik
+	0x00217cc6, // n0x00a9 c0x0000 (---------------)  + I boston
+	0x00218e83, // n0x00aa c0x0000 (---------------)  + I bot
+	0x0021b7c8, // n0x00ab c0x0000 (---------------)  + I boutique
+	0x0021bb83, // n0x00ac c0x0000 (---------------)  + I box
+	0x09e1c402, // n0x00ad c0x0027 (n0x0732-n0x0778)  + I br
+	0x0021c408, // n0x00ae c0x0000 (---------------)  + I bradesco
+	0x00221b8b, // n0x00af c0x0000 (---------------)  + I bridgestone
+	0x00220008, // n0x00b0 c0x0000 (---------------)  + I broadway
+	0x00220c46, // n0x00b1 c0x0000 (---------------)  + I broker
+	0x00222007, // n0x00b2 c0x0000 (---------------)  + I brother
+	0x00225e88, // n0x00b3 c0x0000 (---------------)  + I brussels
+	0x0a637542, // n0x00b4 c0x0029 (n0x0779-n0x077e)  + I bs
+	0x0aa1fd02, // n0x00b5 c0x002a (n0x077e-n0x0783)  + I bt
+	0x0020a008, // n0x00b6 c0x0000 (---------------)  + I budapest
+	0x002e5b47, // n0x00b7 c0x0000 (---------------)  + I bugatti
+	0x002410c5, // n0x00b8 c0x0000 (---------------)  + I build
+	0x002410c8, // n0x00b9 c0x0000 (---------------)  + I builders
+	0x0022c188, // n0x00ba c0x0000 (---------------)  + I business
+	0x003004c3, // n0x00bb c0x0000 (---------------)  + I buy
+	0x0022dec4, // n0x00bc c0x0000 (---------------)  + I buzz
+	0x00365782, // n0x00bd c0x0000 (---------------)  + I bv
+	0x0ae2fe42, // n0x00be c0x002b (n0x0783-n0x0785)  + I bw
+	0x0b20f982, // n0x00bf c0x002c (n0x0785-n0x0789)  + I by
+	0x0ba30bc2, // n0x00c0 c0x002e (n0x078a-n0x0790)  + I bz
+	0x00230bc3, // n0x00c1 c0x0000 (---------------)  + I bzh
+	0x0be00302, // n0x00c2 c0x002f (n0x0790-n0x07a1)  + I ca
+	0x00230703, // n0x00c3 c0x0000 (---------------)  + I cab
+	0x0030ee44, // n0x00c4 c0x0000 (---------------)  + I cafe
+	0x00213543, // n0x00c5 c0x0000 (---------------)  + I cal
+	0x00213544, // n0x00c6 c0x0000 (---------------)  + I call
+	0x002ed9cb, // n0x00c7 c0x0000 (---------------)  + I calvinklein
+	0x0037c746, // n0x00c8 c0x0000 (---------------)  + I camera
+	0x00241ac4, // n0x00c9 c0x0000 (---------------)  + I camp
+	0x0029f88e, // n0x00ca c0x0000 (---------------)  + I cancerresearch
+	0x00265485, // n0x00cb c0x0000 (---------------)  + I canon
+	0x002dc148, // n0x00cc c0x0000 (---------------)  + I capetown
+	0x002f0b87, // n0x00cd c0x0000 (---------------)  + I capital
+	0x002f0b8a, // n0x00ce c0x0000 (---------------)  + I capitalone
+	0x0020af43, // n0x00cf c0x0000 (---------------)  + I car
+	0x00236a47, // n0x00d0 c0x0000 (---------------)  + I caravan
+	0x002c1485, // n0x00d1 c0x0000 (---------------)  + I cards
+	0x0036b504, // n0x00d2 c0x0000 (---------------)  + I care
+	0x0036b506, // n0x00d3 c0x0000 (---------------)  + I career
+	0x0036b507, // n0x00d4 c0x0000 (---------------)  + I careers
+	0x00305f84, // n0x00d5 c0x0000 (---------------)  + I cars
+	0x00390b47, // n0x00d6 c0x0000 (---------------)  + I cartier
+	0x00214604, // n0x00d7 c0x0000 (---------------)  + I casa
+	0x002188c4, // n0x00d8 c0x0000 (---------------)  + I case
+	0x002188c6, // n0x00d9 c0x0000 (---------------)  + I caseih
+	0x002c99c4, // n0x00da c0x0000 (---------------)  + I cash
+	0x0037bc46, // n0x00db c0x0000 (---------------)  + I casino
+	0x0020df43, // n0x00dc c0x0000 (---------------)  + I cat
+	0x00351008, // n0x00dd c0x0000 (---------------)  + I catering
+	0x0037ba88, // n0x00de c0x0000 (---------------)  + I catholic
+	0x0024b283, // n0x00df c0x0000 (---------------)  + I cba
+	0x00247783, // n0x00e0 c0x0000 (---------------)  + I cbn
+	0x0038c544, // n0x00e1 c0x0000 (---------------)  + I cbre
+	0x00391103, // n0x00e2 c0x0000 (---------------)  + I cbs
+	0x0c22e182, // n0x00e3 c0x0030 (n0x07a1-n0x07a5)  + I cc
+	0x0c63e2c2, // n0x00e4 c0x0031 (n0x07a5-n0x07a6)  + I cd
+	0x00206483, // n0x00e5 c0x0000 (---------------)  + I ceb
+	0x00204486, // n0x00e6 c0x0000 (---------------)  + I center
+	0x002c87c3, // n0x00e7 c0x0000 (---------------)  + I ceo
+	0x002e61c4, // n0x00e8 c0x0000 (---------------)  + I cern
+	0x0ca14202, // n0x00e9 c0x0032 (n0x07a6-n0x07a7)  + I cf
+	0x00214203, // n0x00ea c0x0000 (---------------)  + I cfa
+	0x00379503, // n0x00eb c0x0000 (---------------)  + I cfd
+	0x0021a302, // n0x00ec c0x0000 (---------------)  + I cg
+	0x0ce01582, // n0x00ed c0x0033 (n0x07a7-n0x07a8)  + I ch
+	0x002ba9c6, // n0x00ee c0x0000 (---------------)  + I chanel
+	0x0023c407, // n0x00ef c0x0000 (---------------)  + I channel
+	0x00329845, // n0x00f0 c0x0000 (---------------)  + I chase
+	0x0022ac44, // n0x00f1 c0x0000 (---------------)  + I chat
+	0x00284305, // n0x00f2 c0x0000 (---------------)  + I cheap
+	0x00201587, // n0x00f3 c0x0000 (---------------)  + I chintai
+	0x002aee85, // n0x00f4 c0x0000 (---------------)  + I chloe
+	0x003a3989, // n0x00f5 c0x0000 (---------------)  + I christmas
+	0x003024c6, // n0x00f6 c0x0000 (---------------)  + I chrome
+	0x00303188, // n0x00f7 c0x0000 (---------------)  + I chrysler
+	0x00329746, // n0x00f8 c0x0000 (---------------)  + I church
+	0x0d200682, // n0x00f9 c0x0034 (n0x07a8-n0x07b7)  + I ci
+	0x0023fe08, // n0x00fa c0x0000 (---------------)  + I cipriani
+	0x00336206, // n0x00fb c0x0000 (---------------)  + I circle
+	0x00200685, // n0x00fc c0x0000 (---------------)  + I cisco
+	0x0033cc87, // n0x00fd c0x0000 (---------------)  + I citadel
+	0x00350f04, // n0x00fe c0x0000 (---------------)  + I citi
+	0x00350f05, // n0x00ff c0x0000 (---------------)  + I citic
+	0x00286744, // n0x0100 c0x0000 (---------------)  + I city
+	0x00286748, // n0x0101 c0x0000 (---------------)  + I cityeats
+	0x0d60b482, // n0x0102 c0x0035 (n0x07b7-n0x07b8)* o I ck
+	0x0da09182, // n0x0103 c0x0036 (n0x07b8-n0x07bd)  + I cl
+	0x00378546, // n0x0104 c0x0000 (---------------)  + I claims
+	0x002242c8, // n0x0105 c0x0000 (---------------)  + I cleaning
+	0x00379a45, // n0x0106 c0x0000 (---------------)  + I click
+	0x0037b946, // n0x0107 c0x0000 (---------------)  + I clinic
+	0x00387188, // n0x0108 c0x0000 (---------------)  + I clinique
+	0x0039a588, // n0x0109 c0x0000 (---------------)  + I clothing
+	0x00209185, // n0x010a c0x0000 (---------------)  + I cloud
+	0x00238ac4, // n0x010b c0x0000 (---------------)  + I club
+	0x00238ac7, // n0x010c c0x0000 (---------------)  + I clubmed
+	0x0de5d142, // n0x010d c0x0037 (n0x07bd-n0x07c1)  + I cm
+	0x0e21ba42, // n0x010e c0x0038 (n0x07c1-n0x07ee)  + I cn
+	0x0fa00742, // n0x010f c0x003e (n0x07f3-n0x0800)  + I co
+	0x00358885, // n0x0110 c0x0000 (---------------)  + I coach
+	0x0029bd05, // n0x0111 c0x0000 (---------------)  + I codes
+	0x0020b246, // n0x0112 c0x0000 (---------------)  + I coffee
+	0x0022e1c7, // n0x0113 c0x0000 (---------------)  + I college
+	0x00231a87, // n0x0114 c0x0000 (---------------)  + I cologne
+	0x10233503, // n0x0115 c0x0040 (n0x0801-n0x08d7)  + I com
+	0x002a6b87, // n0x0116 c0x0000 (---------------)  + I comcast
+	0x002da788, // n0x0117 c0x0000 (---------------)  + I commbank
+	0x00233509, // n0x0118 c0x0000 (---------------)  + I community
+	0x0036ee47, // n0x0119 c0x0000 (---------------)  + I company
+	0x00234a07, // n0x011a c0x0000 (---------------)  + I compare
+	0x00235488, // n0x011b c0x0000 (---------------)  + I computer
+	0x00235c86, // n0x011c c0x0000 (---------------)  + I comsec
+	0x00236246, // n0x011d c0x0000 (---------------)  + I condos
+	0x00236f4c, // n0x011e c0x0000 (---------------)  + I construction
+	0x00237d0a, // n0x011f c0x0000 (---------------)  + I consulting
+	0x00239e07, // n0x0120 c0x0000 (---------------)  + I contact
+	0x0023b3cb, // n0x0121 c0x0000 (---------------)  + I contractors
+	0x0023c247, // n0x0122 c0x0000 (---------------)  + I cooking
+	0x0023c24e, // n0x0123 c0x0000 (---------------)  + I cookingchannel
+	0x0023d384, // n0x0124 c0x0000 (---------------)  + I cool
+	0x0023d684, // n0x0125 c0x0000 (---------------)  + I coop
+	0x0023ea07, // n0x0126 c0x0000 (---------------)  + I corsica
+	0x00336587, // n0x0127 c0x0000 (---------------)  + I country
+	0x002423c6, // n0x0128 c0x0000 (---------------)  + I coupon
+	0x002423c7, // n0x0129 c0x0000 (---------------)  + I coupons
+	0x00242fc7, // n0x012a c0x0000 (---------------)  + I courses
+	0x126049c2, // n0x012b c0x0049 (n0x08fe-n0x0905)  + I cr
+	0x002447c6, // n0x012c c0x0000 (---------------)  + I credit
+	0x002447ca, // n0x012d c0x0000 (---------------)  + I creditcard
+	0x00244a4b, // n0x012e c0x0000 (---------------)  + I creditunion
+	0x00245b47, // n0x012f c0x0000 (---------------)  + I cricket
+	0x00246505, // n0x0130 c0x0000 (---------------)  + I crown
+	0x00246643, // n0x0131 c0x0000 (---------------)  + I crs
+	0x00246b46, // n0x0132 c0x0000 (---------------)  + I cruise
+	0x00246b47, // n0x0133 c0x0000 (---------------)  + I cruises
+	0x002440c3, // n0x0134 c0x0000 (---------------)  + I csc
+	0x12a09d82, // n0x0135 c0x004a (n0x0905-n0x090b)  + I cu
+	0x00246f0a, // n0x0136 c0x0000 (---------------)  + I cuisinella
+	0x12f53bc2, // n0x0137 c0x004b (n0x090b-n0x090c)  + I cv
+	0x132c95c2, // n0x0138 c0x004c (n0x090c-n0x0910)  + I cw
+	0x136482c2, // n0x0139 c0x004d (n0x0910-n0x0912)  + I cx
+	0x13a3e082, // n0x013a c0x004e (n0x0912-n0x091f)  o I cy
+	0x0024a985, // n0x013b c0x0000 (---------------)  + I cymru
+	0x0024b084, // n0x013c c0x0000 (---------------)  + I cyou
+	0x14229ec2, // n0x013d c0x0050 (n0x0920-n0x0922)  + I cz
+	0x0034d305, // n0x013e c0x0000 (---------------)  + I dabur
+	0x002a1943, // n0x013f c0x0000 (---------------)  + I dad
+	0x00223d45, // n0x0140 c0x0000 (---------------)  + I dance
+	0x0020c7c4, // n0x0141 c0x0000 (---------------)  + I date
+	0x0020e206, // n0x0142 c0x0000 (---------------)  + I dating
+	0x00292c46, // n0x0143 c0x0000 (---------------)  + I datsun
+	0x00265983, // n0x0144 c0x0000 (---------------)  + I day
+	0x0023f244, // n0x0145 c0x0000 (---------------)  + I dclk
+	0x0025f303, // n0x0146 c0x0000 (---------------)  + I dds
+	0x14604d82, // n0x0147 c0x0051 (n0x0922-n0x092a)  + I de
+	0x00204d84, // n0x0148 c0x0000 (---------------)  + I deal
+	0x00239046, // n0x0149 c0x0000 (---------------)  + I dealer
+	0x00204d85, // n0x014a c0x0000 (---------------)  + I deals
+	0x003a0286, // n0x014b c0x0000 (---------------)  + I degree
+	0x0033cd88, // n0x014c c0x0000 (---------------)  + I delivery
+	0x0025a384, // n0x014d c0x0000 (---------------)  + I dell
+	0x00345f48, // n0x014e c0x0000 (---------------)  + I deloitte
+	0x00311f45, // n0x014f c0x0000 (---------------)  + I delta
+	0x002265c8, // n0x0150 c0x0000 (---------------)  + I democrat
+	0x002abe06, // n0x0151 c0x0000 (---------------)  + I dental
+	0x002b2407, // n0x0152 c0x0000 (---------------)  + I dentist
+	0x0022dcc4, // n0x0153 c0x0000 (---------------)  + I desi
+	0x0022dcc6, // n0x0154 c0x0000 (---------------)  + I design
+	0x002329c3, // n0x0155 c0x0000 (---------------)  + I dev
+	0x0037a7c3, // n0x0156 c0x0000 (---------------)  + I dhl
+	0x002c42c8, // n0x0157 c0x0000 (---------------)  + I diamonds
+	0x0030ce84, // n0x0158 c0x0000 (---------------)  + I diet
+	0x00308ec7, // n0x0159 c0x0000 (---------------)  + I digital
+	0x0024d786, // n0x015a c0x0000 (---------------)  + I direct
+	0x0024d789, // n0x015b c0x0000 (---------------)  + I directory
+	0x0031aa48, // n0x015c c0x0000 (---------------)  + I discount
+	0x00330408, // n0x015d c0x0000 (---------------)  + I discover
+	0x00229304, // n0x015e c0x0000 (---------------)  + I dish
+	0x00320843, // n0x015f c0x0000 (---------------)  + I diy
+	0x00266a02, // n0x0160 c0x0000 (---------------)  + I dj
+	0x14a494c2, // n0x0161 c0x0052 (n0x092a-n0x092b)  + I dk
+	0x14e0fa82, // n0x0162 c0x0053 (n0x092b-n0x0930)  + I dm
+	0x00321fc3, // n0x0163 c0x0000 (---------------)  + I dnp
+	0x15213282, // n0x0164 c0x0054 (n0x0930-n0x093a)  + I do
+	0x002ee344, // n0x0165 c0x0000 (---------------)  + I docs
+	0x00213285, // n0x0166 c0x0000 (---------------)  + I dodge
+	0x002459c3, // n0x0167 c0x0000 (---------------)  + I dog
+	0x00236044, // n0x0168 c0x0000 (---------------)  + I doha
+	0x00339ec7, // n0x0169 c0x0000 (---------------)  + I domains
+	0x0032f743, // n0x016a c0x0000 (---------------)  + I dot
+	0x00269fc8, // n0x016b c0x0000 (---------------)  + I download
+	0x00354745, // n0x016c c0x0000 (---------------)  + I drive
+	0x00356c44, // n0x016d c0x0000 (---------------)  + I dstv
+	0x00364483, // n0x016e c0x0000 (---------------)  + I dtv
+	0x0027c785, // n0x016f c0x0000 (---------------)  + I dubai
+	0x0027c8c4, // n0x0170 c0x0000 (---------------)  + I duck
+	0x00390846, // n0x0171 c0x0000 (---------------)  + I dunlop
+	0x003a6804, // n0x0172 c0x0000 (---------------)  + I duns
+	0x002008c6, // n0x0173 c0x0000 (---------------)  + I dupont
+	0x00205146, // n0x0174 c0x0000 (---------------)  + I durban
+	0x00317284, // n0x0175 c0x0000 (---------------)  + I dvag
+	0x00212b03, // n0x0176 c0x0000 (---------------)  + I dwg
+	0x15607a82, // n0x0177 c0x0055 (n0x093a-n0x0942)  + I dz
+	0x0034ab05, // n0x0178 c0x0000 (---------------)  + I earth
+	0x0022b543, // n0x0179 c0x0000 (---------------)  + I eat
+	0x15a09b02, // n0x017a c0x0056 (n0x0942-n0x094e)  + I ec
+	0x002b94c5, // n0x017b c0x0000 (---------------)  + I edeka
+	0x0023a783, // n0x017c c0x0000 (---------------)  + I edu
+	0x0023a789, // n0x017d c0x0000 (---------------)  + I education
+	0x15e0b342, // n0x017e c0x0057 (n0x094e-n0x0958)  + I ee
+	0x16608442, // n0x017f c0x0059 (n0x0959-n0x0962)  + I eg
+	0x002ce585, // n0x0180 c0x0000 (---------------)  + I email
+	0x002c4646, // n0x0181 c0x0000 (---------------)  + I emerck
+	0x00356047, // n0x0182 c0x0000 (---------------)  + I emerson
+	0x002cb4c6, // n0x0183 c0x0000 (---------------)  + I energy
+	0x00369148, // n0x0184 c0x0000 (---------------)  + I engineer
+	0x0036914b, // n0x0185 c0x0000 (---------------)  + I engineering
+	0x002044cb, // n0x0186 c0x0000 (---------------)  + I enterprises
+	0x0039f945, // n0x0187 c0x0000 (---------------)  + I epost
+	0x0039ffc5, // n0x0188 c0x0000 (---------------)  + I epson
+	0x002c2709, // n0x0189 c0x0000 (---------------)  + I equipment
+	0x01603682, // n0x018a c0x0005 (---------------)* o I er
+	0x00317448, // n0x018b c0x0000 (---------------)  + I ericsson
+	0x0020cb04, // n0x018c c0x0000 (---------------)  + I erni
+	0x16e00482, // n0x018d c0x005b (n0x0963-n0x0968)  + I es
+	0x0027a303, // n0x018e c0x0000 (---------------)  + I esq
+	0x002c2486, // n0x018f c0x0000 (---------------)  + I estate
+	0x0028d2c8, // n0x0190 c0x0000 (---------------)  + I esurance
+	0x176053c2, // n0x0191 c0x005d (n0x0969-n0x0971)  + I et
+	0x002234c8, // n0x0192 c0x0000 (---------------)  + I etisalat
+	0x00204b82, // n0x0193 c0x0000 (---------------)  + I eu
+	0x0033c78a, // n0x0194 c0x0000 (---------------)  + I eurovision
+	0x00228883, // n0x0195 c0x0000 (---------------)  + I eus
+	0x00232a06, // n0x0196 c0x0000 (---------------)  + I events
+	0x00203608, // n0x0197 c0x0000 (---------------)  + I everbank
+	0x00239488, // n0x0198 c0x0000 (---------------)  + I exchange
+	0x0031ee06, // n0x0199 c0x0000 (---------------)  + I expert
+	0x00363107, // n0x019a c0x0000 (---------------)  + I exposed
+	0x00247487, // n0x019b c0x0000 (---------------)  + I express
+	0x0020ba0a, // n0x019c c0x0000 (---------------)  + I extraspace
+	0x00290c04, // n0x019d c0x0000 (---------------)  + I fage
+	0x00214244, // n0x019e c0x0000 (---------------)  + I fail
+	0x0033b609, // n0x019f c0x0000 (---------------)  + I fairwinds
+	0x00350405, // n0x01a0 c0x0000 (---------------)  + I faith
+	0x00208f86, // n0x01a1 c0x0000 (---------------)  + I family
+	0x00211d03, // n0x01a2 c0x0000 (---------------)  + I fan
+	0x002e0ec4, // n0x01a3 c0x0000 (---------------)  + I fans
+	0x00271d04, // n0x01a4 c0x0000 (---------------)  + I farm
+	0x002ece87, // n0x01a5 c0x0000 (---------------)  + I farmers
+	0x0022fec7, // n0x01a6 c0x0000 (---------------)  + I fashion
+	0x0024c204, // n0x01a7 c0x0000 (---------------)  + I fast
+	0x00211505, // n0x01a8 c0x0000 (---------------)  + I fedex
+	0x0020b308, // n0x01a9 c0x0000 (---------------)  + I feedback
+	0x00337007, // n0x01aa c0x0000 (---------------)  + I ferrari
+	0x00343407, // n0x01ab c0x0000 (---------------)  + I ferrero
+	0x17a07502, // n0x01ac c0x005e (n0x0971-n0x0974)  + I fi
+	0x00294744, // n0x01ad c0x0000 (---------------)  + I fiat
+	0x0035ee48, // n0x01ae c0x0000 (---------------)  + I fidelity
+	0x00365b84, // n0x01af c0x0000 (---------------)  + I fido
+	0x0024b784, // n0x01b0 c0x0000 (---------------)  + I film
+	0x0024bb85, // n0x01b1 c0x0000 (---------------)  + I final
+	0x0024bcc7, // n0x01b2 c0x0000 (---------------)  + I finance
+	0x00207509, // n0x01b3 c0x0000 (---------------)  + I financial
+	0x0024c6c4, // n0x01b4 c0x0000 (---------------)  + I fire
+	0x0024d4c9, // n0x01b5 c0x0000 (---------------)  + I firestone
+	0x0024d9c8, // n0x01b6 c0x0000 (---------------)  + I firmdale
+	0x0024e044, // n0x01b7 c0x0000 (---------------)  + I fish
+	0x0024e047, // n0x01b8 c0x0000 (---------------)  + I fishing
+	0x0024f083, // n0x01b9 c0x0000 (---------------)  + I fit
+	0x0024f807, // n0x01ba c0x0000 (---------------)  + I fitness
+	0x01615b02, // n0x01bb c0x0005 (---------------)* o I fj
+	0x01799fc2, // n0x01bc c0x0005 (---------------)* o I fk
+	0x00250686, // n0x01bd c0x0000 (---------------)  + I flickr
+	0x00251287, // n0x01be c0x0000 (---------------)  + I flights
+	0x00251c04, // n0x01bf c0x0000 (---------------)  + I flir
+	0x00252b07, // n0x01c0 c0x0000 (---------------)  + I florist
+	0x002539c7, // n0x01c1 c0x0000 (---------------)  + I flowers
+	0x00253f08, // n0x01c2 c0x0000 (---------------)  + I flsmidth
+	0x002549c3, // n0x01c3 c0x0000 (---------------)  + I fly
+	0x00242902, // n0x01c4 c0x0000 (---------------)  + I fm
+	0x002558c2, // n0x01c5 c0x0000 (---------------)  + I fo
+	0x00255a83, // n0x01c6 c0x0000 (---------------)  + I foo
+	0x00255a8b, // n0x01c7 c0x0000 (---------------)  + I foodnetwork
+	0x00306e88, // n0x01c8 c0x0000 (---------------)  + I football
+	0x0039bf44, // n0x01c9 c0x0000 (---------------)  + I ford
+	0x00257585, // n0x01ca c0x0000 (---------------)  + I forex
+	0x00259787, // n0x01cb c0x0000 (---------------)  + I forsale
+	0x0025b085, // n0x01cc c0x0000 (---------------)  + I forum
+	0x002b9f4a, // n0x01cd c0x0000 (---------------)  + I foundation
+	0x0025c143, // n0x01ce c0x0000 (---------------)  + I fox
+	0x17e00582, // n0x01cf c0x005f (n0x0974-n0x098c)  + I fr
+	0x002e7d04, // n0x01d0 c0x0000 (---------------)  + I free
+	0x0025f7c9, // n0x01d1 c0x0000 (---------------)  + I fresenius
+	0x00263603, // n0x01d2 c0x0000 (---------------)  + I frl
+	0x002636c7, // n0x01d3 c0x0000 (---------------)  + I frogans
+	0x0039d609, // n0x01d4 c0x0000 (---------------)  + I frontdoor
+	0x003980c8, // n0x01d5 c0x0000 (---------------)  + I frontier
+	0x00204a83, // n0x01d6 c0x0000 (---------------)  + I ftr
+	0x0027b8c7, // n0x01d7 c0x0000 (---------------)  + I fujitsu
+	0x0027bdc9, // n0x01d8 c0x0000 (---------------)  + I fujixerox
+	0x002312c3, // n0x01d9 c0x0000 (---------------)  + I fun
+	0x00283c84, // n0x01da c0x0000 (---------------)  + I fund
+	0x00285349, // n0x01db c0x0000 (---------------)  + I furniture
+	0x00287806, // n0x01dc c0x0000 (---------------)  + I futbol
+	0x002888c3, // n0x01dd c0x0000 (---------------)  + I fyi
+	0x00201042, // n0x01de c0x0000 (---------------)  + I ga
+	0x0021dd43, // n0x01df c0x0000 (---------------)  + I gal
+	0x00392147, // n0x01e0 c0x0000 (---------------)  + I gallery
+	0x00336385, // n0x01e1 c0x0000 (---------------)  + I gallo
+	0x002dd686, // n0x01e2 c0x0000 (---------------)  + I gallup
+	0x00297cc4, // n0x01e3 c0x0000 (---------------)  + I game
+	0x003700c5, // n0x01e4 c0x0000 (---------------)  + I games
+	0x0022cdc3, // n0x01e5 c0x0000 (---------------)  + I gap
+	0x002190c6, // n0x01e6 c0x0000 (---------------)  + I garden
+	0x0020d202, // n0x01e7 c0x0000 (---------------)  + I gb
+	0x00387944, // n0x01e8 c0x0000 (---------------)  + I gbiz
+	0x00222d42, // n0x01e9 c0x0000 (---------------)  + I gd
+	0x002fb203, // n0x01ea c0x0000 (---------------)  + I gdn
+	0x182026c2, // n0x01eb c0x0060 (n0x098c-n0x0993)  + I ge
+	0x002534c3, // n0x01ec c0x0000 (---------------)  + I gea
+	0x00218144, // n0x01ed c0x0000 (---------------)  + I gent
+	0x00218147, // n0x01ee c0x0000 (---------------)  + I genting
+	0x00324b46, // n0x01ef c0x0000 (---------------)  + I george
+	0x00269a82, // n0x01f0 c0x0000 (---------------)  + I gf
+	0x18654282, // n0x01f1 c0x0061 (n0x0993-n0x0996)  + I gg
+	0x00330644, // n0x01f2 c0x0000 (---------------)  + I ggee
+	0x18a41602, // n0x01f3 c0x0062 (n0x0996-n0x099b)  + I gh
+	0x18e134c2, // n0x01f4 c0x0063 (n0x099b-n0x09a1)  + I gi
+	0x00344f44, // n0x01f5 c0x0000 (---------------)  + I gift
+	0x00344f45, // n0x01f6 c0x0000 (---------------)  + I gifts
+	0x00269485, // n0x01f7 c0x0000 (---------------)  + I gives
+	0x003481c6, // n0x01f8 c0x0000 (---------------)  + I giving
+	0x1920ce42, // n0x01f9 c0x0064 (n0x09a1-n0x09a6)  + I gl
+	0x00345e85, // n0x01fa c0x0000 (---------------)  + I glade
+	0x0039ef45, // n0x01fb c0x0000 (---------------)  + I glass
+	0x00285d83, // n0x01fc c0x0000 (---------------)  + I gle
+	0x0020d846, // n0x01fd c0x0000 (---------------)  + I global
+	0x0020e345, // n0x01fe c0x0000 (---------------)  + I globo
+	0x00215582, // n0x01ff c0x0000 (---------------)  + I gm
+	0x00335e45, // n0x0200 c0x0000 (---------------)  + I gmail
+	0x00215584, // n0x0201 c0x0000 (---------------)  + I gmbh
+	0x002182c3, // n0x0202 c0x0000 (---------------)  + I gmo
+	0x0021bac3, // n0x0203 c0x0000 (---------------)  + I gmx
+	0x19608342, // n0x0204 c0x0065 (n0x09a6-n0x09ac)  + I gn
+	0x002e9bc7, // n0x0205 c0x0000 (---------------)  + I godaddy
+	0x0024dbc4, // n0x0206 c0x0000 (---------------)  + I gold
+	0x0024dbc9, // n0x0207 c0x0000 (---------------)  + I goldpoint
+	0x0024e1c4, // n0x0208 c0x0000 (---------------)  + I golf
+	0x00299dc3, // n0x0209 c0x0000 (---------------)  + I goo
+	0x0031bac9, // n0x020a c0x0000 (---------------)  + I goodhands
+	0x0034a9c8, // n0x020b c0x0000 (---------------)  + I goodyear
+	0x0029bb84, // n0x020c c0x0000 (---------------)  + I goog
+	0x0029bb86, // n0x020d c0x0000 (---------------)  + I google
+	0x002a36c3, // n0x020e c0x0000 (---------------)  + I gop
+	0x00211ec3, // n0x020f c0x0000 (---------------)  + I got
+	0x002dc504, // n0x0210 c0x0000 (---------------)  + I gotv
+	0x0026cc83, // n0x0211 c0x0000 (---------------)  + I gov
+	0x19adad02, // n0x0212 c0x0066 (n0x09ac-n0x09b2)  + I gp
+	0x003010c2, // n0x0213 c0x0000 (---------------)  + I gq
+	0x19e00c82, // n0x0214 c0x0067 (n0x09b2-n0x09b8)  + I gr
+	0x00315908, // n0x0215 c0x0000 (---------------)  + I grainger
+	0x003216c8, // n0x0216 c0x0000 (---------------)  + I graphics
+	0x0038b986, // n0x0217 c0x0000 (---------------)  + I gratis
+	0x002503c5, // n0x0218 c0x0000 (---------------)  + I green
+	0x0022fd05, // n0x0219 c0x0000 (---------------)  + I gripe
+	0x0020ab45, // n0x021a c0x0000 (---------------)  + I group
+	0x0023a242, // n0x021b c0x0000 (---------------)  + I gs
+	0x1a23f142, // n0x021c c0x0068 (n0x09b8-n0x09bf)  + I gt
+	0x0160dd42, // n0x021d c0x0005 (---------------)* o I gu
+	0x00350588, // n0x021e c0x0000 (---------------)  + I guardian
+	0x0023fd45, // n0x021f c0x0000 (---------------)  + I gucci
+	0x002e05c4, // n0x0220 c0x0000 (---------------)  + I guge
+	0x00232905, // n0x0221 c0x0000 (---------------)  + I guide
+	0x0023cc87, // n0x0222 c0x0000 (---------------)  + I guitars
+	0x002594c4, // n0x0223 c0x0000 (---------------)  + I guru
+	0x002167c2, // n0x0224 c0x0000 (---------------)  + I gw
+	0x1a602302, // n0x0225 c0x0069 (n0x09bf-n0x09c5)  + I gy
+	0x0030c744, // n0x0226 c0x0000 (---------------)  + I hair
+	0x0020ccc7, // n0x0227 c0x0000 (---------------)  + I hamburg
+	0x00394c47, // n0x0228 c0x0000 (---------------)  + I hangout
+	0x0035fd04, // n0x0229 c0x0000 (---------------)  + I haus
+	0x00290b43, // n0x022a c0x0000 (---------------)  + I hbo
+	0x0024b1c4, // n0x022b c0x0000 (---------------)  + I hdfc
+	0x0024b1c8, // n0x022c c0x0000 (---------------)  + I hdfcbank
+	0x0036b386, // n0x022d c0x0000 (---------------)  + I health
+	0x0036b38a, // n0x022e c0x0000 (---------------)  + I healthcare
+	0x002073c4, // n0x022f c0x0000 (---------------)  + I help
+	0x0020ebc8, // n0x0230 c0x0000 (---------------)  + I helsinki
+	0x00254184, // n0x0231 c0x0000 (---------------)  + I here
+	0x00222106, // n0x0232 c0x0000 (---------------)  + I hermes
+	0x00292304, // n0x0233 c0x0000 (---------------)  + I hgtv
+	0x00358b86, // n0x0234 c0x0000 (---------------)  + I hiphop
+	0x002ebcc9, // n0x0235 c0x0000 (---------------)  + I hisamitsu
+	0x002a27c7, // n0x0236 c0x0000 (---------------)  + I hitachi
+	0x0027d3c3, // n0x0237 c0x0000 (---------------)  + I hiv
+	0x1aa0a882, // n0x0238 c0x006a (n0x09c5-n0x09dd)  + I hk
+	0x0026da43, // n0x0239 c0x0000 (---------------)  + I hkt
+	0x0020e942, // n0x023a c0x0000 (---------------)  + I hm
+	0x1ae1ab42, // n0x023b c0x006b (n0x09dd-n0x09e3)  + I hn
+	0x002df846, // n0x023c c0x0000 (---------------)  + I hockey
+	0x0035e208, // n0x023d c0x0000 (---------------)  + I holdings
+	0x002a5007, // n0x023e c0x0000 (---------------)  + I holiday
+	0x00274049, // n0x023f c0x0000 (---------------)  + I homedepot
+	0x00299cc9, // n0x0240 c0x0000 (---------------)  + I homegoods
+	0x002a60c5, // n0x0241 c0x0000 (---------------)  + I homes
+	0x002a60c9, // n0x0242 c0x0000 (---------------)  + I homesense
+	0x002a7985, // n0x0243 c0x0000 (---------------)  + I honda
+	0x002a8409, // n0x0244 c0x0000 (---------------)  + I honeywell
+	0x002a91c5, // n0x0245 c0x0000 (---------------)  + I horse
+	0x00297e04, // n0x0246 c0x0000 (---------------)  + I host
+	0x00297e07, // n0x0247 c0x0000 (---------------)  + I hosting
+	0x00234dc3, // n0x0248 c0x0000 (---------------)  + I hot
+	0x002a98c7, // n0x0249 c0x0000 (---------------)  + I hoteles
+	0x002a9fc7, // n0x024a c0x0000 (---------------)  + I hotmail
+	0x002a2105, // n0x024b c0x0000 (---------------)  + I house
+	0x002a1343, // n0x024c c0x0000 (---------------)  + I how
+	0x1b20e4c2, // n0x024d c0x006c (n0x09e3-n0x09e8)  + I hr
+	0x00389404, // n0x024e c0x0000 (---------------)  + I hsbc
+	0x1b62a682, // n0x024f c0x006d (n0x09e8-n0x09f9)  + I ht
+	0x0025d0c3, // n0x0250 c0x0000 (---------------)  + I htc
+	0x1ba195c2, // n0x0251 c0x006e (n0x09f9-n0x0a19)  + I hu
+	0x002f94c6, // n0x0252 c0x0000 (---------------)  + I hughes
+	0x0031fe45, // n0x0253 c0x0000 (---------------)  + I hyatt
+	0x002ac1c7, // n0x0254 c0x0000 (---------------)  + I hyundai
+	0x00321f03, // n0x0255 c0x0000 (---------------)  + I ibm
+	0x00239ac4, // n0x0256 c0x0000 (---------------)  + I icbc
+	0x00206903, // n0x0257 c0x0000 (---------------)  + I ice
+	0x00209d43, // n0x0258 c0x0000 (---------------)  + I icu
+	0x1be0c782, // n0x0259 c0x006f (n0x0a19-n0x0a24)  + I id
+	0x1c600042, // n0x025a c0x0071 (n0x0a25-n0x0a27)  + I ie
+	0x00365804, // n0x025b c0x0000 (---------------)  + I ieee
+	0x002428c3, // n0x025c c0x0000 (---------------)  + I ifm
+	0x00322905, // n0x025d c0x0000 (---------------)  + I iinet
+	0x00322745, // n0x025e c0x0000 (---------------)  + I ikano
+	0x1ca02902, // n0x025f c0x0072 (n0x0a27-n0x0a2f)  + I il
+	0x1d205c42, // n0x0260 c0x0074 (n0x0a30-n0x0a37)  + I im
+	0x00256dc6, // n0x0261 c0x0000 (---------------)  + I imamat
+	0x0025ee44, // n0x0262 c0x0000 (---------------)  + I imdb
+	0x00207084, // n0x0263 c0x0000 (---------------)  + I immo
+	0x0020708a, // n0x0264 c0x0000 (---------------)  + I immobilien
+	0x1da013c2, // n0x0265 c0x0076 (n0x0a39-n0x0a46)  + I in
+	0x0036728a, // n0x0266 c0x0000 (---------------)  + I industries
+	0x003a1088, // n0x0267 c0x0000 (---------------)  + I infiniti
+	0x1dfa1244, // n0x0268 c0x0077 (n0x0a46-n0x0a50)  + I info
+	0x0020e2c3, // n0x0269 c0x0000 (---------------)  + I ing
+	0x0020ecc3, // n0x026a c0x0000 (---------------)  + I ink
+	0x0030ea89, // n0x026b c0x0000 (---------------)  + I institute
+	0x0023e7c9, // n0x026c c0x0000 (---------------)  + I insurance
+	0x00339fc6, // n0x026d c0x0000 (---------------)  + I insure
+	0x1e201603, // n0x026e c0x0078 (n0x0a50-n0x0a51)  + I int
+	0x0024dd45, // n0x026f c0x0000 (---------------)  + I intel
+	0x0031940d, // n0x0270 c0x0000 (---------------)  + I international
+	0x002f8946, // n0x0271 c0x0000 (---------------)  + I intuit
+	0x00203d0b, // n0x0272 c0x0000 (---------------)  + I investments
+	0x1e600ac2, // n0x0273 c0x0079 (n0x0a51-n0x0a57)  + I io
+	0x0026bb88, // n0x0274 c0x0000 (---------------)  + I ipiranga
+	0x1ea00dc2, // n0x0275 c0x007a (n0x0a57-n0x0a5d)  + I iq
+	0x1ee04302, // n0x0276 c0x007b (n0x0a5d-n0x0a66)  + I ir
+	0x002a5605, // n0x0277 c0x0000 (---------------)  + I irish
+	0x1f2006c2, // n0x0278 c0x007c (n0x0a66-n0x0a6e)  + I is
+	0x0025b307, // n0x0279 c0x0000 (---------------)  + I iselect
+	0x0033c007, // n0x027a c0x0000 (---------------)  + I ismaili
+	0x00215003, // n0x027b c0x0000 (---------------)  + I ist
+	0x00215008, // n0x027c c0x0000 (---------------)  + I istanbul
+	0x1f601e42, // n0x027d c0x007d (n0x0a6e-n0x0bdf)  + I it
+	0x002804c4, // n0x027e c0x0000 (---------------)  + I itau
+	0x00360743, // n0x027f c0x0000 (---------------)  + I itv
+	0x00323145, // n0x0280 c0x0000 (---------------)  + I iveco
+	0x0036ab83, // n0x0281 c0x0000 (---------------)  + I iwc
+	0x0031f906, // n0x0282 c0x0000 (---------------)  + I jaguar
+	0x00323d44, // n0x0283 c0x0000 (---------------)  + I java
+	0x00247743, // n0x0284 c0x0000 (---------------)  + I jcb
+	0x0026e183, // n0x0285 c0x0000 (---------------)  + I jcp
+	0x1fa06f02, // n0x0286 c0x007e (n0x0bdf-n0x0be2)  + I je
+	0x003299c4, // n0x0287 c0x0000 (---------------)  + I jeep
+	0x0034ea85, // n0x0288 c0x0000 (---------------)  + I jetzt
+	0x00360f47, // n0x0289 c0x0000 (---------------)  + I jewelry
+	0x00278d43, // n0x028a c0x0000 (---------------)  + I jio
+	0x002ac643, // n0x028b c0x0000 (---------------)  + I jlc
+	0x002ad103, // n0x028c c0x0000 (---------------)  + I jll
+	0x016308c2, // n0x028d c0x0005 (---------------)* o I jm
+	0x002ad1c3, // n0x028e c0x0000 (---------------)  + I jmp
+	0x002ad803, // n0x028f c0x0000 (---------------)  + I jnj
+	0x1fe04042, // n0x0290 c0x007f (n0x0be2-n0x0bea)  + I jo
+	0x002ddc44, // n0x0291 c0x0000 (---------------)  + I jobs
+	0x0027cb06, // n0x0292 c0x0000 (---------------)  + I joburg
+	0x00204043, // n0x0293 c0x0000 (---------------)  + I jot
+	0x002adb83, // n0x0294 c0x0000 (---------------)  + I joy
+	0x202ae3c2, // n0x0295 c0x0080 (n0x0bea-n0x0c59)  + I jp
+	0x002ae3c8, // n0x0296 c0x0000 (---------------)  + I jpmorgan
+	0x002aefc4, // n0x0297 c0x0000 (---------------)  + I jprs
+	0x002d7906, // n0x0298 c0x0000 (---------------)  + I juegos
+	0x002af287, // n0x0299 c0x0000 (---------------)  + I juniper
+	0x00227e46, // n0x029a c0x0000 (---------------)  + I kaufen
+	0x00238144, // n0x029b c0x0000 (---------------)  + I kddi
+	0x2de025c2, // n0x029c c0x00b7 (n0x12ed-n0x12ee)* o I ke
+	0x00234c8b, // n0x029d c0x0000 (---------------)  + I kerryhotels
+	0x002e2c0e, // n0x029e c0x0000 (---------------)  + I kerrylogistics
+	0x00220d0f, // n0x029f c0x0000 (---------------)  + I kerryproperties
+	0x0023f303, // n0x02a0 c0x0000 (---------------)  + I kfh
+	0x2e6b5502, // n0x02a1 c0x00b9 (n0x12ef-n0x12f5)  + I kg
+	0x0161acc2, // n0x02a2 c0x0005 (---------------)* o I kh
+	0x2ea01e02, // n0x02a3 c0x00ba (n0x12f5-n0x12fc)  + I ki
+	0x00226f83, // n0x02a4 c0x0000 (---------------)  + I kia
+	0x002303c3, // n0x02a5 c0x0000 (---------------)  + I kim
+	0x002e7706, // n0x02a6 c0x0000 (---------------)  + I kinder
+	0x0037c506, // n0x02a7 c0x0000 (---------------)  + I kindle
+	0x003703c7, // n0x02a8 c0x0000 (---------------)  + I kitchen
+	0x002eed84, // n0x02a9 c0x0000 (---------------)  + I kiwi
+	0x2ee316c2, // n0x02aa c0x00bb (n0x12fc-n0x130d)  + I km
+	0x2f269c82, // n0x02ab c0x00bc (n0x130d-n0x1311)  + I kn
+	0x0036bd45, // n0x02ac c0x0000 (---------------)  + I koeln
+	0x002aa707, // n0x02ad c0x0000 (---------------)  + I komatsu
+	0x0035cbc6, // n0x02ae c0x0000 (---------------)  + I kosher
+	0x2f60d782, // n0x02af c0x00bd (n0x1311-n0x1317)  + I kp
+	0x0020d784, // n0x02b0 c0x0000 (---------------)  + I kpmg
+	0x0036a3c3, // n0x02b1 c0x0000 (---------------)  + I kpn
+	0x2fa06fc2, // n0x02b2 c0x00be (n0x1317-n0x1335)  + I kr
+	0x0034df03, // n0x02b3 c0x0000 (---------------)  + I krd
+	0x003a2b04, // n0x02b4 c0x0000 (---------------)  + I kred
+	0x002b5449, // n0x02b5 c0x0000 (---------------)  + I kuokgroup
+	0x016bd182, // n0x02b6 c0x0005 (---------------)* o I kw
+	0x2fe36902, // n0x02b7 c0x00bf (n0x1335-n0x133a)  + I ky
+	0x00269c06, // n0x02b8 c0x0000 (---------------)  + I kyknet
+	0x002be0c5, // n0x02b9 c0x0000 (---------------)  + I kyoto
+	0x30392a42, // n0x02ba c0x00c0 (n0x133a-n0x1340)  + I kz
+	0x30600802, // n0x02bb c0x00c1 (n0x1340-n0x1349)  + I la
+	0x0033aa87, // n0x02bc c0x0000 (---------------)  + I lacaixa
+	0x00293449, // n0x02bd c0x0000 (---------------)  + I ladbrokes
+	0x00352d0b, // n0x02be c0x0000 (---------------)  + I lamborghini
+	0x00247245, // n0x02bf c0x0000 (---------------)  + I lamer
+	0x0036c449, // n0x02c0 c0x0000 (---------------)  + I lancaster
+	0x002c0706, // n0x02c1 c0x0000 (---------------)  + I lancia
+	0x00259007, // n0x02c2 c0x0000 (---------------)  + I lancome
+	0x00200804, // n0x02c3 c0x0000 (---------------)  + I land
+	0x0025e089, // n0x02c4 c0x0000 (---------------)  + I landrover
+	0x0035a387, // n0x02c5 c0x0000 (---------------)  + I lanxess
+	0x00279f47, // n0x02c6 c0x0000 (---------------)  + I lasalle
+	0x00223603, // n0x02c7 c0x0000 (---------------)  + I lat
+	0x0025ef86, // n0x02c8 c0x0000 (---------------)  + I latino
+	0x002cca47, // n0x02c9 c0x0000 (---------------)  + I latrobe
+	0x00274483, // n0x02ca c0x0000 (---------------)  + I law
+	0x00274486, // n0x02cb c0x0000 (---------------)  + I lawyer
+	0x30a02942, // n0x02cc c0x00c2 (n0x1349-n0x134e)  + I lb
+	0x30e3aa02, // n0x02cd c0x00c3 (n0x134e-n0x1354)  + I lc
+	0x00226843, // n0x02ce c0x0000 (---------------)  + I lds
+	0x0027a085, // n0x02cf c0x0000 (---------------)  + I lease
+	0x0022c487, // n0x02d0 c0x0000 (---------------)  + I leclerc
+	0x0037c006, // n0x02d1 c0x0000 (---------------)  + I lefrak
+	0x00336305, // n0x02d2 c0x0000 (---------------)  + I legal
+	0x0024db44, // n0x02d3 c0x0000 (---------------)  + I lego
+	0x00241385, // n0x02d4 c0x0000 (---------------)  + I lexus
+	0x002e65c4, // n0x02d5 c0x0000 (---------------)  + I lgbt
+	0x31207202, // n0x02d6 c0x00c4 (n0x1354-n0x1355)  + I li
+	0x00308447, // n0x02d7 c0x0000 (---------------)  + I liaison
+	0x002bb904, // n0x02d8 c0x0000 (---------------)  + I lidl
+	0x0023e6c4, // n0x02d9 c0x0000 (---------------)  + I life
+	0x0023e6cd, // n0x02da c0x0000 (---------------)  + I lifeinsurance
+	0x00253cc9, // n0x02db c0x0000 (---------------)  + I lifestyle
+	0x00312248, // n0x02dc c0x0000 (---------------)  + I lighting
+	0x00258c44, // n0x02dd c0x0000 (---------------)  + I like
+	0x00249785, // n0x02de c0x0000 (---------------)  + I lilly
+	0x0025d747, // n0x02df c0x0000 (---------------)  + I limited
+	0x0025db44, // n0x02e0 c0x0000 (---------------)  + I limo
+	0x0022e787, // n0x02e1 c0x0000 (---------------)  + I lincoln
+	0x00345ac5, // n0x02e2 c0x0000 (---------------)  + I linde
+	0x00398ec4, // n0x02e3 c0x0000 (---------------)  + I link
+	0x002d3a85, // n0x02e4 c0x0000 (---------------)  + I lipsy
+	0x002622c4, // n0x02e5 c0x0000 (---------------)  + I live
+	0x002414c6, // n0x02e6 c0x0000 (---------------)  + I living
+	0x0025da45, // n0x02e7 c0x0000 (---------------)  + I lixil
+	0x3160d742, // n0x02e8 c0x00c5 (n0x1355-n0x1364)  + I lk
+	0x00210b84, // n0x02e9 c0x0000 (---------------)  + I loan
+	0x00210b85, // n0x02ea c0x0000 (---------------)  + I loans
+	0x00376f06, // n0x02eb c0x0000 (---------------)  + I locker
+	0x00336445, // n0x02ec c0x0000 (---------------)  + I locus
+	0x002ccfc4, // n0x02ed c0x0000 (---------------)  + I loft
+	0x002c21c3, // n0x02ee c0x0000 (---------------)  + I lol
+	0x00321906, // n0x02ef c0x0000 (---------------)  + I london
+	0x0021b685, // n0x02f0 c0x0000 (---------------)  + I lotte
+	0x00222845, // n0x02f1 c0x0000 (---------------)  + I lotto
+	0x00230204, // n0x02f2 c0x0000 (---------------)  + I love
+	0x00207443, // n0x02f3 c0x0000 (---------------)  + I lpl
+	0x0020744c, // n0x02f4 c0x0000 (---------------)  + I lplfinancial
+	0x31a88142, // n0x02f5 c0x00c6 (n0x1364-n0x1369)  + I lr
+	0x31e04e42, // n0x02f6 c0x00c7 (n0x1369-n0x136b)  + I ls
+	0x32209e02, // n0x02f7 c0x00c8 (n0x136b-n0x136d)  + I lt
+	0x00322cc3, // n0x02f8 c0x0000 (---------------)  + I ltd
+	0x00322cc4, // n0x02f9 c0x0000 (---------------)  + I ltda
+	0x32602f42, // n0x02fa c0x00c9 (n0x136d-n0x136e)  + I lu
+	0x002fb348, // n0x02fb c0x0000 (---------------)  + I lundbeck
+	0x002dd745, // n0x02fc c0x0000 (---------------)  + I lupin
+	0x0023ca44, // n0x02fd c0x0000 (---------------)  + I luxe
+	0x0023d206, // n0x02fe c0x0000 (---------------)  + I luxury
+	0x32a05d02, // n0x02ff c0x00ca (n0x136e-n0x1377)  + I lv
+	0x32e09082, // n0x0300 c0x00cb (n0x1377-n0x1380)  + I ly
+	0x33200182, // n0x0301 c0x00cc (n0x1380-n0x1386)  + I ma
+	0x00375105, // n0x0302 c0x0000 (---------------)  + I macys
+	0x00317146, // n0x0303 c0x0000 (---------------)  + I madrid
+	0x00271c44, // n0x0304 c0x0000 (---------------)  + I maif
+	0x0022bdc6, // n0x0305 c0x0000 (---------------)  + I maison
+	0x00248d06, // n0x0306 c0x0000 (---------------)  + I makeup
+	0x002018c3, // n0x0307 c0x0000 (---------------)  + I man
+	0x0036f20a, // n0x0308 c0x0000 (---------------)  + I management
+	0x00242c05, // n0x0309 c0x0000 (---------------)  + I mango
+	0x002f1386, // n0x030a c0x0000 (---------------)  + I market
+	0x002f1389, // n0x030b c0x0000 (---------------)  + I marketing
+	0x00331387, // n0x030c c0x0000 (---------------)  + I markets
+	0x00366448, // n0x030d c0x0000 (---------------)  + I marriott
+	0x0020f009, // n0x030e c0x0000 (---------------)  + I marshalls
+	0x002be9c8, // n0x030f c0x0000 (---------------)  + I maserati
+	0x0022f706, // n0x0310 c0x0000 (---------------)  + I mattel
+	0x00209c03, // n0x0311 c0x0000 (---------------)  + I mba
+	0x3362ac02, // n0x0312 c0x00cd (n0x1386-n0x1388)  + I mc
+	0x0037cec3, // n0x0313 c0x0000 (---------------)  + I mcd
+	0x0037cec9, // n0x0314 c0x0000 (---------------)  + I mcdonalds
+	0x00327b88, // n0x0315 c0x0000 (---------------)  + I mckinsey
+	0x33a4da82, // n0x0316 c0x00ce (n0x1388-n0x1389)  + I md
+	0x33e03e82, // n0x0317 c0x00cf (n0x1389-n0x1396)  + I me
+	0x00213ac3, // n0x0318 c0x0000 (---------------)  + I med
+	0x003025c5, // n0x0319 c0x0000 (---------------)  + I media
+	0x0026ad84, // n0x031a c0x0000 (---------------)  + I meet
+	0x002e1809, // n0x031b c0x0000 (---------------)  + I melbourne
+	0x002c4604, // n0x031c c0x0000 (---------------)  + I meme
+	0x0026cf88, // n0x031d c0x0000 (---------------)  + I memorial
+	0x00203e83, // n0x031e c0x0000 (---------------)  + I men
+	0x002ede44, // n0x031f c0x0000 (---------------)  + I menu
+	0x0022adc3, // n0x0320 c0x0000 (---------------)  + I meo
+	0x0023e607, // n0x0321 c0x0000 (---------------)  + I metlife
+	0x3420d802, // n0x0322 c0x00d0 (n0x1396-n0x139f)  + I mg
+	0x0025aa42, // n0x0323 c0x0000 (---------------)  + I mh
+	0x00231f45, // n0x0324 c0x0000 (---------------)  + I miami
+	0x0026b149, // n0x0325 c0x0000 (---------------)  + I microsoft
+	0x00209003, // n0x0326 c0x0000 (---------------)  + I mil
+	0x0027d144, // n0x0327 c0x0000 (---------------)  + I mini
+	0x003193c4, // n0x0328 c0x0000 (---------------)  + I mint
+	0x00229ac3, // n0x0329 c0x0000 (---------------)  + I mit
+	0x0027e0ca, // n0x032a c0x0000 (---------------)  + I mitsubishi
+	0x34767142, // n0x032b c0x00d1 (n0x139f-n0x13a7)  + I mk
+	0x34a10b42, // n0x032c c0x00d2 (n0x13a7-n0x13ae)  + I ml
+	0x002c1243, // n0x032d c0x0000 (---------------)  + I mlb
+	0x00369503, // n0x032e c0x0000 (---------------)  + I mls
+	0x016070c2, // n0x032f c0x0005 (---------------)* o I mm
+	0x00375603, // n0x0330 c0x0000 (---------------)  + I mma
+	0x34e1fdc2, // n0x0331 c0x00d3 (n0x13ae-n0x13b2)  + I mn
+	0x0021fdc4, // n0x0332 c0x0000 (---------------)  + I mnet
+	0x35207102, // n0x0333 c0x00d4 (n0x13b2-n0x13b7)  + I mo
+	0x35607104, // n0x0334 c0x00d5 (n0x13b7-n0x13b8)  + I mobi
+	0x002e2606, // n0x0335 c0x0000 (---------------)  + I mobily
+	0x0026c084, // n0x0336 c0x0000 (---------------)  + I moda
+	0x002d7d03, // n0x0337 c0x0000 (---------------)  + I moe
+	0x00282043, // n0x0338 c0x0000 (---------------)  + I moi
+	0x002e3783, // n0x0339 c0x0000 (---------------)  + I mom
+	0x00244dc6, // n0x033a c0x0000 (---------------)  + I monash
+	0x002c6d85, // n0x033b c0x0000 (---------------)  + I money
+	0x002c1e07, // n0x033c c0x0000 (---------------)  + I monster
+	0x00258ec9, // n0x033d c0x0000 (---------------)  + I montblanc
+	0x002c5285, // n0x033e c0x0000 (---------------)  + I mopar
+	0x002c6cc6, // n0x033f c0x0000 (---------------)  + I mormon
+	0x002c72c8, // n0x0340 c0x0000 (---------------)  + I mortgage
+	0x002c74c6, // n0x0341 c0x0000 (---------------)  + I moscow
+	0x00278644, // n0x0342 c0x0000 (---------------)  + I moto
+	0x0029af0b, // n0x0343 c0x0000 (---------------)  + I motorcycles
+	0x002c9083, // n0x0344 c0x0000 (---------------)  + I mov
+	0x002c9085, // n0x0345 c0x0000 (---------------)  + I movie
+	0x002c91c8, // n0x0346 c0x0000 (---------------)  + I movistar
+	0x0022a482, // n0x0347 c0x0000 (---------------)  + I mp
+	0x0033ad82, // n0x0348 c0x0000 (---------------)  + I mq
+	0x35a4aa02, // n0x0349 c0x00d6 (n0x13b8-n0x13ba)  + I mr
+	0x35e0f702, // n0x034a c0x00d7 (n0x13ba-n0x13bf)  + I ms
+	0x0025d643, // n0x034b c0x0000 (---------------)  + I msd
+	0x36204c02, // n0x034c c0x00d8 (n0x13bf-n0x13c3)  + I mt
+	0x0026c8c3, // n0x034d c0x0000 (---------------)  + I mtn
+	0x002c94c4, // n0x034e c0x0000 (---------------)  + I mtpc
+	0x002c9d03, // n0x034f c0x0000 (---------------)  + I mtr
+	0x36a03ac2, // n0x0350 c0x00da (n0x13c4-n0x13cb)  + I mu
+	0x002cbb0b, // n0x0351 c0x0000 (---------------)  + I multichoice
+	0x36ed0106, // n0x0352 c0x00db (n0x13cb-n0x15ef)  + I museum
+	0x0023db46, // n0x0353 c0x0000 (---------------)  + I mutual
+	0x002d0748, // n0x0354 c0x0000 (---------------)  + I mutuelle
+	0x372b7382, // n0x0355 c0x00dc (n0x15ef-n0x15fd)  + I mv
+	0x3760fc82, // n0x0356 c0x00dd (n0x15fd-n0x1608)  + I mw
+	0x37a1bb02, // n0x0357 c0x00de (n0x1608-n0x160e)  + I mx
+	0x37e26f02, // n0x0358 c0x00df (n0x160e-n0x1616)  + I my
+	0x38214382, // n0x0359 c0x00e0 (n0x1616-n0x1617)* o I mz
+	0x0021438b, // n0x035a c0x0000 (---------------)  + I mzansimagic
+	0x38601402, // n0x035b c0x00e1 (n0x1617-n0x1628)  + I na
+	0x00223703, // n0x035c c0x0000 (---------------)  + I nab
+	0x002393c5, // n0x035d c0x0000 (---------------)  + I nadex
+	0x0030f646, // n0x035e c0x0000 (---------------)  + I nagoya
+	0x38a05284, // n0x035f c0x00e2 (n0x1628-n0x162a)  + I name
+	0x0028cec7, // n0x0360 c0x0000 (---------------)  + I naspers
+	0x00238e4a, // n0x0361 c0x0000 (---------------)  + I nationwide
+	0x002ea486, // n0x0362 c0x0000 (---------------)  + I natura
+	0x0039fb84, // n0x0363 c0x0000 (---------------)  + I navy
+	0x0025d243, // n0x0364 c0x0000 (---------------)  + I nba
+	0x39600642, // n0x0365 c0x00e5 (n0x162c-n0x162d)  + I nc
+	0x00202c02, // n0x0366 c0x0000 (---------------)  + I ne
+	0x00249b43, // n0x0367 c0x0000 (---------------)  + I nec
+	0x39a1fe03, // n0x0368 c0x00e6 (n0x162d-n0x1663)  + I net
+	0x003928c7, // n0x0369 c0x0000 (---------------)  + I netbank
+	0x0025d947, // n0x036a c0x0000 (---------------)  + I netflix
+	0x00255b87, // n0x036b c0x0000 (---------------)  + I network
+	0x00228847, // n0x036c c0x0000 (---------------)  + I neustar
+	0x00221dc3, // n0x036d c0x0000 (---------------)  + I new
+	0x002f0d8a, // n0x036e c0x0000 (---------------)  + I newholland
+	0x00221dc4, // n0x036f c0x0000 (---------------)  + I news
+	0x0024d684, // n0x0370 c0x0000 (---------------)  + I next
+	0x0024d68a, // n0x0371 c0x0000 (---------------)  + I nextdirect
+	0x0026d605, // n0x0372 c0x0000 (---------------)  + I nexus
+	0x3ae00542, // n0x0373 c0x00eb (n0x166b-n0x1675)  + I nf
+	0x00251bc3, // n0x0374 c0x0000 (---------------)  + I nfl
+	0x3b202802, // n0x0375 c0x00ec (n0x1675-n0x167f)  + I ng
+	0x00202d03, // n0x0376 c0x0000 (---------------)  + I ngo
+	0x0026da03, // n0x0377 c0x0000 (---------------)  + I nhk
+	0x3ba03182, // n0x0378 c0x00ee (n0x1680-n0x168e)  o I ni
+	0x002a6b04, // n0x0379 c0x0000 (---------------)  + I nico
+	0x0021da84, // n0x037a c0x0000 (---------------)  + I nike
+	0x00206b05, // n0x037b c0x0000 (---------------)  + I nikon
+	0x002c8e05, // n0x037c c0x0000 (---------------)  + I ninja
+	0x0022e906, // n0x037d c0x0000 (---------------)  + I nissan
+	0x0022ec86, // n0x037e c0x0000 (---------------)  + I nissay
+	0x3be47802, // n0x037f c0x00ef (n0x168e-n0x1691)  + I nl
+	0x3c200c02, // n0x0380 c0x00f0 (n0x1691-n0x1967)  + I no
+	0x00318785, // n0x0381 c0x0000 (---------------)  + I nokia
+	0x0023d852, // n0x0382 c0x0000 (---------------)  + I northwesternmutual
+	0x00366106, // n0x0383 c0x0000 (---------------)  + I norton
+	0x00224d83, // n0x0384 c0x0000 (---------------)  + I now
+	0x0029cec6, // n0x0385 c0x0000 (---------------)  + I nowruz
+	0x00224d85, // n0x0386 c0x0000 (---------------)  + I nowtv
+	0x01610502, // n0x0387 c0x0005 (---------------)* o I np
+	0x4460d382, // n0x0388 c0x0111 (n0x198f-n0x1996)  + I nr
+	0x002e23c3, // n0x0389 c0x0000 (---------------)  + I nra
+	0x002b5e83, // n0x038a c0x0000 (---------------)  + I nrw
+	0x00373b03, // n0x038b c0x0000 (---------------)  + I ntt
+	0x44a017c2, // n0x038c c0x0112 (n0x1996-n0x1999)  + I nu
+	0x0036ef83, // n0x038d c0x0000 (---------------)  + I nyc
+	0x44e094c2, // n0x038e c0x0113 (n0x1999-n0x19a9)  + I nz
+	0x00207143, // n0x038f c0x0000 (---------------)  + I obi
+	0x002ddc88, // n0x0390 c0x0000 (---------------)  + I observer
+	0x0020b283, // n0x0391 c0x0000 (---------------)  + I off
+	0x00221686, // n0x0392 c0x0000 (---------------)  + I office
+	0x00395b47, // n0x0393 c0x0000 (---------------)  + I okinawa
+	0x0020a9c6, // n0x0394 c0x0000 (---------------)  + I olayan
+	0x0020a9cb, // n0x0395 c0x0000 (---------------)  + I olayangroup
+	0x0039fac7, // n0x0396 c0x0000 (---------------)  + I oldnavy
+	0x00389204, // n0x0397 c0x0000 (---------------)  + I ollo
+	0x456014c2, // n0x0398 c0x0115 (n0x19aa-n0x19b3)  + I om
+	0x002dd5c5, // n0x0399 c0x0000 (---------------)  + I omega
+	0x00214843, // n0x039a c0x0000 (---------------)  + I one
+	0x002082c3, // n0x039b c0x0000 (---------------)  + I ong
+	0x003175c3, // n0x039c c0x0000 (---------------)  + I onl
+	0x003175c6, // n0x039d c0x0000 (---------------)  + I online
+	0x003a008a, // n0x039e c0x0000 (---------------)  + I onyourside
+	0x0028d703, // n0x039f c0x0000 (---------------)  + I ooo
+	0x0023de44, // n0x03a0 c0x0000 (---------------)  + I open
+	0x00224206, // n0x03a1 c0x0000 (---------------)  + I oracle
+	0x00396286, // n0x03a2 c0x0000 (---------------)  + I orange
+	0x45a2d1c3, // n0x03a3 c0x0116 (n0x19b3-n0x19f0)  + I org
+	0x002ae487, // n0x03a4 c0x0000 (---------------)  + I organic
+	0x002db3cd, // n0x03a5 c0x0000 (---------------)  + I orientexpress
+	0x00383487, // n0x03a6 c0x0000 (---------------)  + I origins
+	0x0029ac45, // n0x03a7 c0x0000 (---------------)  + I osaka
+	0x00269e06, // n0x03a8 c0x0000 (---------------)  + I otsuka
+	0x0021b6c3, // n0x03a9 c0x0000 (---------------)  + I ott
+	0x0020da83, // n0x03aa c0x0000 (---------------)  + I ovh
+	0x4720ac42, // n0x03ab c0x011c (n0x1a2d-n0x1a38)  + I pa
+	0x002eaf04, // n0x03ac c0x0000 (---------------)  + I page
+	0x0024c94c, // n0x03ad c0x0000 (---------------)  + I pamperedchef
+	0x002646c9, // n0x03ae c0x0000 (---------------)  + I panasonic
+	0x00338507, // n0x03af c0x0000 (---------------)  + I panerai
+	0x00277905, // n0x03b0 c0x0000 (---------------)  + I paris
+	0x002994c4, // n0x03b1 c0x0000 (---------------)  + I pars
+	0x002a5308, // n0x03b2 c0x0000 (---------------)  + I partners
+	0x002ad245, // n0x03b3 c0x0000 (---------------)  + I parts
+	0x002b4c45, // n0x03b4 c0x0000 (---------------)  + I party
+	0x002cc549, // n0x03b5 c0x0000 (---------------)  + I passagens
+	0x002bc0c3, // n0x03b6 c0x0000 (---------------)  + I pay
+	0x002bc0c4, // n0x03b7 c0x0000 (---------------)  + I payu
+	0x002c9544, // n0x03b8 c0x0000 (---------------)  + I pccw
+	0x47607782, // n0x03b9 c0x011d (n0x1a38-n0x1a40)  + I pe
+	0x00207783, // n0x03ba c0x0000 (---------------)  + I pet
+	0x47af7d02, // n0x03bb c0x011e (n0x1a40-n0x1a43)  + I pf
+	0x002f7d06, // n0x03bc c0x0000 (---------------)  + I pfizer
+	0x016495c2, // n0x03bd c0x0005 (---------------)* o I pg
+	0x47e00d42, // n0x03be c0x011f (n0x1a43-n0x1a4b)  + I ph
+	0x00375008, // n0x03bf c0x0000 (---------------)  + I pharmacy
+	0x002d39c7, // n0x03c0 c0x0000 (---------------)  + I philips
+	0x00299085, // n0x03c1 c0x0000 (---------------)  + I photo
+	0x002d404b, // n0x03c2 c0x0000 (---------------)  + I photography
+	0x002d11c6, // n0x03c3 c0x0000 (---------------)  + I photos
+	0x002d4246, // n0x03c4 c0x0000 (---------------)  + I physio
+	0x002d43c6, // n0x03c5 c0x0000 (---------------)  + I piaget
+	0x00225704, // n0x03c6 c0x0000 (---------------)  + I pics
+	0x002d4b46, // n0x03c7 c0x0000 (---------------)  + I pictet
+	0x002d5008, // n0x03c8 c0x0000 (---------------)  + I pictures
+	0x00241b83, // n0x03c9 c0x0000 (---------------)  + I pid
+	0x002699c3, // n0x03ca c0x0000 (---------------)  + I pin
+	0x002699c4, // n0x03cb c0x0000 (---------------)  + I ping
+	0x002d6d84, // n0x03cc c0x0000 (---------------)  + I pink
+	0x002d7107, // n0x03cd c0x0000 (---------------)  + I pioneer
+	0x002d85c5, // n0x03ce c0x0000 (---------------)  + I pizza
+	0x482d8702, // n0x03cf c0x0120 (n0x1a4b-n0x1a59)  + I pk
+	0x486063c2, // n0x03d0 c0x0121 (n0x1a59-n0x1afe)  + I pl
+	0x002063c5, // n0x03d1 c0x0000 (---------------)  + I place
+	0x0029e944, // n0x03d2 c0x0000 (---------------)  + I play
+	0x002dad4b, // n0x03d3 c0x0000 (---------------)  + I playstation
+	0x002dc348, // n0x03d4 c0x0000 (---------------)  + I plumbing
+	0x002dcac4, // n0x03d5 c0x0000 (---------------)  + I plus
+	0x0020d7c2, // n0x03d6 c0x0000 (---------------)  + I pm
+	0x48e493c2, // n0x03d7 c0x0123 (n0x1b2d-n0x1b32)  + I pn
+	0x002aee03, // n0x03d8 c0x0000 (---------------)  + I pnc
+	0x002dcf04, // n0x03d9 c0x0000 (---------------)  + I pohl
+	0x002dd005, // n0x03da c0x0000 (---------------)  + I poker
+	0x002de547, // n0x03db c0x0000 (---------------)  + I politie
+	0x002e0104, // n0x03dc c0x0000 (---------------)  + I porn
+	0x0035fe04, // n0x03dd c0x0000 (---------------)  + I post
+	0x49204602, // n0x03de c0x0124 (n0x1b32-n0x1b3f)  + I pr
+	0x003598c9, // n0x03df c0x0000 (---------------)  + I pramerica
+	0x002e0b05, // n0x03e0 c0x0000 (---------------)  + I praxi
+	0x00247505, // n0x03e1 c0x0000 (---------------)  + I press
+	0x002e1745, // n0x03e2 c0x0000 (---------------)  + I prime
+	0x49620e43, // n0x03e3 c0x0125 (n0x1b3f-n0x1b4a)  + I pro
+	0x002e2044, // n0x03e4 c0x0000 (---------------)  + I prod
+	0x002e204b, // n0x03e5 c0x0000 (---------------)  + I productions
+	0x002e2484, // n0x03e6 c0x0000 (---------------)  + I prof
+	0x002e278b, // n0x03e7 c0x0000 (---------------)  + I progressive
+	0x002e36c5, // n0x03e8 c0x0000 (---------------)  + I promo
+	0x00220e4a, // n0x03e9 c0x0000 (---------------)  + I properties
+	0x002e3e48, // n0x03ea c0x0000 (---------------)  + I property
+	0x002e404a, // n0x03eb c0x0000 (---------------)  + I protection
+	0x002e42c3, // n0x03ec c0x0000 (---------------)  + I pru
+	0x002e42ca, // n0x03ed c0x0000 (---------------)  + I prudential
+	0x49a09342, // n0x03ee c0x0126 (n0x1b4a-n0x1b51)  + I ps
+	0x49e8c9c2, // n0x03ef c0x0127 (n0x1b51-n0x1b5a)  + I pt
+	0x00297403, // n0x03f0 c0x0000 (---------------)  + I pub
+	0x4a2e5942, // n0x03f1 c0x0128 (n0x1b5a-n0x1b60)  + I pw
+	0x002e5943, // n0x03f2 c0x0000 (---------------)  + I pwc
+	0x4a734802, // n0x03f3 c0x0129 (n0x1b60-n0x1b67)  + I py
+	0x4ab14682, // n0x03f4 c0x012a (n0x1b67-n0x1b70)  + I qa
+	0x002e6444, // n0x03f5 c0x0000 (---------------)  + I qpon
+	0x0021b906, // n0x03f6 c0x0000 (---------------)  + I quebec
+	0x0022bb05, // n0x03f7 c0x0000 (---------------)  + I quest
+	0x002e6ac3, // n0x03f8 c0x0000 (---------------)  + I qvc
+	0x00355bc6, // n0x03f9 c0x0000 (---------------)  + I racing
+	0x00351c84, // n0x03fa c0x0000 (---------------)  + I raid
+	0x4ae07002, // n0x03fb c0x012b (n0x1b70-n0x1b74)  + I re
+	0x002d3404, // n0x03fc c0x0000 (---------------)  + I read
+	0x002c238a, // n0x03fd c0x0000 (---------------)  + I realestate
+	0x00338907, // n0x03fe c0x0000 (---------------)  + I realtor
+	0x0031fc86, // n0x03ff c0x0000 (---------------)  + I realty
+	0x0031c747, // n0x0400 c0x0000 (---------------)  + I recipes
+	0x00244803, // n0x0401 c0x0000 (---------------)  + I red
+	0x003a2b48, // n0x0402 c0x0000 (---------------)  + I redstone
+	0x00337f4b, // n0x0403 c0x0000 (---------------)  + I redumbrella
+	0x002c9b05, // n0x0404 c0x0000 (---------------)  + I rehab
+	0x0033a0c5, // n0x0405 c0x0000 (---------------)  + I reise
+	0x0033a0c6, // n0x0406 c0x0000 (---------------)  + I reisen
+	0x002b75c4, // n0x0407 c0x0000 (---------------)  + I reit
+	0x00327f48, // n0x0408 c0x0000 (---------------)  + I reliance
+	0x00209ec3, // n0x0409 c0x0000 (---------------)  + I ren
+	0x0020bd84, // n0x040a c0x0000 (---------------)  + I rent
+	0x0020bd87, // n0x040b c0x0000 (---------------)  + I rentals
+	0x0022b7c6, // n0x040c c0x0000 (---------------)  + I repair
+	0x00309586, // n0x040d c0x0000 (---------------)  + I report
+	0x0029f6ca, // n0x040e c0x0000 (---------------)  + I republican
+	0x0024d544, // n0x040f c0x0000 (---------------)  + I rest
+	0x0037adca, // n0x0410 c0x0000 (---------------)  + I restaurant
+	0x002eaac6, // n0x0411 c0x0000 (---------------)  + I review
+	0x002eaac7, // n0x0412 c0x0000 (---------------)  + I reviews
+	0x00257607, // n0x0413 c0x0000 (---------------)  + I rexroth
+	0x00273a04, // n0x0414 c0x0000 (---------------)  + I rich
+	0x00273a09, // n0x0415 c0x0000 (---------------)  + I richardli
+	0x002b6f85, // n0x0416 c0x0000 (---------------)  + I ricoh
+	0x0034618b, // n0x0417 c0x0000 (---------------)  + I rightathome
+	0x00257f83, // n0x0418 c0x0000 (---------------)  + I ril
+	0x00200a83, // n0x0419 c0x0000 (---------------)  + I rio
+	0x0022fd43, // n0x041a c0x0000 (---------------)  + I rip
+	0x002684c4, // n0x041b c0x0000 (---------------)  + I rmit
+	0x4b202202, // n0x041c c0x012c (n0x1b74-n0x1b80)  + I ro
+	0x00289806, // n0x041d c0x0000 (---------------)  + I rocher
+	0x002a10c5, // n0x041e c0x0000 (---------------)  + I rocks
+	0x002d2f85, // n0x041f c0x0000 (---------------)  + I rodeo
+	0x0039c1c6, // n0x0420 c0x0000 (---------------)  + I rogers
+	0x0037ed04, // n0x0421 c0x0000 (---------------)  + I room
+	0x4b609702, // n0x0422 c0x012d (n0x1b80-n0x1b87)  + I rs
+	0x0039c2c4, // n0x0423 c0x0000 (---------------)  + I rsvp
+	0x4ba11302, // n0x0424 c0x012e (n0x1b87-n0x1c0a)  + I ru
+	0x00236144, // n0x0425 c0x0000 (---------------)  + I ruhr
+	0x00222b43, // n0x0426 c0x0000 (---------------)  + I run
+	0x4beb5ec2, // n0x0427 c0x012f (n0x1c0a-n0x1c13)  + I rw
+	0x003274c3, // n0x0428 c0x0000 (---------------)  + I rwe
+	0x0036acc6, // n0x0429 c0x0000 (---------------)  + I ryukyu
+	0x4c2004c2, // n0x042a c0x0130 (n0x1c13-n0x1c1b)  + I sa
+	0x0030c348, // n0x042b c0x0000 (---------------)  + I saarland
+	0x00215944, // n0x042c c0x0000 (---------------)  + I safe
+	0x00215946, // n0x042d c0x0000 (---------------)  + I safety
+	0x00307fc6, // n0x042e c0x0000 (---------------)  + I sakura
+	0x00259844, // n0x042f c0x0000 (---------------)  + I sale
+	0x00321885, // n0x0430 c0x0000 (---------------)  + I salon
+	0x00398bc8, // n0x0431 c0x0000 (---------------)  + I samsclub
+	0x0039edc7, // n0x0432 c0x0000 (---------------)  + I samsung
+	0x003a0747, // n0x0433 c0x0000 (---------------)  + I sandvik
+	0x003a074f, // n0x0434 c0x0000 (---------------)  + I sandvikcoromant
+	0x00294646, // n0x0435 c0x0000 (---------------)  + I sanofi
+	0x00219dc3, // n0x0436 c0x0000 (---------------)  + I sap
+	0x00219dc4, // n0x0437 c0x0000 (---------------)  + I sapo
+	0x0022b604, // n0x0438 c0x0000 (---------------)  + I sarl
+	0x00228143, // n0x0439 c0x0000 (---------------)  + I sas
+	0x00222244, // n0x043a c0x0000 (---------------)  + I save
+	0x00235144, // n0x043b c0x0000 (---------------)  + I saxo
+	0x4c62d142, // n0x043c c0x0131 (n0x1c1b-n0x1c20)  + I sb
+	0x00288e03, // n0x043d c0x0000 (---------------)  + I sbi
+	0x00237503, // n0x043e c0x0000 (---------------)  + I sbs
+	0x4ca00702, // n0x043f c0x0132 (n0x1c20-n0x1c25)  + I sc
+	0x00236a03, // n0x0440 c0x0000 (---------------)  + I sca
+	0x002ee403, // n0x0441 c0x0000 (---------------)  + I scb
+	0x0021744a, // n0x0442 c0x0000 (---------------)  + I schaeffler
+	0x002e5d47, // n0x0443 c0x0000 (---------------)  + I schmidt
+	0x0023ce0c, // n0x0444 c0x0000 (---------------)  + I scholarships
+	0x0023d0c6, // n0x0445 c0x0000 (---------------)  + I school
+	0x00241286, // n0x0446 c0x0000 (---------------)  + I schule
+	0x00242547, // n0x0447 c0x0000 (---------------)  + I schwarz
+	0x002358c7, // n0x0448 c0x0000 (---------------)  + I science
+	0x00246cc9, // n0x0449 c0x0000 (---------------)  + I scjohnson
+	0x0021c544, // n0x044a c0x0000 (---------------)  + I scor
+	0x00200704, // n0x044b c0x0000 (---------------)  + I scot
+	0x4ce496c2, // n0x044c c0x0133 (n0x1c25-n0x1c2d)  + I sd
+	0x4d2046c2, // n0x044d c0x0134 (n0x1c2d-n0x1c56)  + I se
+	0x00316b84, // n0x044e c0x0000 (---------------)  + I seat
+	0x0031c646, // n0x044f c0x0000 (---------------)  + I secure
+	0x00235d48, // n0x0450 c0x0000 (---------------)  + I security
+	0x0027a144, // n0x0451 c0x0000 (---------------)  + I seek
+	0x0025b346, // n0x0452 c0x0000 (---------------)  + I select
+	0x002cb485, // n0x0453 c0x0000 (---------------)  + I sener
+	0x00206808, // n0x0454 c0x0000 (---------------)  + I services
+	0x002046c3, // n0x0455 c0x0000 (---------------)  + I ses
+	0x00251f05, // n0x0456 c0x0000 (---------------)  + I seven
+	0x00253b43, // n0x0457 c0x0000 (---------------)  + I sew
+	0x00247603, // n0x0458 c0x0000 (---------------)  + I sex
+	0x00247604, // n0x0459 c0x0000 (---------------)  + I sexy
+	0x00256a83, // n0x045a c0x0000 (---------------)  + I sfr
+	0x4d66d702, // n0x045b c0x0135 (n0x1c56-n0x1c5d)  + I sg
+	0x4da01342, // n0x045c c0x0136 (n0x1c5d-n0x1c64)  + I sh
+	0x00257e49, // n0x045d c0x0000 (---------------)  + I shangrila
+	0x0025b885, // n0x045e c0x0000 (---------------)  + I sharp
+	0x0025cb44, // n0x045f c0x0000 (---------------)  + I shaw
+	0x0025fd45, // n0x0460 c0x0000 (---------------)  + I shell
+	0x00211884, // n0x0461 c0x0000 (---------------)  + I shia
+	0x002fea47, // n0x0462 c0x0000 (---------------)  + I shiksha
+	0x003896c5, // n0x0463 c0x0000 (---------------)  + I shoes
+	0x002be486, // n0x0464 c0x0000 (---------------)  + I shouji
+	0x002c4484, // n0x0465 c0x0000 (---------------)  + I show
+	0x002c4488, // n0x0466 c0x0000 (---------------)  + I showtime
+	0x002c8307, // n0x0467 c0x0000 (---------------)  + I shriram
+	0x4de0a402, // n0x0468 c0x0137 (n0x1c64-n0x1c65)  + I si
+	0x00341f84, // n0x0469 c0x0000 (---------------)  + I silk
+	0x002f7b84, // n0x046a c0x0000 (---------------)  + I sina
+	0x00285cc7, // n0x046b c0x0000 (---------------)  + I singles
+	0x002810c4, // n0x046c c0x0000 (---------------)  + I site
+	0x0022eb82, // n0x046d c0x0000 (---------------)  + I sj
+	0x4e207842, // n0x046e c0x0138 (n0x1c65-n0x1c66)  + I sk
+	0x00209743, // n0x046f c0x0000 (---------------)  + I ski
+	0x002e76c4, // n0x0470 c0x0000 (---------------)  + I skin
+	0x002368c3, // n0x0471 c0x0000 (---------------)  + I sky
+	0x002368c5, // n0x0472 c0x0000 (---------------)  + I skype
+	0x4e624b82, // n0x0473 c0x0139 (n0x1c66-n0x1c6b)  + I sl
+	0x00375205, // n0x0474 c0x0000 (---------------)  + I sling
+	0x0024cdc2, // n0x0475 c0x0000 (---------------)  + I sm
+	0x00368185, // n0x0476 c0x0000 (---------------)  + I smart
+	0x0035e3c5, // n0x0477 c0x0000 (---------------)  + I smile
+	0x4ea14182, // n0x0478 c0x013a (n0x1c6b-n0x1c73)  + I sn
+	0x00214184, // n0x0479 c0x0000 (---------------)  + I sncf
+	0x4ee05682, // n0x047a c0x013b (n0x1c73-n0x1c76)  + I so
+	0x00325706, // n0x047b c0x0000 (---------------)  + I soccer
+	0x002a3986, // n0x047c c0x0000 (---------------)  + I social
+	0x0026b288, // n0x047d c0x0000 (---------------)  + I softbank
+	0x002b8688, // n0x047e c0x0000 (---------------)  + I software
+	0x002f9444, // n0x047f c0x0000 (---------------)  + I sohu
+	0x00359f05, // n0x0480 c0x0000 (---------------)  + I solar
+	0x00359d09, // n0x0481 c0x0000 (---------------)  + I solutions
+	0x00356144, // n0x0482 c0x0000 (---------------)  + I song
+	0x003a0044, // n0x0483 c0x0000 (---------------)  + I sony
+	0x002bd0c3, // n0x0484 c0x0000 (---------------)  + I soy
+	0x0020bb45, // n0x0485 c0x0000 (---------------)  + I space
+	0x00371ac7, // n0x0486 c0x0000 (---------------)  + I spiegel
+	0x00209384, // n0x0487 c0x0000 (---------------)  + I spot
+	0x00332e4d, // n0x0488 c0x0000 (---------------)  + I spreadbetting
+	0x0033b802, // n0x0489 c0x0000 (---------------)  + I sr
+	0x0033b803, // n0x048a c0x0000 (---------------)  + I srl
+	0x0035a503, // n0x048b c0x0000 (---------------)  + I srt
+	0x4f202742, // n0x048c c0x013c (n0x1c76-n0x1c82)  + I st
+	0x00380745, // n0x048d c0x0000 (---------------)  + I stada
+	0x002320c7, // n0x048e c0x0000 (---------------)  + I staples
+	0x00228904, // n0x048f c0x0000 (---------------)  + I star
+	0x00228907, // n0x0490 c0x0000 (---------------)  + I starhub
+	0x0020f209, // n0x0491 c0x0000 (---------------)  + I statebank
+	0x002c24c9, // n0x0492 c0x0000 (---------------)  + I statefarm
+	0x003a0dc7, // n0x0493 c0x0000 (---------------)  + I statoil
+	0x00277743, // n0x0494 c0x0000 (---------------)  + I stc
+	0x00277748, // n0x0495 c0x0000 (---------------)  + I stcgroup
+	0x002a8009, // n0x0496 c0x0000 (---------------)  + I stockholm
+	0x00364547, // n0x0497 c0x0000 (---------------)  + I storage
+	0x00391185, // n0x0498 c0x0000 (---------------)  + I store
+	0x002e74c6, // n0x0499 c0x0000 (---------------)  + I stream
+	0x002e7906, // n0x049a c0x0000 (---------------)  + I studio
+	0x002e7a85, // n0x049b c0x0000 (---------------)  + I study
+	0x00253dc5, // n0x049c c0x0000 (---------------)  + I style
+	0x4f6023c2, // n0x049d c0x013d (n0x1c82-n0x1ca2)  + I su
+	0x00332385, // n0x049e c0x0000 (---------------)  + I sucks
+	0x002ba24a, // n0x049f c0x0000 (---------------)  + I supersport
+	0x002be2c8, // n0x04a0 c0x0000 (---------------)  + I supplies
+	0x002a7806, // n0x04a1 c0x0000 (---------------)  + I supply
+	0x002e3907, // n0x04a2 c0x0000 (---------------)  + I support
+	0x0024c144, // n0x04a3 c0x0000 (---------------)  + I surf
+	0x002a9e07, // n0x04a4 c0x0000 (---------------)  + I surgery
+	0x002eef06, // n0x04a5 c0x0000 (---------------)  + I suzuki
+	0x4fa35f42, // n0x04a6 c0x013e (n0x1ca2-n0x1ca7)  + I sv
+	0x00376c06, // n0x04a7 c0x0000 (---------------)  + I swatch
+	0x002f15ca, // n0x04a8 c0x0000 (---------------)  + I swiftcover
+	0x002f1f85, // n0x04a9 c0x0000 (---------------)  + I swiss
+	0x4fef2802, // n0x04aa c0x013f (n0x1ca7-n0x1ca8)  + I sx
+	0x50289a02, // n0x04ab c0x0140 (n0x1ca8-n0x1cae)  + I sy
+	0x00329bc6, // n0x04ac c0x0000 (---------------)  + I sydney
+	0x002d5f48, // n0x04ad c0x0000 (---------------)  + I symantec
+	0x00394e07, // n0x04ae c0x0000 (---------------)  + I systems
+	0x5060b982, // n0x04af c0x0141 (n0x1cae-n0x1cb1)  + I sz
+	0x00210d43, // n0x04b0 c0x0000 (---------------)  + I tab
+	0x003a6506, // n0x04b1 c0x0000 (---------------)  + I taipei
+	0x0021eb04, // n0x04b2 c0x0000 (---------------)  + I talk
+	0x00395a06, // n0x04b3 c0x0000 (---------------)  + I taobao
+	0x00357846, // n0x04b4 c0x0000 (---------------)  + I target
+	0x00322a0a, // n0x04b5 c0x0000 (---------------)  + I tatamotors
+	0x0036cc45, // n0x04b6 c0x0000 (---------------)  + I tatar
+	0x00219906, // n0x04b7 c0x0000 (---------------)  + I tattoo
+	0x002203c3, // n0x04b8 c0x0000 (---------------)  + I tax
+	0x002203c4, // n0x04b9 c0x0000 (---------------)  + I taxi
+	0x00204442, // n0x04ba c0x0000 (---------------)  + I tc
+	0x0025edc3, // n0x04bb c0x0000 (---------------)  + I tci
+	0x50a0b182, // n0x04bc c0x0142 (n0x1cb1-n0x1cb2)  + I td
+	0x002c9683, // n0x04bd c0x0000 (---------------)  + I tdk
+	0x00367504, // n0x04be c0x0000 (---------------)  + I team
+	0x002d59c4, // n0x04bf c0x0000 (---------------)  + I tech
+	0x002d608a, // n0x04c0 c0x0000 (---------------)  + I technology
+	0x0022f7c3, // n0x04c1 c0x0000 (---------------)  + I tel
+	0x00286648, // n0x04c2 c0x0000 (---------------)  + I telecity
+	0x0030ec4a, // n0x04c3 c0x0000 (---------------)  + I telefonica
+	0x0023fa07, // n0x04c4 c0x0000 (---------------)  + I temasek
+	0x002f4806, // n0x04c5 c0x0000 (---------------)  + I tennis
+	0x0032ce44, // n0x04c6 c0x0000 (---------------)  + I teva
+	0x0025d9c2, // n0x04c7 c0x0000 (---------------)  + I tf
+	0x00204c42, // n0x04c8 c0x0000 (---------------)  + I tg
+	0x50e06342, // n0x04c9 c0x0143 (n0x1cb2-n0x1cb9)  + I th
+	0x0024b183, // n0x04ca c0x0000 (---------------)  + I thd
+	0x002573c7, // n0x04cb c0x0000 (---------------)  + I theater
+	0x00355e87, // n0x04cc c0x0000 (---------------)  + I theatre
+	0x003504cb, // n0x04cd c0x0000 (---------------)  + I theguardian
+	0x0034d4c4, // n0x04ce c0x0000 (---------------)  + I tiaa
+	0x002f6847, // n0x04cf c0x0000 (---------------)  + I tickets
+	0x002de646, // n0x04d0 c0x0000 (---------------)  + I tienda
+	0x00215707, // n0x04d1 c0x0000 (---------------)  + I tiffany
+	0x002e5c84, // n0x04d2 c0x0000 (---------------)  + I tips
+	0x0033d385, // n0x04d3 c0x0000 (---------------)  + I tires
+	0x002b7905, // n0x04d4 c0x0000 (---------------)  + I tirol
+	0x51226782, // n0x04d5 c0x0144 (n0x1cb9-n0x1cc8)  + I tj
+	0x00230886, // n0x04d6 c0x0000 (---------------)  + I tjmaxx
+	0x0036f443, // n0x04d7 c0x0000 (---------------)  + I tjx
+	0x0022ad02, // n0x04d8 c0x0000 (---------------)  + I tk
+	0x00231686, // n0x04d9 c0x0000 (---------------)  + I tkmaxx
+	0x516007c2, // n0x04da c0x0145 (n0x1cc8-n0x1cc9)  + I tl
+	0x51a00142, // n0x04db c0x0146 (n0x1cc9-n0x1cd1)  + I tm
+	0x00200145, // n0x04dc c0x0000 (---------------)  + I tmall
+	0x51e4f882, // n0x04dd c0x0147 (n0x1cd1-n0x1ce5)  + I tn
+	0x52208082, // n0x04de c0x0148 (n0x1ce5-n0x1ceb)  + I to
+	0x00265905, // n0x04df c0x0000 (---------------)  + I today
+	0x00341c05, // n0x04e0 c0x0000 (---------------)  + I tokyo
+	0x002199c5, // n0x04e1 c0x0000 (---------------)  + I tools
+	0x00208083, // n0x04e2 c0x0000 (---------------)  + I top
+	0x00376345, // n0x04e3 c0x0000 (---------------)  + I toray
+	0x002d1287, // n0x04e4 c0x0000 (---------------)  + I toshiba
+	0x0025b605, // n0x04e5 c0x0000 (---------------)  + I total
+	0x002fd7c5, // n0x04e6 c0x0000 (---------------)  + I tours
+	0x002dc244, // n0x04e7 c0x0000 (---------------)  + I town
+	0x0025bb86, // n0x04e8 c0x0000 (---------------)  + I toyota
+	0x0026dac4, // n0x04e9 c0x0000 (---------------)  + I toys
+	0x52603002, // n0x04ea c0x0149 (n0x1ceb-n0x1d00)  + I tr
+	0x002673c5, // n0x04eb c0x0000 (---------------)  + I trade
+	0x002a4607, // n0x04ec c0x0000 (---------------)  + I trading
+	0x0022a6c8, // n0x04ed c0x0000 (---------------)  + I training
+	0x0029bec6, // n0x04ee c0x0000 (---------------)  + I travel
+	0x0029becd, // n0x04ef c0x0000 (---------------)  + I travelchannel
+	0x002a1a89, // n0x04f0 c0x0000 (---------------)  + I travelers
+	0x002a1a92, // n0x04f1 c0x0000 (---------------)  + I travelersinsurance
+	0x00329245, // n0x04f2 c0x0000 (---------------)  + I trust
+	0x0033f2c3, // n0x04f3 c0x0000 (---------------)  + I trv
+	0x5320e842, // n0x04f4 c0x014c (n0x1d02-n0x1d13)  + I tt
+	0x002e48c4, // n0x04f5 c0x0000 (---------------)  + I tube
+	0x002f89c3, // n0x04f6 c0x0000 (---------------)  + I tui
+	0x0035d745, // n0x04f7 c0x0000 (---------------)  + I tunes
+	0x002f2e45, // n0x04f8 c0x0000 (---------------)  + I tushu
+	0x53624e42, // n0x04f9 c0x014d (n0x1d13-n0x1d17)  + I tv
+	0x003644c3, // n0x04fa c0x0000 (---------------)  + I tvs
+	0x53a4e502, // n0x04fb c0x014e (n0x1d17-n0x1d25)  + I tw
+	0x53e1fe82, // n0x04fc c0x014f (n0x1d25-n0x1d31)  + I tz
+	0x54220502, // n0x04fd c0x0150 (n0x1d31-n0x1d80)  + I ua
+	0x0033bbc5, // n0x04fe c0x0000 (---------------)  + I ubank
+	0x0024a4c3, // n0x04ff c0x0000 (---------------)  + I ubs
+	0x00249a48, // n0x0500 c0x0000 (---------------)  + I uconnect
+	0x54601cc2, // n0x0501 c0x0151 (n0x1d80-n0x1d89)  + I ug
+	0x54a00f82, // n0x0502 c0x0152 (n0x1d89-n0x1d94)  + I uk
+	0x002a6ac6, // n0x0503 c0x0000 (---------------)  + I unicom
+	0x00320a0a, // n0x0504 c0x0000 (---------------)  + I university
+	0x0020d503, // n0x0505 c0x0000 (---------------)  + I uno
+	0x00259d43, // n0x0506 c0x0000 (---------------)  + I uol
+	0x002d5243, // n0x0507 c0x0000 (---------------)  + I ups
+	0x55602382, // n0x0508 c0x0155 (n0x1d96-n0x1dd5)  + I us
+	0x63a01802, // n0x0509 c0x018e (n0x1e78-n0x1e7e)  + I uy
+	0x64211342, // n0x050a c0x0190 (n0x1e7f-n0x1e83)  + I uz
+	0x002000c2, // n0x050b c0x0000 (---------------)  + I va
+	0x00376a09, // n0x050c c0x0000 (---------------)  + I vacations
+	0x002bc5c4, // n0x050d c0x0000 (---------------)  + I vana
+	0x00344588, // n0x050e c0x0000 (---------------)  + I vanguard
+	0x646e6b02, // n0x050f c0x0191 (n0x1e83-n0x1e89)  + I vc
+	0x64a02b82, // n0x0510 c0x0192 (n0x1e89-n0x1e9a)  + I ve
+	0x00230285, // n0x0511 c0x0000 (---------------)  + I vegas
+	0x0023b808, // n0x0512 c0x0000 (---------------)  + I ventures
+	0x002f1788, // n0x0513 c0x0000 (---------------)  + I verisign
+	0x0039440c, // n0x0514 c0x0000 (---------------)  + I versicherung
+	0x0023f943, // n0x0515 c0x0000 (---------------)  + I vet
+	0x0023fd02, // n0x0516 c0x0000 (---------------)  + I vg
+	0x64e05d42, // n0x0517 c0x0193 (n0x1e9a-n0x1e9f)  + I vi
+	0x002c5706, // n0x0518 c0x0000 (---------------)  + I viajes
+	0x002f5685, // n0x0519 c0x0000 (---------------)  + I video
+	0x0031a003, // n0x051a c0x0000 (---------------)  + I vig
+	0x00311a06, // n0x051b c0x0000 (---------------)  + I viking
+	0x002f57c6, // n0x051c c0x0000 (---------------)  + I villas
+	0x00241543, // n0x051d c0x0000 (---------------)  + I vin
+	0x002f7ac3, // n0x051e c0x0000 (---------------)  + I vip
+	0x002f7e86, // n0x051f c0x0000 (---------------)  + I virgin
+	0x002f8404, // n0x0520 c0x0000 (---------------)  + I visa
+	0x002b48c6, // n0x0521 c0x0000 (---------------)  + I vision
+	0x002c9245, // n0x0522 c0x0000 (---------------)  + I vista
+	0x002f878a, // n0x0523 c0x0000 (---------------)  + I vistaprint
+	0x00240444, // n0x0524 c0x0000 (---------------)  + I viva
+	0x002f97c4, // n0x0525 c0x0000 (---------------)  + I vivo
+	0x0034710a, // n0x0526 c0x0000 (---------------)  + I vlaanderen
+	0x65203442, // n0x0527 c0x0194 (n0x1e9f-n0x1eac)  + I vn
+	0x002760c5, // n0x0528 c0x0000 (---------------)  + I vodka
+	0x002fbd0a, // n0x0529 c0x0000 (---------------)  + I volkswagen
+	0x002fc945, // n0x052a c0x0000 (---------------)  + I volvo
+	0x002fd4c4, // n0x052b c0x0000 (---------------)  + I vote
+	0x002fd5c6, // n0x052c c0x0000 (---------------)  + I voting
+	0x002fd744, // n0x052d c0x0000 (---------------)  + I voto
+	0x00231006, // n0x052e c0x0000 (---------------)  + I voyage
+	0x65672082, // n0x052f c0x0195 (n0x1eac-n0x1eb0)  + I vu
+	0x0031f5c6, // n0x0530 c0x0000 (---------------)  + I vuelos
+	0x00320685, // n0x0531 c0x0000 (---------------)  + I wales
+	0x002010c7, // n0x0532 c0x0000 (---------------)  + I walmart
+	0x00293986, // n0x0533 c0x0000 (---------------)  + I walter
+	0x00242744, // n0x0534 c0x0000 (---------------)  + I wang
+	0x0033d6c7, // n0x0535 c0x0000 (---------------)  + I wanggou
+	0x0036f146, // n0x0536 c0x0000 (---------------)  + I warman
+	0x002aca45, // n0x0537 c0x0000 (---------------)  + I watch
+	0x003a3d87, // n0x0538 c0x0000 (---------------)  + I watches
+	0x00391887, // n0x0539 c0x0000 (---------------)  + I weather
+	0x0039188e, // n0x053a c0x0000 (---------------)  + I weatherchannel
+	0x00221a06, // n0x053b c0x0000 (---------------)  + I webcam
+	0x0022e645, // n0x053c c0x0000 (---------------)  + I weber
+	0x00281007, // n0x053d c0x0000 (---------------)  + I website
+	0x002f08c3, // n0x053e c0x0000 (---------------)  + I wed
+	0x0032f407, // n0x053f c0x0000 (---------------)  + I wedding
+	0x0020fe05, // n0x0540 c0x0000 (---------------)  + I weibo
+	0x002109c4, // n0x0541 c0x0000 (---------------)  + I weir
+	0x0022fe82, // n0x0542 c0x0000 (---------------)  + I wf
+	0x003a43c7, // n0x0543 c0x0000 (---------------)  + I whoswho
+	0x002eee04, // n0x0544 c0x0000 (---------------)  + I wien
+	0x0037c484, // n0x0545 c0x0000 (---------------)  + I wiki
+	0x0025a8cb, // n0x0546 c0x0000 (---------------)  + I williamhill
+	0x0021cbc3, // n0x0547 c0x0000 (---------------)  + I win
+	0x002afe07, // n0x0548 c0x0000 (---------------)  + I windows
+	0x0021cbc4, // n0x0549 c0x0000 (---------------)  + I wine
+	0x002b0f07, // n0x054a c0x0000 (---------------)  + I winners
+	0x00231c43, // n0x054b c0x0000 (---------------)  + I wme
+	0x0032ae4d, // n0x054c c0x0000 (---------------)  + I wolterskluwer
+	0x00380f88, // n0x054d c0x0000 (---------------)  + I woodside
+	0x00255c44, // n0x054e c0x0000 (---------------)  + I work
+	0x00351f05, // n0x054f c0x0000 (---------------)  + I works
+	0x00300b85, // n0x0550 c0x0000 (---------------)  + I world
+	0x002ff3c3, // n0x0551 c0x0000 (---------------)  + I wow
+	0x65a0b942, // n0x0552 c0x0196 (n0x1eb0-n0x1eb7)  + I ws
+	0x003002c3, // n0x0553 c0x0000 (---------------)  + I wtc
+	0x00300783, // n0x0554 c0x0000 (---------------)  + I wtf
+	0x0021bb44, // n0x0555 c0x0000 (---------------)  + I xbox
+	0x0027bec5, // n0x0556 c0x0000 (---------------)  + I xerox
+	0x00230a07, // n0x0557 c0x0000 (---------------)  + I xfinity
+	0x00220446, // n0x0558 c0x0000 (---------------)  + I xihuan
+	0x00367243, // n0x0559 c0x0000 (---------------)  + I xin
+	0x002317cb, // n0x055a c0x0000 (---------------)  + I xn--11b4c3d
+	0x0024830b, // n0x055b c0x0000 (---------------)  + I xn--1ck2e1b
+	0x0026a7cb, // n0x055c c0x0000 (---------------)  + I xn--1qqw23a
+	0x0027bfca, // n0x055d c0x0000 (---------------)  + I xn--30rr7y
+	0x002a718b, // n0x055e c0x0000 (---------------)  + I xn--3bst00m
+	0x002daa8b, // n0x055f c0x0000 (---------------)  + I xn--3ds443g
+	0x002d3d4c, // n0x0560 c0x0000 (---------------)  + I xn--3e0b707e
+	0x002f2851, // n0x0561 c0x0000 (---------------)  + I xn--3oq18vl8pn36a
+	0x00339a8a, // n0x0562 c0x0000 (---------------)  + I xn--3pxu8k
+	0x0034a00b, // n0x0563 c0x0000 (---------------)  + I xn--42c2d9a
+	0x00370d8b, // n0x0564 c0x0000 (---------------)  + I xn--45brj9c
+	0x003a374a, // n0x0565 c0x0000 (---------------)  + I xn--45q11c
+	0x003a5a0a, // n0x0566 c0x0000 (---------------)  + I xn--4gbrim
+	0x00300f8d, // n0x0567 c0x0000 (---------------)  + I xn--4gq48lf9j
+	0x0030218e, // n0x0568 c0x0000 (---------------)  + I xn--54b7fta0cc
+	0x0030270b, // n0x0569 c0x0000 (---------------)  + I xn--55qw42g
+	0x003029ca, // n0x056a c0x0000 (---------------)  + I xn--55qx5d
+	0x00303d11, // n0x056b c0x0000 (---------------)  + I xn--5su34j936bgsg
+	0x0030414a, // n0x056c c0x0000 (---------------)  + I xn--5tzm5g
+	0x0030464b, // n0x056d c0x0000 (---------------)  + I xn--6frz82g
+	0x00304b8e, // n0x056e c0x0000 (---------------)  + I xn--6qq986b3xl
+	0x0030550c, // n0x056f c0x0000 (---------------)  + I xn--80adxhks
+	0x0030648b, // n0x0570 c0x0000 (---------------)  + I xn--80ao21a
+	0x0030674e, // n0x0571 c0x0000 (---------------)  + I xn--80aqecdr1a
+	0x00306acc, // n0x0572 c0x0000 (---------------)  + I xn--80asehdb
+	0x00309b8a, // n0x0573 c0x0000 (---------------)  + I xn--80aswg
+	0x0030a9cc, // n0x0574 c0x0000 (---------------)  + I xn--8y0a063a
+	0x65f0acca, // n0x0575 c0x0197 (n0x1eb7-n0x1ebd)  + I xn--90a3ac
+	0x0030bb89, // n0x0576 c0x0000 (---------------)  + I xn--90ais
+	0x0030d14a, // n0x0577 c0x0000 (---------------)  + I xn--9dbq2a
+	0x0030d3ca, // n0x0578 c0x0000 (---------------)  + I xn--9et52u
+	0x0030d64b, // n0x0579 c0x0000 (---------------)  + I xn--9krt00a
+	0x00310c4e, // n0x057a c0x0000 (---------------)  + I xn--b4w605ferd
+	0x00310fd1, // n0x057b c0x0000 (---------------)  + I xn--bck1b9a5dre4c
+	0x00318cc9, // n0x057c c0x0000 (---------------)  + I xn--c1avg
+	0x00318f0a, // n0x057d c0x0000 (---------------)  + I xn--c2br7g
+	0x00319a4b, // n0x057e c0x0000 (---------------)  + I xn--cck2b3b
+	0x0031b68a, // n0x057f c0x0000 (---------------)  + I xn--cg4bki
+	0x0031bfd6, // n0x0580 c0x0000 (---------------)  + I xn--clchc0ea0b2g2a9gcd
+	0x0031e50b, // n0x0581 c0x0000 (---------------)  + I xn--czr694b
+	0x0032398a, // n0x0582 c0x0000 (---------------)  + I xn--czrs0t
+	0x003241ca, // n0x0583 c0x0000 (---------------)  + I xn--czru2d
+	0x0032674b, // n0x0584 c0x0000 (---------------)  + I xn--d1acj3b
+	0x00328cc9, // n0x0585 c0x0000 (---------------)  + I xn--d1alf
+	0x0032b7cd, // n0x0586 c0x0000 (---------------)  + I xn--eckvdtc9d
+	0x0032c18b, // n0x0587 c0x0000 (---------------)  + I xn--efvy88h
+	0x0032d08b, // n0x0588 c0x0000 (---------------)  + I xn--estv75g
+	0x0032da4b, // n0x0589 c0x0000 (---------------)  + I xn--fct429k
+	0x0032dec9, // n0x058a c0x0000 (---------------)  + I xn--fhbei
+	0x0032e50e, // n0x058b c0x0000 (---------------)  + I xn--fiq228c5hs
+	0x0032ebca, // n0x058c c0x0000 (---------------)  + I xn--fiq64b
+	0x003328ca, // n0x058d c0x0000 (---------------)  + I xn--fiqs8s
+	0x00332c0a, // n0x058e c0x0000 (---------------)  + I xn--fiqz9s
+	0x003334cb, // n0x058f c0x0000 (---------------)  + I xn--fjq720a
+	0x00333d0b, // n0x0590 c0x0000 (---------------)  + I xn--flw351e
+	0x00333fcd, // n0x0591 c0x0000 (---------------)  + I xn--fpcrj9c3d
+	0x0033558d, // n0x0592 c0x0000 (---------------)  + I xn--fzc2c9e2c
+	0x00335ad0, // n0x0593 c0x0000 (---------------)  + I xn--fzys8d69uvgm
+	0x00335f8b, // n0x0594 c0x0000 (---------------)  + I xn--g2xx48c
+	0x00336d4c, // n0x0595 c0x0000 (---------------)  + I xn--gckr3f0f
+	0x00337a0b, // n0x0596 c0x0000 (---------------)  + I xn--gecrj9c
+	0x0033a58b, // n0x0597 c0x0000 (---------------)  + I xn--gk3at1e
+	0x0033ca0b, // n0x0598 c0x0000 (---------------)  + I xn--h2brj9c
+	0x0034034b, // n0x0599 c0x0000 (---------------)  + I xn--hxt814e
+	0x00340dcf, // n0x059a c0x0000 (---------------)  + I xn--i1b6b1a6a2e
+	0x0034118b, // n0x059b c0x0000 (---------------)  + I xn--imr513n
+	0x0034280a, // n0x059c c0x0000 (---------------)  + I xn--io0a7i
+	0x00343209, // n0x059d c0x0000 (---------------)  + I xn--j1aef
+	0x00343e49, // n0x059e c0x0000 (---------------)  + I xn--j1amh
+	0x0034478b, // n0x059f c0x0000 (---------------)  + I xn--j6w193g
+	0x00344a4e, // n0x05a0 c0x0000 (---------------)  + I xn--jlq61u9w7b
+	0x0034778b, // n0x05a1 c0x0000 (---------------)  + I xn--jvr189m
+	0x00348bcf, // n0x05a2 c0x0000 (---------------)  + I xn--kcrx77d1x4a
+	0x0034afcb, // n0x05a3 c0x0000 (---------------)  + I xn--kprw13d
+	0x0034b28b, // n0x05a4 c0x0000 (---------------)  + I xn--kpry57d
+	0x0034b54b, // n0x05a5 c0x0000 (---------------)  + I xn--kpu716f
+	0x0034b98a, // n0x05a6 c0x0000 (---------------)  + I xn--kput3i
+	0x00352909, // n0x05a7 c0x0000 (---------------)  + I xn--l1acc
+	0x0035800f, // n0x05a8 c0x0000 (---------------)  + I xn--lgbbat1ad8j
+	0x0035c74c, // n0x05a9 c0x0000 (---------------)  + I xn--mgb2ddes
+	0x0035cfcc, // n0x05aa c0x0000 (---------------)  + I xn--mgb9awbf
+	0x0035d40e, // n0x05ab c0x0000 (---------------)  + I xn--mgba3a3ejt
+	0x0035d94f, // n0x05ac c0x0000 (---------------)  + I xn--mgba3a4f16a
+	0x0035dd0e, // n0x05ad c0x0000 (---------------)  + I xn--mgba3a4fra
+	0x0035e6d0, // n0x05ae c0x0000 (---------------)  + I xn--mgba7c0bbn0a
+	0x0035eacf, // n0x05af c0x0000 (---------------)  + I xn--mgbaakc7dvf
+	0x0035f04e, // n0x05b0 c0x0000 (---------------)  + I xn--mgbaam7a8h
+	0x0035f50c, // n0x05b1 c0x0000 (---------------)  + I xn--mgbab2bd
+	0x0035f812, // n0x05b2 c0x0000 (---------------)  + I xn--mgbai9a5eva00b
+	0x00360b51, // n0x05b3 c0x0000 (---------------)  + I xn--mgbai9azgqp6j
+	0x0036110e, // n0x05b4 c0x0000 (---------------)  + I xn--mgbayh7gpa
+	0x0036154e, // n0x05b5 c0x0000 (---------------)  + I xn--mgbb9fbpob
+	0x00361a8e, // n0x05b6 c0x0000 (---------------)  + I xn--mgbbh1a71e
+	0x00361e0f, // n0x05b7 c0x0000 (---------------)  + I xn--mgbc0a9azcg
+	0x003621ce, // n0x05b8 c0x0000 (---------------)  + I xn--mgbca7dzdo
+	0x00362553, // n0x05b9 c0x0000 (---------------)  + I xn--mgberp4a5d4a87g
+	0x00362a11, // n0x05ba c0x0000 (---------------)  + I xn--mgberp4a5d4ar
+	0x00362e4e, // n0x05bb c0x0000 (---------------)  + I xn--mgbi4ecexp
+	0x003632cc, // n0x05bc c0x0000 (---------------)  + I xn--mgbpl2fh
+	0x00363713, // n0x05bd c0x0000 (---------------)  + I xn--mgbqly7c0a67fbc
+	0x00363e90, // n0x05be c0x0000 (---------------)  + I xn--mgbqly7cvafr
+	0x0036470c, // n0x05bf c0x0000 (---------------)  + I xn--mgbt3dhd
+	0x00364a0c, // n0x05c0 c0x0000 (---------------)  + I xn--mgbtf8fl
+	0x00364f4b, // n0x05c1 c0x0000 (---------------)  + I xn--mgbtx2b
+	0x0036540e, // n0x05c2 c0x0000 (---------------)  + I xn--mgbx4cd0ab
+	0x0036590b, // n0x05c3 c0x0000 (---------------)  + I xn--mix082f
+	0x0036688b, // n0x05c4 c0x0000 (---------------)  + I xn--mix891f
+	0x003678cc, // n0x05c5 c0x0000 (---------------)  + I xn--mk1bu44c
+	0x0036fa4a, // n0x05c6 c0x0000 (---------------)  + I xn--mxtq1m
+	0x0037058c, // n0x05c7 c0x0000 (---------------)  + I xn--ngbc5azd
+	0x0037088c, // n0x05c8 c0x0000 (---------------)  + I xn--ngbe9e0a
+	0x00370b89, // n0x05c9 c0x0000 (---------------)  + I xn--ngbrx
+	0x0037254b, // n0x05ca c0x0000 (---------------)  + I xn--nnx388a
+	0x00372808, // n0x05cb c0x0000 (---------------)  + I xn--node
+	0x00372cc9, // n0x05cc c0x0000 (---------------)  + I xn--nqv7f
+	0x00372ccf, // n0x05cd c0x0000 (---------------)  + I xn--nqv7fs00ema
+	0x0037464b, // n0x05ce c0x0000 (---------------)  + I xn--nyqy26a
+	0x0037534a, // n0x05cf c0x0000 (---------------)  + I xn--o3cw4h
+	0x0037708c, // n0x05d0 c0x0000 (---------------)  + I xn--ogbpf8fl
+	0x00379349, // n0x05d1 c0x0000 (---------------)  + I xn--p1acf
+	0x003795c8, // n0x05d2 c0x0000 (---------------)  + I xn--p1ai
+	0x003797cb, // n0x05d3 c0x0000 (---------------)  + I xn--pbt977c
+	0x0037a58b, // n0x05d4 c0x0000 (---------------)  + I xn--pgbs0dh
+	0x0037b44a, // n0x05d5 c0x0000 (---------------)  + I xn--pssy2u
+	0x0037b6cb, // n0x05d6 c0x0000 (---------------)  + I xn--q9jyb4c
+	0x0037cc4c, // n0x05d7 c0x0000 (---------------)  + I xn--qcka1pmc
+	0x0037d688, // n0x05d8 c0x0000 (---------------)  + I xn--qxam
+	0x0038118b, // n0x05d9 c0x0000 (---------------)  + I xn--rhqv96g
+	0x0038390b, // n0x05da c0x0000 (---------------)  + I xn--rovu88b
+	0x00386f0b, // n0x05db c0x0000 (---------------)  + I xn--s9brj9c
+	0x0038860b, // n0x05dc c0x0000 (---------------)  + I xn--ses554g
+	0x0039140b, // n0x05dd c0x0000 (---------------)  + I xn--t60b56a
+	0x003916c9, // n0x05de c0x0000 (---------------)  + I xn--tckwe
+	0x00391c0d, // n0x05df c0x0000 (---------------)  + I xn--tiq49xqyj
+	0x0039654a, // n0x05e0 c0x0000 (---------------)  + I xn--unup4y
+	0x00397497, // n0x05e1 c0x0000 (---------------)  + I xn--vermgensberater-ctb
+	0x003982d8, // n0x05e2 c0x0000 (---------------)  + I xn--vermgensberatung-pwb
+	0x0039a849, // n0x05e3 c0x0000 (---------------)  + I xn--vhquv
+	0x0039ba4b, // n0x05e4 c0x0000 (---------------)  + I xn--vuq861b
+	0x0039c814, // n0x05e5 c0x0000 (---------------)  + I xn--w4r85el8fhu5dnra
+	0x0039cd0b, // n0x05e6 c0x0000 (---------------)  + I xn--w4rs40l
+	0x0039d28a, // n0x05e7 c0x0000 (---------------)  + I xn--wgbh1c
+	0x0039d84a, // n0x05e8 c0x0000 (---------------)  + I xn--wgbl6a
+	0x0039dacb, // n0x05e9 c0x0000 (---------------)  + I xn--xhq521b
+	0x003a1450, // n0x05ea c0x0000 (---------------)  + I xn--xkc2al3hye2a
+	0x003a1851, // n0x05eb c0x0000 (---------------)  + I xn--xkc2dl3a5ee0h
+	0x003a210a, // n0x05ec c0x0000 (---------------)  + I xn--y9a3aq
+	0x003a2d4d, // n0x05ed c0x0000 (---------------)  + I xn--yfro4i67o
+	0x003a344d, // n0x05ee c0x0000 (---------------)  + I xn--ygbi2ammx
+	0x003a5dcb, // n0x05ef c0x0000 (---------------)  + I xn--zfr164b
+	0x003a6b46, // n0x05f0 c0x0000 (---------------)  + I xperia
+	0x00230983, // n0x05f1 c0x0000 (---------------)  + I xxx
+	0x00247683, // n0x05f2 c0x0000 (---------------)  + I xyz
+	0x00307e86, // n0x05f3 c0x0000 (---------------)  + I yachts
+	0x0028d645, // n0x05f4 c0x0000 (---------------)  + I yahoo
+	0x002c7947, // n0x05f5 c0x0000 (---------------)  + I yamaxun
+	0x00339946, // n0x05f6 c0x0000 (---------------)  + I yandex
+	0x01608242, // n0x05f7 c0x0005 (---------------)* o I ye
+	0x003710c9, // n0x05f8 c0x0000 (---------------)  + I yodobashi
+	0x003559c4, // n0x05f9 c0x0000 (---------------)  + I yoga
+	0x002d09c8, // n0x05fa c0x0000 (---------------)  + I yokohama
+	0x0024b0c3, // n0x05fb c0x0000 (---------------)  + I you
+	0x002e4807, // n0x05fc c0x0000 (---------------)  + I youtube
+	0x00244002, // n0x05fd c0x0000 (---------------)  + I yt
+	0x002ac203, // n0x05fe c0x0000 (---------------)  + I yun
+	0x66205f82, // n0x05ff c0x0198 (n0x1ebd-n0x1ece)  o I za
+	0x002c3fc6, // n0x0600 c0x0000 (---------------)  + I zappos
+	0x002c4d04, // n0x0601 c0x0000 (---------------)  + I zara
+	0x002eb584, // n0x0602 c0x0000 (---------------)  + I zero
+	0x002432c3, // n0x0603 c0x0000 (---------------)  + I zip
+	0x002432c5, // n0x0604 c0x0000 (---------------)  + I zippo
+	0x01700d02, // n0x0605 c0x0005 (---------------)* o I zm
+	0x002dce04, // n0x0606 c0x0000 (---------------)  + I zone
+	0x00273947, // n0x0607 c0x0000 (---------------)  + I zuerich
+	0x016afdc2, // n0x0608 c0x0005 (---------------)* o I zw
+	0x00233503, // n0x0609 c0x0000 (---------------)  + I com
+	0x0023a783, // n0x060a c0x0000 (---------------)  + I edu
+	0x0026cc83, // n0x060b c0x0000 (---------------)  + I gov
+	0x00209003, // n0x060c c0x0000 (---------------)  + I mil
+	0x0021fe03, // n0x060d c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x060e c0x0000 (---------------)  + I org
+	0x00201483, // n0x060f c0x0000 (---------------)  + I nom
+	0x00201542, // n0x0610 c0x0000 (---------------)  + I ac
+	0x000ffa08, // n0x0611 c0x0000 (---------------)  +   blogspot
+	0x00200742, // n0x0612 c0x0000 (---------------)  + I co
+	0x0026cc83, // n0x0613 c0x0000 (---------------)  + I gov
+	0x00209003, // n0x0614 c0x0000 (---------------)  + I mil
+	0x0021fe03, // n0x0615 c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x0616 c0x0000 (---------------)  + I org
+	0x00217443, // n0x0617 c0x0000 (---------------)  + I sch
+	0x00316196, // n0x0618 c0x0000 (---------------)  + I accident-investigation
+	0x00317cd3, // n0x0619 c0x0000 (---------------)  + I accident-prevention
+	0x002f66c9, // n0x061a c0x0000 (---------------)  + I aerobatic
+	0x002389c8, // n0x061b c0x0000 (---------------)  + I aeroclub
+	0x002dd449, // n0x061c c0x0000 (---------------)  + I aerodrome
+	0x002fbe86, // n0x061d c0x0000 (---------------)  + I agents
+	0x0030c790, // n0x061e c0x0000 (---------------)  + I air-surveillance
+	0x00358d93, // n0x061f c0x0000 (---------------)  + I air-traffic-control
+	0x00204908, // n0x0620 c0x0000 (---------------)  + I aircraft
+	0x002d7e07, // n0x0621 c0x0000 (---------------)  + I airline
+	0x002793c7, // n0x0622 c0x0000 (---------------)  + I airport
+	0x0021868a, // n0x0623 c0x0000 (---------------)  + I airtraffic
+	0x002c8609, // n0x0624 c0x0000 (---------------)  + I ambulance
+	0x0037d809, // n0x0625 c0x0000 (---------------)  + I amusement
+	0x002d488b, // n0x0626 c0x0000 (---------------)  + I association
+	0x0031a686, // n0x0627 c0x0000 (---------------)  + I author
+	0x0022faca, // n0x0628 c0x0000 (---------------)  + I ballooning
+	0x00220c46, // n0x0629 c0x0000 (---------------)  + I broker
+	0x003555c3, // n0x062a c0x0000 (---------------)  + I caa
+	0x002e9b05, // n0x062b c0x0000 (---------------)  + I cargo
+	0x00351008, // n0x062c c0x0000 (---------------)  + I catering
+	0x003257cd, // n0x062d c0x0000 (---------------)  + I certification
+	0x0035894c, // n0x062e c0x0000 (---------------)  + I championship
+	0x00320347, // n0x062f c0x0000 (---------------)  + I charter
+	0x0035b70d, // n0x0630 c0x0000 (---------------)  + I civilaviation
+	0x00238ac4, // n0x0631 c0x0000 (---------------)  + I club
+	0x00236cca, // n0x0632 c0x0000 (---------------)  + I conference
+	0x0023784a, // n0x0633 c0x0000 (---------------)  + I consultant
+	0x00237d0a, // n0x0634 c0x0000 (---------------)  + I consulting
+	0x00308c87, // n0x0635 c0x0000 (---------------)  + I control
+	0x00242207, // n0x0636 c0x0000 (---------------)  + I council
+	0x00245184, // n0x0637 c0x0000 (---------------)  + I crew
+	0x0022dcc6, // n0x0638 c0x0000 (---------------)  + I design
+	0x00356f44, // n0x0639 c0x0000 (---------------)  + I dgca
+	0x002fe188, // n0x063a c0x0000 (---------------)  + I educator
+	0x00322189, // n0x063b c0x0000 (---------------)  + I emergency
+	0x00369146, // n0x063c c0x0000 (---------------)  + I engine
+	0x00369148, // n0x063d c0x0000 (---------------)  + I engineer
+	0x00247acd, // n0x063e c0x0000 (---------------)  + I entertainment
+	0x002c2709, // n0x063f c0x0000 (---------------)  + I equipment
+	0x00239488, // n0x0640 c0x0000 (---------------)  + I exchange
+	0x00247487, // n0x0641 c0x0000 (---------------)  + I express
+	0x0030eeca, // n0x0642 c0x0000 (---------------)  + I federation
+	0x00251286, // n0x0643 c0x0000 (---------------)  + I flight
+	0x0025cf87, // n0x0644 c0x0000 (---------------)  + I freight
+	0x00240d04, // n0x0645 c0x0000 (---------------)  + I fuel
+	0x0026e307, // n0x0646 c0x0000 (---------------)  + I gliding
+	0x0026cc8a, // n0x0647 c0x0000 (---------------)  + I government
+	0x0031240e, // n0x0648 c0x0000 (---------------)  + I groundhandling
+	0x0020ab45, // n0x0649 c0x0000 (---------------)  + I group
+	0x002ff10b, // n0x064a c0x0000 (---------------)  + I hanggliding
+	0x002e9e49, // n0x064b c0x0000 (---------------)  + I homebuilt
+	0x0023e7c9, // n0x064c c0x0000 (---------------)  + I insurance
+	0x0033be47, // n0x064d c0x0000 (---------------)  + I journal
+	0x0038e60a, // n0x064e c0x0000 (---------------)  + I journalist
+	0x00285c07, // n0x064f c0x0000 (---------------)  + I leasing
+	0x002e2d49, // n0x0650 c0x0000 (---------------)  + I logistics
+	0x00395fc8, // n0x0651 c0x0000 (---------------)  + I magazine
+	0x0027634b, // n0x0652 c0x0000 (---------------)  + I maintenance
+	0x003025c5, // n0x0653 c0x0000 (---------------)  + I media
+	0x0031210a, // n0x0654 c0x0000 (---------------)  + I microlight
+	0x002a3209, // n0x0655 c0x0000 (---------------)  + I modelling
+	0x00319f8a, // n0x0656 c0x0000 (---------------)  + I navigation
+	0x002c530b, // n0x0657 c0x0000 (---------------)  + I parachuting
+	0x0026e20b, // n0x0658 c0x0000 (---------------)  + I paragliding
+	0x002d4615, // n0x0659 c0x0000 (---------------)  + I passenger-association
+	0x002d6505, // n0x065a c0x0000 (---------------)  + I pilot
+	0x00247505, // n0x065b c0x0000 (---------------)  + I press
+	0x002e204a, // n0x065c c0x0000 (---------------)  + I production
+	0x00336aca, // n0x065d c0x0000 (---------------)  + I recreation
+	0x002fae47, // n0x065e c0x0000 (---------------)  + I repbody
+	0x0021d683, // n0x065f c0x0000 (---------------)  + I res
+	0x0029fa08, // n0x0660 c0x0000 (---------------)  + I research
+	0x002ce74a, // n0x0661 c0x0000 (---------------)  + I rotorcraft
+	0x00215946, // n0x0662 c0x0000 (---------------)  + I safety
+	0x002466c9, // n0x0663 c0x0000 (---------------)  + I scientist
+	0x00206808, // n0x0664 c0x0000 (---------------)  + I services
+	0x002c4484, // n0x0665 c0x0000 (---------------)  + I show
+	0x0027d709, // n0x0666 c0x0000 (---------------)  + I skydiving
+	0x002b8688, // n0x0667 c0x0000 (---------------)  + I software
+	0x002abd47, // n0x0668 c0x0000 (---------------)  + I student
+	0x002673c6, // n0x0669 c0x0000 (---------------)  + I trader
+	0x002a4607, // n0x066a c0x0000 (---------------)  + I trading
+	0x00295207, // n0x066b c0x0000 (---------------)  + I trainer
+	0x00244bc5, // n0x066c c0x0000 (---------------)  + I union
+	0x002dbd0c, // n0x066d c0x0000 (---------------)  + I workinggroup
+	0x00351f05, // n0x066e c0x0000 (---------------)  + I works
+	0x00233503, // n0x066f c0x0000 (---------------)  + I com
+	0x0023a783, // n0x0670 c0x0000 (---------------)  + I edu
+	0x0026cc83, // n0x0671 c0x0000 (---------------)  + I gov
+	0x0021fe03, // n0x0672 c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x0673 c0x0000 (---------------)  + I org
+	0x00200742, // n0x0674 c0x0000 (---------------)  + I co
+	0x00233503, // n0x0675 c0x0000 (---------------)  + I com
+	0x0021fe03, // n0x0676 c0x0000 (---------------)  + I net
+	0x00201483, // n0x0677 c0x0000 (---------------)  + I nom
+	0x0022d1c3, // n0x0678 c0x0000 (---------------)  + I org
+	0x00233503, // n0x0679 c0x0000 (---------------)  + I com
+	0x0021fe03, // n0x067a c0x0000 (---------------)  + I net
+	0x0020b283, // n0x067b c0x0000 (---------------)  + I off
+	0x0022d1c3, // n0x067c c0x0000 (---------------)  + I org
+	0x000ffa08, // n0x067d c0x0000 (---------------)  +   blogspot
+	0x00233503, // n0x067e c0x0000 (---------------)  + I com
+	0x0023a783, // n0x067f c0x0000 (---------------)  + I edu
+	0x0026cc83, // n0x0680 c0x0000 (---------------)  + I gov
+	0x00209003, // n0x0681 c0x0000 (---------------)  + I mil
+	0x0021fe03, // n0x0682 c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x0683 c0x0000 (---------------)  + I org
+	0x000ffa08, // n0x0684 c0x0000 (---------------)  +   blogspot
+	0x00200742, // n0x0685 c0x0000 (---------------)  + I co
+	0x00202602, // n0x0686 c0x0000 (---------------)  + I ed
+	0x00237f42, // n0x0687 c0x0000 (---------------)  + I gv
+	0x00201e42, // n0x0688 c0x0000 (---------------)  + I it
+	0x00200c42, // n0x0689 c0x0000 (---------------)  + I og
+	0x002718c2, // n0x068a c0x0000 (---------------)  + I pb
+	0x04633503, // n0x068b c0x0011 (n0x0694-n0x0695)  + I com
+	0x0023a783, // n0x068c c0x0000 (---------------)  + I edu
+	0x00213183, // n0x068d c0x0000 (---------------)  + I gob
+	0x0026cc83, // n0x068e c0x0000 (---------------)  + I gov
+	0x00201603, // n0x068f c0x0000 (---------------)  + I int
+	0x00209003, // n0x0690 c0x0000 (---------------)  + I mil
+	0x0021fe03, // n0x0691 c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x0692 c0x0000 (---------------)  + I org
+	0x00209e43, // n0x0693 c0x0000 (---------------)  + I tur
+	0x000ffa08, // n0x0694 c0x0000 (---------------)  +   blogspot
+	0x00255704, // n0x0695 c0x0000 (---------------)  + I e164
+	0x002edc07, // n0x0696 c0x0000 (---------------)  + I in-addr
+	0x00215dc3, // n0x0697 c0x0000 (---------------)  + I ip6
+	0x00238804, // n0x0698 c0x0000 (---------------)  + I iris
+	0x0020dd83, // n0x0699 c0x0000 (---------------)  + I uri
+	0x00285383, // n0x069a c0x0000 (---------------)  + I urn
+	0x0026cc83, // n0x069b c0x0000 (---------------)  + I gov
+	0x00201542, // n0x069c c0x0000 (---------------)  + I ac
+	0x00130b83, // n0x069d c0x0000 (---------------)  +   biz
+	0x05600742, // n0x069e c0x0015 (n0x06a3-n0x06a4)  + I co
+	0x00237f42, // n0x069f c0x0000 (---------------)  + I gv
+	0x001a1244, // n0x06a0 c0x0000 (---------------)  +   info
+	0x00200282, // n0x06a1 c0x0000 (---------------)  + I or
+	0x000e1c44, // n0x06a2 c0x0000 (---------------)  +   priv
+	0x000ffa08, // n0x06a3 c0x0000 (---------------)  +   blogspot
+	0x00239a03, // n0x06a4 c0x0000 (---------------)  + I act
+	0x002afc83, // n0x06a5 c0x0000 (---------------)  + I asn
+	0x05e33503, // n0x06a6 c0x0017 (n0x06b6-n0x06b7)  + I com
+	0x00236cc4, // n0x06a7 c0x0000 (---------------)  + I conf
+	0x0623a783, // n0x06a8 c0x0018 (n0x06b7-n0x06bf)  + I edu
+	0x0666cc83, // n0x06a9 c0x0019 (n0x06bf-n0x06c4)  + I gov
+	0x0020c782, // n0x06aa c0x0000 (---------------)  + I id
+	0x003a1244, // n0x06ab c0x0000 (---------------)  + I info
+	0x0021fe03, // n0x06ac c0x0000 (---------------)  + I net
+	0x002f09c3, // n0x06ad c0x0000 (---------------)  + I nsw
+	0x002009c2, // n0x06ae c0x0000 (---------------)  + I nt
+	0x0022d1c3, // n0x06af c0x0000 (---------------)  + I org
+	0x0021c142, // n0x06b0 c0x0000 (---------------)  + I oz
+	0x002e6383, // n0x06b1 c0x0000 (---------------)  + I qld
+	0x002004c2, // n0x06b2 c0x0000 (---------------)  + I sa
+	0x00201e83, // n0x06b3 c0x0000 (---------------)  + I tas
+	0x002068c3, // n0x06b4 c0x0000 (---------------)  + I vic
+	0x002010c2, // n0x06b5 c0x0000 (---------------)  + I wa
+	0x000ffa08, // n0x06b6 c0x0000 (---------------)  +   blogspot
+	0x00239a03, // n0x06b7 c0x0000 (---------------)  + I act
+	0x002f09c3, // n0x06b8 c0x0000 (---------------)  + I nsw
+	0x002009c2, // n0x06b9 c0x0000 (---------------)  + I nt
+	0x002e6383, // n0x06ba c0x0000 (---------------)  + I qld
+	0x002004c2, // n0x06bb c0x0000 (---------------)  + I sa
+	0x00201e83, // n0x06bc c0x0000 (---------------)  + I tas
+	0x002068c3, // n0x06bd c0x0000 (---------------)  + I vic
+	0x002010c2, // n0x06be c0x0000 (---------------)  + I wa
+	0x002e6383, // n0x06bf c0x0000 (---------------)  + I qld
+	0x002004c2, // n0x06c0 c0x0000 (---------------)  + I sa
+	0x00201e83, // n0x06c1 c0x0000 (---------------)  + I tas
+	0x002068c3, // n0x06c2 c0x0000 (---------------)  + I vic
+	0x002010c2, // n0x06c3 c0x0000 (---------------)  + I wa
+	0x00233503, // n0x06c4 c0x0000 (---------------)  + I com
+	0x00330b83, // n0x06c5 c0x0000 (---------------)  + I biz
+	0x00233503, // n0x06c6 c0x0000 (---------------)  + I com
+	0x0023a783, // n0x06c7 c0x0000 (---------------)  + I edu
+	0x0026cc83, // n0x06c8 c0x0000 (---------------)  + I gov
+	0x003a1244, // n0x06c9 c0x0000 (---------------)  + I info
+	0x00201603, // n0x06ca c0x0000 (---------------)  + I int
+	0x00209003, // n0x06cb c0x0000 (---------------)  + I mil
+	0x00205284, // n0x06cc c0x0000 (---------------)  + I name
+	0x0021fe03, // n0x06cd c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x06ce c0x0000 (---------------)  + I org
+	0x00209302, // n0x06cf c0x0000 (---------------)  + I pp
+	0x00220e43, // n0x06d0 c0x0000 (---------------)  + I pro
+	0x000ffa08, // n0x06d1 c0x0000 (---------------)  +   blogspot
+	0x00200742, // n0x06d2 c0x0000 (---------------)  + I co
+	0x00233503, // n0x06d3 c0x0000 (---------------)  + I com
+	0x0023a783, // n0x06d4 c0x0000 (---------------)  + I edu
+	0x0026cc83, // n0x06d5 c0x0000 (---------------)  + I gov
+	0x00209003, // n0x06d6 c0x0000 (---------------)  + I mil
+	0x0021fe03, // n0x06d7 c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x06d8 c0x0000 (---------------)  + I org
+	0x00209702, // n0x06d9 c0x0000 (---------------)  + I rs
+	0x002d8144, // n0x06da c0x0000 (---------------)  + I unbi
+	0x003a6844, // n0x06db c0x0000 (---------------)  + I unsa
+	0x00330b83, // n0x06dc c0x0000 (---------------)  + I biz
+	0x00200742, // n0x06dd c0x0000 (---------------)  + I co
+	0x00233503, // n0x06de c0x0000 (---------------)  + I com
+	0x0023a783, // n0x06df c0x0000 (---------------)  + I edu
+	0x0026cc83, // n0x06e0 c0x0000 (---------------)  + I gov
+	0x003a1244, // n0x06e1 c0x0000 (---------------)  + I info
+	0x0021fe03, // n0x06e2 c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x06e3 c0x0000 (---------------)  + I org
+	0x00391185, // n0x06e4 c0x0000 (---------------)  + I store
+	0x00224e42, // n0x06e5 c0x0000 (---------------)  + I tv
+	0x00201542, // n0x06e6 c0x0000 (---------------)  + I ac
+	0x000ffa08, // n0x06e7 c0x0000 (---------------)  +   blogspot
+	0x0026cc83, // n0x06e8 c0x0000 (---------------)  + I gov
+	0x0025c3c1, // n0x06e9 c0x0000 (---------------)  + I 0
+	0x0022a0c1, // n0x06ea c0x0000 (---------------)  + I 1
+	0x002484c1, // n0x06eb c0x0000 (---------------)  + I 2
+	0x00231a01, // n0x06ec c0x0000 (---------------)  + I 3
+	0x00231981, // n0x06ed c0x0000 (---------------)  + I 4
+	0x002736c1, // n0x06ee c0x0000 (---------------)  + I 5
+	0x00215e41, // n0x06ef c0x0000 (---------------)  + I 6
+	0x0023e381, // n0x06f0 c0x0000 (---------------)  + I 7
+	0x002f2a41, // n0x06f1 c0x0000 (---------------)  + I 8
+	0x00301241, // n0x06f2 c0x0000 (---------------)  + I 9
+	0x00200101, // n0x06f3 c0x0000 (---------------)  + I a
+	0x00200001, // n0x06f4 c0x0000 (---------------)  + I b
+	0x000ffa08, // n0x06f5 c0x0000 (---------------)  +   blogspot
+	0x00200301, // n0x06f6 c0x0000 (---------------)  + I c
+	0x00200381, // n0x06f7 c0x0000 (---------------)  + I d
+	0x00200081, // n0x06f8 c0x0000 (---------------)  + I e
+	0x00200581, // n0x06f9 c0x0000 (---------------)  + I f
+	0x00200c81, // n0x06fa c0x0000 (---------------)  + I g
+	0x00200d81, // n0x06fb c0x0000 (---------------)  + I h
+	0x00200041, // n0x06fc c0x0000 (---------------)  + I i
+	0x00201741, // n0x06fd c0x0000 (---------------)  + I j
+	0x00200fc1, // n0x06fe c0x0000 (---------------)  + I k
+	0x00200201, // n0x06ff c0x0000 (---------------)  + I l
+	0x00200181, // n0x0700 c0x0000 (---------------)  + I m
+	0x00200541, // n0x0701 c0x0000 (---------------)  + I n
+	0x00200281, // n0x0702 c0x0000 (---------------)  + I o
+	0x00200941, // n0x0703 c0x0000 (---------------)  + I p
+	0x00200401, // n0x0704 c0x0000 (---------------)  + I q
+	0x002002c1, // n0x0705 c0x0000 (---------------)  + I r
+	0x002004c1, // n0x0706 c0x0000 (---------------)  + I s
+	0x00200141, // n0x0707 c0x0000 (---------------)  + I t
+	0x00200441, // n0x0708 c0x0000 (---------------)  + I u
+	0x002000c1, // n0x0709 c0x0000 (---------------)  + I v
+	0x002010c1, // n0x070a c0x0000 (---------------)  + I w
+	0x00205381, // n0x070b c0x0000 (---------------)  + I x
+	0x00201841, // n0x070c c0x0000 (---------------)  + I y
+	0x00205f81, // n0x070d c0x0000 (---------------)  + I z
+	0x00233503, // n0x070e c0x0000 (---------------)  + I com
+	0x0023a783, // n0x070f c0x0000 (---------------)  + I edu
+	0x0026cc83, // n0x0710 c0x0000 (---------------)  + I gov
+	0x0021fe03, // n0x0711 c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x0712 c0x0000 (---------------)  + I org
+	0x00200742, // n0x0713 c0x0000 (---------------)  + I co
+	0x00233503, // n0x0714 c0x0000 (---------------)  + I com
+	0x0023a783, // n0x0715 c0x0000 (---------------)  + I edu
+	0x00200282, // n0x0716 c0x0000 (---------------)  + I or
+	0x0022d1c3, // n0x0717 c0x0000 (---------------)  + I org
+	0x00009107, // n0x0718 c0x0000 (---------------)  +   dscloud
+	0x00013886, // n0x0719 c0x0000 (---------------)  +   dyndns
+	0x00055e8a, // n0x071a c0x0000 (---------------)  +   for-better
+	0x00087d88, // n0x071b c0x0000 (---------------)  +   for-more
+	0x00056488, // n0x071c c0x0000 (---------------)  +   for-some
+	0x000572c7, // n0x071d c0x0000 (---------------)  +   for-the
+	0x0006ba86, // n0x071e c0x0000 (---------------)  +   selfip
+	0x000eadc6, // n0x071f c0x0000 (---------------)  +   webhop
+	0x002d4884, // n0x0720 c0x0000 (---------------)  + I asso
+	0x00319cc7, // n0x0721 c0x0000 (---------------)  + I barreau
+	0x000ffa08, // n0x0722 c0x0000 (---------------)  +   blogspot
+	0x0033d7c4, // n0x0723 c0x0000 (---------------)  + I gouv
+	0x00233503, // n0x0724 c0x0000 (---------------)  + I com
+	0x0023a783, // n0x0725 c0x0000 (---------------)  + I edu
+	0x0026cc83, // n0x0726 c0x0000 (---------------)  + I gov
+	0x0021fe03, // n0x0727 c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x0728 c0x0000 (---------------)  + I org
+	0x00233503, // n0x0729 c0x0000 (---------------)  + I com
+	0x0023a783, // n0x072a c0x0000 (---------------)  + I edu
+	0x00213183, // n0x072b c0x0000 (---------------)  + I gob
+	0x0026cc83, // n0x072c c0x0000 (---------------)  + I gov
+	0x00201603, // n0x072d c0x0000 (---------------)  + I int
+	0x00209003, // n0x072e c0x0000 (---------------)  + I mil
+	0x0021fe03, // n0x072f c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x0730 c0x0000 (---------------)  + I org
+	0x00224e42, // n0x0731 c0x0000 (---------------)  + I tv
+	0x002c3503, // n0x0732 c0x0000 (---------------)  + I adm
+	0x002f4fc3, // n0x0733 c0x0000 (---------------)  + I adv
+	0x00209c83, // n0x0734 c0x0000 (---------------)  + I agr
+	0x00201882, // n0x0735 c0x0000 (---------------)  + I am
+	0x0024f183, // n0x0736 c0x0000 (---------------)  + I arq
+	0x002011c3, // n0x0737 c0x0000 (---------------)  + I art
+	0x00217b03, // n0x0738 c0x0000 (---------------)  + I ato
+	0x00200001, // n0x0739 c0x0000 (---------------)  + I b
+	0x00203a03, // n0x073a c0x0000 (---------------)  + I bio
+	0x002a4004, // n0x073b c0x0000 (---------------)  + I blog
+	0x00321f43, // n0x073c c0x0000 (---------------)  + I bmd
+	0x0025ee03, // n0x073d c0x0000 (---------------)  + I cim
+	0x0021ba43, // n0x073e c0x0000 (---------------)  + I cng
+	0x00231603, // n0x073f c0x0000 (---------------)  + I cnt
+	0x0a233503, // n0x0740 c0x0028 (n0x0778-n0x0779)  + I com
+	0x0023d684, // n0x0741 c0x0000 (---------------)  + I coop
+	0x0021ba03, // n0x0742 c0x0000 (---------------)  + I ecn
+	0x0020b203, // n0x0743 c0x0000 (---------------)  + I eco
+	0x0023a783, // n0x0744 c0x0000 (---------------)  + I edu
+	0x0023a4c3, // n0x0745 c0x0000 (---------------)  + I emp
+	0x00213703, // n0x0746 c0x0000 (---------------)  + I eng
+	0x0029bdc3, // n0x0747 c0x0000 (---------------)  + I esp
+	0x0025ed83, // n0x0748 c0x0000 (---------------)  + I etc
+	0x002234c3, // n0x0749 c0x0000 (---------------)  + I eti
+	0x00212983, // n0x074a c0x0000 (---------------)  + I far
+	0x002522c4, // n0x074b c0x0000 (---------------)  + I flog
+	0x00242902, // n0x074c c0x0000 (---------------)  + I fm
+	0x00255803, // n0x074d c0x0000 (---------------)  + I fnd
+	0x0025bb03, // n0x074e c0x0000 (---------------)  + I fot
+	0x00277703, // n0x074f c0x0000 (---------------)  + I fst
+	0x002ee4c3, // n0x0750 c0x0000 (---------------)  + I g12
+	0x002ece03, // n0x0751 c0x0000 (---------------)  + I ggf
+	0x0026cc83, // n0x0752 c0x0000 (---------------)  + I gov
+	0x002cc783, // n0x0753 c0x0000 (---------------)  + I imb
+	0x0021d883, // n0x0754 c0x0000 (---------------)  + I ind
+	0x003a1083, // n0x0755 c0x0000 (---------------)  + I inf
+	0x00215b43, // n0x0756 c0x0000 (---------------)  + I jor
+	0x002f3143, // n0x0757 c0x0000 (---------------)  + I jus
+	0x0022e283, // n0x0758 c0x0000 (---------------)  + I leg
+	0x002d08c3, // n0x0759 c0x0000 (---------------)  + I lel
+	0x0021f803, // n0x075a c0x0000 (---------------)  + I mat
+	0x00213ac3, // n0x075b c0x0000 (---------------)  + I med
+	0x00209003, // n0x075c c0x0000 (---------------)  + I mil
+	0x0022a482, // n0x075d c0x0000 (---------------)  + I mp
+	0x00283a83, // n0x075e c0x0000 (---------------)  + I mus
+	0x0021fe03, // n0x075f c0x0000 (---------------)  + I net
+	0x01601483, // n0x0760 c0x0005 (---------------)* o I nom
+	0x002547c3, // n0x0761 c0x0000 (---------------)  + I not
+	0x0023b443, // n0x0762 c0x0000 (---------------)  + I ntr
+	0x00213243, // n0x0763 c0x0000 (---------------)  + I odo
+	0x0022d1c3, // n0x0764 c0x0000 (---------------)  + I org
+	0x00249583, // n0x0765 c0x0000 (---------------)  + I ppg
+	0x00220e43, // n0x0766 c0x0000 (---------------)  + I pro
+	0x0023d083, // n0x0767 c0x0000 (---------------)  + I psc
+	0x002f7b43, // n0x0768 c0x0000 (---------------)  + I psi
+	0x002e6543, // n0x0769 c0x0000 (---------------)  + I qsl
+	0x00264b85, // n0x076a c0x0000 (---------------)  + I radio
+	0x0022a5c3, // n0x076b c0x0000 (---------------)  + I rec
+	0x002e6583, // n0x076c c0x0000 (---------------)  + I slg
+	0x0035ca03, // n0x076d c0x0000 (---------------)  + I srv
+	0x002203c4, // n0x076e c0x0000 (---------------)  + I taxi
+	0x00336843, // n0x076f c0x0000 (---------------)  + I teo
+	0x00239f83, // n0x0770 c0x0000 (---------------)  + I tmp
+	0x002a9803, // n0x0771 c0x0000 (---------------)  + I trd
+	0x00209e43, // n0x0772 c0x0000 (---------------)  + I tur
+	0x00224e42, // n0x0773 c0x0000 (---------------)  + I tv
+	0x0023f943, // n0x0774 c0x0000 (---------------)  + I vet
+	0x002fa5c4, // n0x0775 c0x0000 (---------------)  + I vlog
+	0x0037c484, // n0x0776 c0x0000 (---------------)  + I wiki
+	0x002645c3, // n0x0777 c0x0000 (---------------)  + I zlg
+	0x000ffa08, // n0x0778 c0x0000 (---------------)  +   blogspot
+	0x00233503, // n0x0779 c0x0000 (---------------)  + I com
+	0x0023a783, // n0x077a c0x0000 (---------------)  + I edu
+	0x0026cc83, // n0x077b c0x0000 (---------------)  + I gov
+	0x0021fe03, // n0x077c c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x077d c0x0000 (---------------)  + I org
+	0x00233503, // n0x077e c0x0000 (---------------)  + I com
+	0x0023a783, // n0x077f c0x0000 (---------------)  + I edu
+	0x0026cc83, // n0x0780 c0x0000 (---------------)  + I gov
+	0x0021fe03, // n0x0781 c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x0782 c0x0000 (---------------)  + I org
+	0x00200742, // n0x0783 c0x0000 (---------------)  + I co
+	0x0022d1c3, // n0x0784 c0x0000 (---------------)  + I org
+	0x0b633503, // n0x0785 c0x002d (n0x0789-n0x078a)  + I com
+	0x0026cc83, // n0x0786 c0x0000 (---------------)  + I gov
+	0x00209003, // n0x0787 c0x0000 (---------------)  + I mil
+	0x0020b282, // n0x0788 c0x0000 (---------------)  + I of
+	0x000ffa08, // n0x0789 c0x0000 (---------------)  +   blogspot
+	0x00233503, // n0x078a c0x0000 (---------------)  + I com
+	0x0023a783, // n0x078b c0x0000 (---------------)  + I edu
+	0x0026cc83, // n0x078c c0x0000 (---------------)  + I gov
+	0x0021fe03, // n0x078d c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x078e c0x0000 (---------------)  + I org
+	0x00005f82, // n0x078f c0x0000 (---------------)  +   za
+	0x002020c2, // n0x0790 c0x0000 (---------------)  + I ab
+	0x00221a82, // n0x0791 c0x0000 (---------------)  + I bc
+	0x000ffa08, // n0x0792 c0x0000 (---------------)  +   blogspot
+	0x00000742, // n0x0793 c0x0000 (---------------)  +   co
+	0x0023c3c2, // n0x0794 c0x0000 (---------------)  + I gc
+	0x00208602, // n0x0795 c0x0000 (---------------)  + I mb
+	0x00215102, // n0x0796 c0x0000 (---------------)  + I nb
+	0x00200542, // n0x0797 c0x0000 (---------------)  + I nf
+	0x00247802, // n0x0798 c0x0000 (---------------)  + I nl
+	0x00210c42, // n0x0799 c0x0000 (---------------)  + I ns
+	0x002009c2, // n0x079a c0x0000 (---------------)  + I nt
+	0x002017c2, // n0x079b c0x0000 (---------------)  + I nu
+	0x00200982, // n0x079c c0x0000 (---------------)  + I on
+	0x00207782, // n0x079d c0x0000 (---------------)  + I pe
+	0x0037cd42, // n0x079e c0x0000 (---------------)  + I qc
+	0x00207842, // n0x079f c0x0000 (---------------)  + I sk
+	0x00226f42, // n0x07a0 c0x0000 (---------------)  + I yk
+	0x00146449, // n0x07a1 c0x0000 (---------------)  +   ftpaccess
+	0x00173f0b, // n0x07a2 c0x0000 (---------------)  +   game-server
+	0x000d1148, // n0x07a3 c0x0000 (---------------)  +   myphotos
+	0x00143a09, // n0x07a4 c0x0000 (---------------)  +   scrapping
+	0x0026cc83, // n0x07a5 c0x0000 (---------------)  + I gov
+	0x000ffa08, // n0x07a6 c0x0000 (---------------)  +   blogspot
+	0x000ffa08, // n0x07a7 c0x0000 (---------------)  +   blogspot
+	0x00201542, // n0x07a8 c0x0000 (---------------)  + I ac
+	0x002d4884, // n0x07a9 c0x0000 (---------------)  + I asso
+	0x00200742, // n0x07aa c0x0000 (---------------)  + I co
+	0x00233503, // n0x07ab c0x0000 (---------------)  + I com
+	0x00202602, // n0x07ac c0x0000 (---------------)  + I ed
+	0x0023a783, // n0x07ad c0x0000 (---------------)  + I edu
+	0x00202d42, // n0x07ae c0x0000 (---------------)  + I go
+	0x0033d7c4, // n0x07af c0x0000 (---------------)  + I gouv
+	0x00201603, // n0x07b0 c0x0000 (---------------)  + I int
+	0x0024da82, // n0x07b1 c0x0000 (---------------)  + I md
+	0x0021fe03, // n0x07b2 c0x0000 (---------------)  + I net
+	0x00200282, // n0x07b3 c0x0000 (---------------)  + I or
+	0x0022d1c3, // n0x07b4 c0x0000 (---------------)  + I org
+	0x00247506, // n0x07b5 c0x0000 (---------------)  + I presse
+	0x0030dc0f, // n0x07b6 c0x0000 (---------------)  + I xn--aroport-bya
+	0x00700b03, // n0x07b7 c0x0001 (---------------)  ! I www
+	0x000ffa08, // n0x07b8 c0x0000 (---------------)  +   blogspot
+	0x00200742, // n0x07b9 c0x0000 (---------------)  + I co
+	0x00213183, // n0x07ba c0x0000 (---------------)  + I gob
+	0x0026cc83, // n0x07bb c0x0000 (---------------)  + I gov
+	0x00209003, // n0x07bc c0x0000 (---------------)  + I mil
+	0x00200742, // n0x07bd c0x0000 (---------------)  + I co
+	0x00233503, // n0x07be c0x0000 (---------------)  + I com
+	0x0026cc83, // n0x07bf c0x0000 (---------------)  + I gov
+	0x0021fe03, // n0x07c0 c0x0000 (---------------)  + I net
+	0x00201542, // n0x07c1 c0x0000 (---------------)  + I ac
+	0x00204f02, // n0x07c2 c0x0000 (---------------)  + I ah
+	0x0e6f6409, // n0x07c3 c0x0039 (n0x07ee-n0x07ef)  o I amazonaws
+	0x00206502, // n0x07c4 c0x0000 (---------------)  + I bj
+	0x0ee33503, // n0x07c5 c0x003b (n0x07f0-n0x07f1)  + I com
+	0x00243b42, // n0x07c6 c0x0000 (---------------)  + I cq
+	0x0023a783, // n0x07c7 c0x0000 (---------------)  + I edu
+	0x00215b02, // n0x07c8 c0x0000 (---------------)  + I fj
+	0x00222d42, // n0x07c9 c0x0000 (---------------)  + I gd
+	0x0026cc83, // n0x07ca c0x0000 (---------------)  + I gov
+	0x0023a242, // n0x07cb c0x0000 (---------------)  + I gs
+	0x00260202, // n0x07cc c0x0000 (---------------)  + I gx
+	0x00264642, // n0x07cd c0x0000 (---------------)  + I gz
+	0x00202442, // n0x07ce c0x0000 (---------------)  + I ha
+	0x0028c342, // n0x07cf c0x0000 (---------------)  + I hb
+	0x002073c2, // n0x07d0 c0x0000 (---------------)  + I he
+	0x00200d82, // n0x07d1 c0x0000 (---------------)  + I hi
+	0x0020a882, // n0x07d2 c0x0000 (---------------)  + I hk
+	0x00248fc2, // n0x07d3 c0x0000 (---------------)  + I hl
+	0x0021ab42, // n0x07d4 c0x0000 (---------------)  + I hn
+	0x002ac642, // n0x07d5 c0x0000 (---------------)  + I jl
+	0x00251742, // n0x07d6 c0x0000 (---------------)  + I js
+	0x00313402, // n0x07d7 c0x0000 (---------------)  + I jx
+	0x0022e8c2, // n0x07d8 c0x0000 (---------------)  + I ln
+	0x00209003, // n0x07d9 c0x0000 (---------------)  + I mil
+	0x00207102, // n0x07da c0x0000 (---------------)  + I mo
+	0x0021fe03, // n0x07db c0x0000 (---------------)  + I net
+	0x0023db02, // n0x07dc c0x0000 (---------------)  + I nm
+	0x0026a782, // n0x07dd c0x0000 (---------------)  + I nx
+	0x0022d1c3, // n0x07de c0x0000 (---------------)  + I org
+	0x0024f202, // n0x07df c0x0000 (---------------)  + I qh
+	0x00200702, // n0x07e0 c0x0000 (---------------)  + I sc
+	0x002496c2, // n0x07e1 c0x0000 (---------------)  + I sd
+	0x00201342, // n0x07e2 c0x0000 (---------------)  + I sh
+	0x00214182, // n0x07e3 c0x0000 (---------------)  + I sn
+	0x002f2802, // n0x07e4 c0x0000 (---------------)  + I sx
+	0x00226782, // n0x07e5 c0x0000 (---------------)  + I tj
+	0x0024e502, // n0x07e6 c0x0000 (---------------)  + I tw
+	0x0036f4c2, // n0x07e7 c0x0000 (---------------)  + I xj
+	0x003029ca, // n0x07e8 c0x0000 (---------------)  + I xn--55qx5d
+	0x0034280a, // n0x07e9 c0x0000 (---------------)  + I xn--io0a7i
+	0x0037648a, // n0x07ea c0x0000 (---------------)  + I xn--od0alg
+	0x003a6cc2, // n0x07eb c0x0000 (---------------)  + I xz
+	0x00213642, // n0x07ec c0x0000 (---------------)  + I yn
+	0x00247702, // n0x07ed c0x0000 (---------------)  + I zj
+	0x0e835247, // n0x07ee c0x003a (n0x07ef-n0x07f0)  +   compute
+	0x00039b8a, // n0x07ef c0x0000 (---------------)  +   cn-north-1
+	0x0f2f6409, // n0x07f0 c0x003c (n0x07f1-n0x07f2)  o I amazonaws
+	0x0f639b8a, // n0x07f1 c0x003d (n0x07f2-n0x07f3)  o I cn-north-1
+	0x0004a542, // n0x07f2 c0x0000 (---------------)  +   s3
+	0x0024bf84, // n0x07f3 c0x0000 (---------------)  + I arts
+	0x0fe33503, // n0x07f4 c0x003f (n0x0800-n0x0801)  + I com
+	0x0023a783, // n0x07f5 c0x0000 (---------------)  + I edu
+	0x0024d9c4, // n0x07f6 c0x0000 (---------------)  + I firm
+	0x0026cc83, // n0x07f7 c0x0000 (---------------)  + I gov
+	0x003a1244, // n0x07f8 c0x0000 (---------------)  + I info
+	0x00201603, // n0x07f9 c0x0000 (---------------)  + I int
+	0x00209003, // n0x07fa c0x0000 (---------------)  + I mil
+	0x0021fe03, // n0x07fb c0x0000 (---------------)  + I net
+	0x00201483, // n0x07fc c0x0000 (---------------)  + I nom
+	0x0022d1c3, // n0x07fd c0x0000 (---------------)  + I org
+	0x0022a5c3, // n0x07fe c0x0000 (---------------)  + I rec
+	0x00221a03, // n0x07ff c0x0000 (---------------)  + I web
+	0x000ffa08, // n0x0800 c0x0000 (---------------)  +   blogspot
+	0x00131905, // n0x0801 c0x0000 (---------------)  +   1kapp
+	0x0010a942, // n0x0802 c0x0000 (---------------)  +   4u
+	0x00175846, // n0x0803 c0x0000 (---------------)  +   africa
+	0x106f6409, // n0x0804 c0x0041 (n0x08d7-n0x08eb)  o I amazonaws
+	0x000092c7, // n0x0805 c0x0000 (---------------)  +   appspot
+	0x00000a42, // n0x0806 c0x0000 (---------------)  +   ar
+	0x0019bcca, // n0x0807 c0x0000 (---------------)  +   betainabox
+	0x000fb147, // n0x0808 c0x0000 (---------------)  +   blogdns
+	0x000ffa08, // n0x0809 c0x0000 (---------------)  +   blogspot
+	0x0001c402, // n0x080a c0x0000 (---------------)  +   br
+	0x001387c7, // n0x080b c0x0000 (---------------)  +   cechire
+	0x00194fcf, // n0x080c c0x0000 (---------------)  +   cloudcontrolapp
+	0x00108b4f, // n0x080d c0x0000 (---------------)  +   cloudcontrolled
+	0x0001ba42, // n0x080e c0x0000 (---------------)  +   cn
+	0x00000742, // n0x080f c0x0000 (---------------)  +   co
+	0x0009bd08, // n0x0810 c0x0000 (---------------)  +   codespot
+	0x00004d82, // n0x0811 c0x0000 (---------------)  +   de
+	0x0014c048, // n0x0812 c0x0000 (---------------)  +   dnsalias
+	0x0007c9c7, // n0x0813 c0x0000 (---------------)  +   dnsdojo
+	0x00014e0b, // n0x0814 c0x0000 (---------------)  +   doesntexist
+	0x0016a009, // n0x0815 c0x0000 (---------------)  +   dontexist
+	0x0014bf47, // n0x0816 c0x0000 (---------------)  +   doomdns
+	0x000f410c, // n0x0817 c0x0000 (---------------)  +   dreamhosters
+	0x0008cdc7, // n0x0818 c0x0000 (---------------)  +   dsmynas
+	0x0012328a, // n0x0819 c0x0000 (---------------)  +   dyn-o-saur
+	0x00197b48, // n0x081a c0x0000 (---------------)  +   dynalias
+	0x00073dce, // n0x081b c0x0000 (---------------)  +   dyndns-at-home
+	0x000dba8e, // n0x081c c0x0000 (---------------)  +   dyndns-at-work
+	0x000faf8b, // n0x081d c0x0000 (---------------)  +   dyndns-blog
+	0x000e7b4b, // n0x081e c0x0000 (---------------)  +   dyndns-free
+	0x0001388b, // n0x081f c0x0000 (---------------)  +   dyndns-home
+	0x00015c09, // n0x0820 c0x0000 (---------------)  +   dyndns-ip
+	0x0001b40b, // n0x0821 c0x0000 (---------------)  +   dyndns-mail
+	0x000214cd, // n0x0822 c0x0000 (---------------)  +   dyndns-office
+	0x0002554b, // n0x0823 c0x0000 (---------------)  +   dyndns-pics
+	0x0002698d, // n0x0824 c0x0000 (---------------)  +   dyndns-remote
+	0x0002d40d, // n0x0825 c0x0000 (---------------)  +   dyndns-server
+	0x0002e48a, // n0x0826 c0x0000 (---------------)  +   dyndns-web
+	0x0017c2cb, // n0x0827 c0x0000 (---------------)  +   dyndns-wiki
+	0x00151d4b, // n0x0828 c0x0000 (---------------)  +   dyndns-work
+	0x0001e810, // n0x0829 c0x0000 (---------------)  +   elasticbeanstalk
+	0x0002bb8f, // n0x082a c0x0000 (---------------)  +   est-a-la-maison
+	0x0000a14f, // n0x082b c0x0000 (---------------)  +   est-a-la-masion
+	0x0015234d, // n0x082c c0x0000 (---------------)  +   est-le-patron
+	0x0013c450, // n0x082d c0x0000 (---------------)  +   est-mon-blogueur
+	0x00004b82, // n0x082e c0x0000 (---------------)  +   eu
+	0x00008f88, // n0x082f c0x0000 (---------------)  +   familyds
+	0x11a4e285, // n0x0830 c0x0046 (n0x08f9-n0x08fa)  o I fbsbx
+	0x0004c6cb, // n0x0831 c0x0000 (---------------)  +   firebaseapp
+	0x000549c8, // n0x0832 c0x0000 (---------------)  +   flynnhub
+	0x00063d87, // n0x0833 c0x0000 (---------------)  +   from-ak
+	0x000640c7, // n0x0834 c0x0000 (---------------)  +   from-al
+	0x00064287, // n0x0835 c0x0000 (---------------)  +   from-ar
+	0x00065347, // n0x0836 c0x0000 (---------------)  +   from-ca
+	0x00065e07, // n0x0837 c0x0000 (---------------)  +   from-ct
+	0x00066587, // n0x0838 c0x0000 (---------------)  +   from-dc
+	0x00067007, // n0x0839 c0x0000 (---------------)  +   from-de
+	0x00067547, // n0x083a c0x0000 (---------------)  +   from-fl
+	0x00067b87, // n0x083b c0x0000 (---------------)  +   from-ga
+	0x00067f07, // n0x083c c0x0000 (---------------)  +   from-hi
+	0x00068787, // n0x083d c0x0000 (---------------)  +   from-ia
+	0x00068947, // n0x083e c0x0000 (---------------)  +   from-id
+	0x00068b07, // n0x083f c0x0000 (---------------)  +   from-il
+	0x00068cc7, // n0x0840 c0x0000 (---------------)  +   from-in
+	0x00068fc7, // n0x0841 c0x0000 (---------------)  +   from-ks
+	0x00069ac7, // n0x0842 c0x0000 (---------------)  +   from-ky
+	0x0006a5c7, // n0x0843 c0x0000 (---------------)  +   from-ma
+	0x0006aa87, // n0x0844 c0x0000 (---------------)  +   from-md
+	0x0006b007, // n0x0845 c0x0000 (---------------)  +   from-mi
+	0x0006bd87, // n0x0846 c0x0000 (---------------)  +   from-mn
+	0x0006bf47, // n0x0847 c0x0000 (---------------)  +   from-mo
+	0x0006c247, // n0x0848 c0x0000 (---------------)  +   from-ms
+	0x0006c787, // n0x0849 c0x0000 (---------------)  +   from-mt
+	0x0006c987, // n0x084a c0x0000 (---------------)  +   from-nc
+	0x0006d307, // n0x084b c0x0000 (---------------)  +   from-nd
+	0x0006d4c7, // n0x084c c0x0000 (---------------)  +   from-ne
+	0x0006d8c7, // n0x084d c0x0000 (---------------)  +   from-nh
+	0x0006e007, // n0x084e c0x0000 (---------------)  +   from-nj
+	0x0006e4c7, // n0x084f c0x0000 (---------------)  +   from-nm
+	0x0006ef87, // n0x0850 c0x0000 (---------------)  +   from-nv
+	0x0006f587, // n0x0851 c0x0000 (---------------)  +   from-oh
+	0x0006f847, // n0x0852 c0x0000 (---------------)  +   from-ok
+	0x0006fbc7, // n0x0853 c0x0000 (---------------)  +   from-or
+	0x0006fd87, // n0x0854 c0x0000 (---------------)  +   from-pa
+	0x00070107, // n0x0855 c0x0000 (---------------)  +   from-pr
+	0x000708c7, // n0x0856 c0x0000 (---------------)  +   from-ri
+	0x00070f07, // n0x0857 c0x0000 (---------------)  +   from-sc
+	0x00071307, // n0x0858 c0x0000 (---------------)  +   from-sd
+	0x00073147, // n0x0859 c0x0000 (---------------)  +   from-tn
+	0x00073307, // n0x085a c0x0000 (---------------)  +   from-tx
+	0x00073747, // n0x085b c0x0000 (---------------)  +   from-ut
+	0x00074607, // n0x085c c0x0000 (---------------)  +   from-va
+	0x00074c47, // n0x085d c0x0000 (---------------)  +   from-vt
+	0x00074f47, // n0x085e c0x0000 (---------------)  +   from-wa
+	0x00075107, // n0x085f c0x0000 (---------------)  +   from-wi
+	0x00075487, // n0x0860 c0x0000 (---------------)  +   from-wv
+	0x00076607, // n0x0861 c0x0000 (---------------)  +   from-wy
+	0x0000d202, // n0x0862 c0x0000 (---------------)  +   gb
+	0x000d4487, // n0x0863 c0x0000 (---------------)  +   getmyip
+	0x11cca40b, // n0x0864 c0x0047 (n0x08fa-n0x08fd)  +   githubcloud
+	0x014ca416, // n0x0865 c0x0005 (---------------)* o   githubcloudusercontent
+	0x00019511, // n0x0866 c0x0000 (---------------)  +   githubusercontent
+	0x000df54a, // n0x0867 c0x0000 (---------------)  +   googleapis
+	0x0009bb8a, // n0x0868 c0x0000 (---------------)  +   googlecode
+	0x00057d06, // n0x0869 c0x0000 (---------------)  +   gotdns
+	0x00011ecb, // n0x086a c0x0000 (---------------)  +   gotpantheon
+	0x00000c82, // n0x086b c0x0000 (---------------)  +   gr
+	0x000992c9, // n0x086c c0x0000 (---------------)  +   herokuapp
+	0x00091f49, // n0x086d c0x0000 (---------------)  +   herokussl
+	0x0000a882, // n0x086e c0x0000 (---------------)  +   hk
+	0x0014cfca, // n0x086f c0x0000 (---------------)  +   hobby-site
+	0x000a59c9, // n0x0870 c0x0000 (---------------)  +   homelinux
+	0x000a6fc8, // n0x0871 c0x0000 (---------------)  +   homeunix
+	0x000195c2, // n0x0872 c0x0000 (---------------)  +   hu
+	0x00116f89, // n0x0873 c0x0000 (---------------)  +   iamallama
+	0x0016d68e, // n0x0874 c0x0000 (---------------)  +   is-a-anarchist
+	0x000a3ecc, // n0x0875 c0x0000 (---------------)  +   is-a-blogger
+	0x000d254f, // n0x0876 c0x0000 (---------------)  +   is-a-bookkeeper
+	0x0018ba8e, // n0x0877 c0x0000 (---------------)  +   is-a-bulls-fan
+	0x0000de0c, // n0x0878 c0x0000 (---------------)  +   is-a-caterer
+	0x00012789, // n0x0879 c0x0000 (---------------)  +   is-a-chef
+	0x00013d11, // n0x087a c0x0000 (---------------)  +   is-a-conservative
+	0x00016c08, // n0x087b c0x0000 (---------------)  +   is-a-cpa
+	0x00024852, // n0x087c c0x0000 (---------------)  +   is-a-cubicle-slave
+	0x0002648d, // n0x087d c0x0000 (---------------)  +   is-a-democrat
+	0x0002db8d, // n0x087e c0x0000 (---------------)  +   is-a-designer
+	0x0017614b, // n0x087f c0x0000 (---------------)  +   is-a-doctor
+	0x00178815, // n0x0880 c0x0000 (---------------)  +   is-a-financialadvisor
+	0x0004e989, // n0x0881 c0x0000 (---------------)  +   is-a-geek
+	0x0005028a, // n0x0882 c0x0000 (---------------)  +   is-a-green
+	0x00059389, // n0x0883 c0x0000 (---------------)  +   is-a-guru
+	0x0005bd50, // n0x0884 c0x0000 (---------------)  +   is-a-hard-worker
+	0x000662cb, // n0x0885 c0x0000 (---------------)  +   is-a-hunter
+	0x00070a4f, // n0x0886 c0x0000 (---------------)  +   is-a-landscaper
+	0x0007434b, // n0x0887 c0x0000 (---------------)  +   is-a-lawyer
+	0x0007b5cc, // n0x0888 c0x0000 (---------------)  +   is-a-liberal
+	0x0007dbd0, // n0x0889 c0x0000 (---------------)  +   is-a-libertarian
+	0x00082fca, // n0x088a c0x0000 (---------------)  +   is-a-llama
+	0x0008394d, // n0x088b c0x0000 (---------------)  +   is-a-musician
+	0x0008894e, // n0x088c c0x0000 (---------------)  +   is-a-nascarfan
+	0x0014414a, // n0x088d c0x0000 (---------------)  +   is-a-nurse
+	0x00089f0c, // n0x088e c0x0000 (---------------)  +   is-a-painter
+	0x00094ed4, // n0x088f c0x0000 (---------------)  +   is-a-personaltrainer
+	0x00098f51, // n0x0890 c0x0000 (---------------)  +   is-a-photographer
+	0x0009e80b, // n0x0891 c0x0000 (---------------)  +   is-a-player
+	0x0009f58f, // n0x0892 c0x0000 (---------------)  +   is-a-republican
+	0x000a0f8d, // n0x0893 c0x0000 (---------------)  +   is-a-rockstar
+	0x000a384e, // n0x0894 c0x0000 (---------------)  +   is-a-socialist
+	0x000abc0c, // n0x0895 c0x0000 (---------------)  +   is-a-student
+	0x000d5b8c, // n0x0896 c0x0000 (---------------)  +   is-a-teacher
+	0x000d588b, // n0x0897 c0x0000 (---------------)  +   is-a-techie
+	0x000beb8e, // n0x0898 c0x0000 (---------------)  +   is-a-therapist
+	0x000d9990, // n0x0899 c0x0000 (---------------)  +   is-an-accountant
+	0x000ad54b, // n0x089a c0x0000 (---------------)  +   is-an-actor
+	0x000d540d, // n0x089b c0x0000 (---------------)  +   is-an-actress
+	0x000fb60f, // n0x089c c0x0000 (---------------)  +   is-an-anarchist
+	0x0010390c, // n0x089d c0x0000 (---------------)  +   is-an-artist
+	0x00168fce, // n0x089e c0x0000 (---------------)  +   is-an-engineer
+	0x000b2bd1, // n0x089f c0x0000 (---------------)  +   is-an-entertainer
+	0x000b924c, // n0x08a0 c0x0000 (---------------)  +   is-certified
+	0x000bb247, // n0x08a1 c0x0000 (---------------)  +   is-gone
+	0x000be5cd, // n0x08a2 c0x0000 (---------------)  +   is-into-anime
+	0x00105d8c, // n0x08a3 c0x0000 (---------------)  +   is-into-cars
+	0x00147b50, // n0x08a4 c0x0000 (---------------)  +   is-into-cartoons
+	0x0016fecd, // n0x08a5 c0x0000 (---------------)  +   is-into-games
+	0x000cf347, // n0x08a6 c0x0000 (---------------)  +   is-leet
+	0x0017e2d0, // n0x08a7 c0x0000 (---------------)  +   is-not-certified
+	0x000e9488, // n0x08a8 c0x0000 (---------------)  +   is-slick
+	0x000ef04b, // n0x08a9 c0x0000 (---------------)  +   is-uberleet
+	0x0014bbcf, // n0x08aa c0x0000 (---------------)  +   is-with-theband
+	0x0008e588, // n0x08ab c0x0000 (---------------)  +   isa-geek
+	0x000df74d, // n0x08ac c0x0000 (---------------)  +   isa-hockeynut
+	0x00168110, // n0x08ad c0x0000 (---------------)  +   issmarterthanyou
+	0x000aedc3, // n0x08ae c0x0000 (---------------)  +   jpn
+	0x00006fc2, // n0x08af c0x0000 (---------------)  +   kr
+	0x00058c49, // n0x08b0 c0x0000 (---------------)  +   likes-pie
+	0x00073bca, // n0x08b1 c0x0000 (---------------)  +   likescandy
+	0x00005303, // n0x08b2 c0x0000 (---------------)  +   mex
+	0x0010b007, // n0x08b3 c0x0000 (---------------)  +   mydrobo
+	0x001176c8, // n0x08b4 c0x0000 (---------------)  +   neat-url
+	0x00184847, // n0x08b5 c0x0000 (---------------)  +   nfshost
+	0x00000c02, // n0x08b6 c0x0000 (---------------)  +   no
+	0x00064d0a, // n0x08b7 c0x0000 (---------------)  +   operaunite
+	0x00194d4f, // n0x08b8 c0x0000 (---------------)  +   outsystemscloud
+	0x000eaf0c, // n0x08b9 c0x0000 (---------------)  +   pagefrontapp
+	0x000eb1d2, // n0x08ba c0x0000 (---------------)  +   pagespeedmobilizer
+	0x122e1605, // n0x08bb c0x0048 (n0x08fd-n0x08fe)  o I prgmr
+	0x00114683, // n0x08bc c0x0000 (---------------)  +   qa2
+	0x0017cd42, // n0x08bd c0x0000 (---------------)  +   qc
+	0x000ecb08, // n0x08be c0x0000 (---------------)  +   rackmaze
+	0x00108ac7, // n0x08bf c0x0000 (---------------)  +   rhcloud
+	0x00002202, // n0x08c0 c0x0000 (---------------)  +   ro
+	0x00011302, // n0x08c1 c0x0000 (---------------)  +   ru
+	0x000004c2, // n0x08c2 c0x0000 (---------------)  +   sa
+	0x00033810, // n0x08c3 c0x0000 (---------------)  +   saves-the-whales
+	0x000046c2, // n0x08c4 c0x0000 (---------------)  +   se
+	0x0006ba86, // n0x08c5 c0x0000 (---------------)  +   selfip
+	0x0013738e, // n0x08c6 c0x0000 (---------------)  +   sells-for-less
+	0x0008becb, // n0x08c7 c0x0000 (---------------)  +   sells-for-u
+	0x000cb7c8, // n0x08c8 c0x0000 (---------------)  +   servebbs
+	0x000d0eca, // n0x08c9 c0x0000 (---------------)  +   simple-url
+	0x000f7b87, // n0x08ca c0x0000 (---------------)  +   sinaapp
+	0x0000bb4d, // n0x08cb c0x0000 (---------------)  +   space-to-rent
+	0x001557cc, // n0x08cc c0x0000 (---------------)  +   teaches-yoga
+	0x00000f82, // n0x08cd c0x0000 (---------------)  +   uk
+	0x00002382, // n0x08ce c0x0000 (---------------)  +   us
+	0x00001802, // n0x08cf c0x0000 (---------------)  +   uy
+	0x000f7aca, // n0x08d0 c0x0000 (---------------)  +   vipsinaapp
+	0x000df44a, // n0x08d1 c0x0000 (---------------)  +   withgoogle
+	0x000e470b, // n0x08d2 c0x0000 (---------------)  +   withyoutube
+	0x000ff78e, // n0x08d3 c0x0000 (---------------)  +   writesthisblog
+	0x0001bc0d, // n0x08d4 c0x0000 (---------------)  +   xenapponazure
+	0x000d6f08, // n0x08d5 c0x0000 (---------------)  +   yolasite
+	0x00005f82, // n0x08d6 c0x0000 (---------------)  +   za
+	0x10a5f44e, // n0x08d7 c0x0042 (n0x08eb-n0x08ec)  o I ap-northeast-2
+	0x10c35247, // n0x08d8 c0x0043 (n0x08ec-n0x08f6)  +   compute
+	0x11035249, // n0x08d9 c0x0044 (n0x08f6-n0x08f8)  +   compute-1
+	0x00010743, // n0x08da c0x0000 (---------------)  +   elb
+	0x11672e4c, // n0x08db c0x0045 (n0x08f8-n0x08f9)  o I eu-central-1
+	0x0004a542, // n0x08dc c0x0000 (---------------)  +   s3
+	0x00132491, // n0x08dd c0x0000 (---------------)  +   s3-ap-northeast-1
+	0x0005f391, // n0x08de c0x0000 (---------------)  +   s3-ap-northeast-2
+	0x00131511, // n0x08df c0x0000 (---------------)  +   s3-ap-southeast-1
+	0x0004a551, // n0x08e0 c0x0000 (---------------)  +   s3-ap-southeast-2
+	0x00072d8f, // n0x08e1 c0x0000 (---------------)  +   s3-eu-central-1
+	0x001101cc, // n0x08e2 c0x0000 (---------------)  +   s3-eu-west-1
+	0x0011b34d, // n0x08e3 c0x0000 (---------------)  +   s3-external-1
+	0x0012364d, // n0x08e4 c0x0000 (---------------)  +   s3-external-2
+	0x00126215, // n0x08e5 c0x0000 (---------------)  +   s3-fips-us-gov-west-1
+	0x0014694c, // n0x08e6 c0x0000 (---------------)  +   s3-sa-east-1
+	0x000de150, // n0x08e7 c0x0000 (---------------)  +   s3-us-gov-west-1
+	0x000c158c, // n0x08e8 c0x0000 (---------------)  +   s3-us-west-1
+	0x000dc7cc, // n0x08e9 c0x0000 (---------------)  +   s3-us-west-2
+	0x0017ca09, // n0x08ea c0x0000 (---------------)  +   us-east-1
+	0x0004a542, // n0x08eb c0x0000 (---------------)  +   s3
+	0x0013254e, // n0x08ec c0x0000 (---------------)  +   ap-northeast-1
+	0x0005f44e, // n0x08ed c0x0000 (---------------)  +   ap-northeast-2
+	0x001315ce, // n0x08ee c0x0000 (---------------)  +   ap-southeast-1
+	0x0004a60e, // n0x08ef c0x0000 (---------------)  +   ap-southeast-2
+	0x00072e4c, // n0x08f0 c0x0000 (---------------)  +   eu-central-1
+	0x00110289, // n0x08f1 c0x0000 (---------------)  +   eu-west-1
+	0x00146a09, // n0x08f2 c0x0000 (---------------)  +   sa-east-1
+	0x000de20d, // n0x08f3 c0x0000 (---------------)  +   us-gov-west-1
+	0x000c1649, // n0x08f4 c0x0000 (---------------)  +   us-west-1
+	0x000dc889, // n0x08f5 c0x0000 (---------------)  +   us-west-2
+	0x0002a043, // n0x08f6 c0x0000 (---------------)  +   z-1
+	0x0013e5c3, // n0x08f7 c0x0000 (---------------)  +   z-2
+	0x0004a542, // n0x08f8 c0x0000 (---------------)  +   s3
+	0x000092c4, // n0x08f9 c0x0000 (---------------)  +   apps
+	0x014bedc3, // n0x08fa c0x0005 (---------------)* o   api
+	0x0140ba03, // n0x08fb c0x0005 (---------------)* o   ext
+	0x000e2dc4, // n0x08fc c0x0000 (---------------)  +   gist
+	0x0001bc03, // n0x08fd c0x0000 (---------------)  +   xen
+	0x00201542, // n0x08fe c0x0000 (---------------)  + I ac
+	0x00200742, // n0x08ff c0x0000 (---------------)  + I co
+	0x00202602, // n0x0900 c0x0000 (---------------)  + I ed
+	0x00207502, // n0x0901 c0x0000 (---------------)  + I fi
+	0x00202d42, // n0x0902 c0x0000 (---------------)  + I go
+	0x00200282, // n0x0903 c0x0000 (---------------)  + I or
+	0x002004c2, // n0x0904 c0x0000 (---------------)  + I sa
+	0x00233503, // n0x0905 c0x0000 (---------------)  + I com
+	0x0023a783, // n0x0906 c0x0000 (---------------)  + I edu
+	0x0026cc83, // n0x0907 c0x0000 (---------------)  + I gov
+	0x003a1083, // n0x0908 c0x0000 (---------------)  + I inf
+	0x0021fe03, // n0x0909 c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x090a c0x0000 (---------------)  + I org
+	0x000ffa08, // n0x090b c0x0000 (---------------)  +   blogspot
+	0x00233503, // n0x090c c0x0000 (---------------)  + I com
+	0x0023a783, // n0x090d c0x0000 (---------------)  + I edu
+	0x0021fe03, // n0x090e c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x090f c0x0000 (---------------)  + I org
+	0x00048f43, // n0x0910 c0x0000 (---------------)  +   ath
+	0x0026cc83, // n0x0911 c0x0000 (---------------)  + I gov
+	0x00201542, // n0x0912 c0x0000 (---------------)  + I ac
+	0x00330b83, // n0x0913 c0x0000 (---------------)  + I biz
+	0x13e33503, // n0x0914 c0x004f (n0x091f-n0x0920)  + I com
+	0x0027a1c7, // n0x0915 c0x0000 (---------------)  + I ekloges
+	0x0026cc83, // n0x0916 c0x0000 (---------------)  + I gov
+	0x00322cc3, // n0x0917 c0x0000 (---------------)  + I ltd
+	0x00205284, // n0x0918 c0x0000 (---------------)  + I name
+	0x0021fe03, // n0x0919 c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x091a c0x0000 (---------------)  + I org
+	0x0028440a, // n0x091b c0x0000 (---------------)  + I parliament
+	0x00247505, // n0x091c c0x0000 (---------------)  + I press
+	0x00220e43, // n0x091d c0x0000 (---------------)  + I pro
+	0x00200142, // n0x091e c0x0000 (---------------)  + I tm
+	0x000ffa08, // n0x091f c0x0000 (---------------)  +   blogspot
+	0x000ffa08, // n0x0920 c0x0000 (---------------)  +   blogspot
+	0x00000742, // n0x0921 c0x0000 (---------------)  +   co
+	0x000ffa08, // n0x0922 c0x0000 (---------------)  +   blogspot
+	0x00033503, // n0x0923 c0x0000 (---------------)  +   com
+	0x000afa4f, // n0x0924 c0x0000 (---------------)  +   fuettertdasnetz
+	0x0016a18a, // n0x0925 c0x0000 (---------------)  +   isteingeek
+	0x000a3b07, // n0x0926 c0x0000 (---------------)  +   istmein
+	0x0001fc8a, // n0x0927 c0x0000 (---------------)  +   lebtimnetz
+	0x0018460a, // n0x0928 c0x0000 (---------------)  +   leitungsen
+	0x00004acd, // n0x0929 c0x0000 (---------------)  +   traeumtgerade
+	0x000ffa08, // n0x092a c0x0000 (---------------)  +   blogspot
+	0x00233503, // n0x092b c0x0000 (---------------)  + I com
+	0x0023a783, // n0x092c c0x0000 (---------------)  + I edu
+	0x0026cc83, // n0x092d c0x0000 (---------------)  + I gov
+	0x0021fe03, // n0x092e c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x092f c0x0000 (---------------)  + I org
+	0x002011c3, // n0x0930 c0x0000 (---------------)  + I art
+	0x00233503, // n0x0931 c0x0000 (---------------)  + I com
+	0x0023a783, // n0x0932 c0x0000 (---------------)  + I edu
+	0x00213183, // n0x0933 c0x0000 (---------------)  + I gob
+	0x0026cc83, // n0x0934 c0x0000 (---------------)  + I gov
+	0x00209003, // n0x0935 c0x0000 (---------------)  + I mil
+	0x0021fe03, // n0x0936 c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x0937 c0x0000 (---------------)  + I org
+	0x00292103, // n0x0938 c0x0000 (---------------)  + I sld
+	0x00221a03, // n0x0939 c0x0000 (---------------)  + I web
+	0x002011c3, // n0x093a c0x0000 (---------------)  + I art
+	0x002d4884, // n0x093b c0x0000 (---------------)  + I asso
+	0x00233503, // n0x093c c0x0000 (---------------)  + I com
+	0x0023a783, // n0x093d c0x0000 (---------------)  + I edu
+	0x0026cc83, // n0x093e c0x0000 (---------------)  + I gov
+	0x0021fe03, // n0x093f c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x0940 c0x0000 (---------------)  + I org
+	0x00208103, // n0x0941 c0x0000 (---------------)  + I pol
+	0x00233503, // n0x0942 c0x0000 (---------------)  + I com
+	0x0023a783, // n0x0943 c0x0000 (---------------)  + I edu
+	0x00207503, // n0x0944 c0x0000 (---------------)  + I fin
+	0x00213183, // n0x0945 c0x0000 (---------------)  + I gob
+	0x0026cc83, // n0x0946 c0x0000 (---------------)  + I gov
+	0x003a1244, // n0x0947 c0x0000 (---------------)  + I info
+	0x00309ac3, // n0x0948 c0x0000 (---------------)  + I k12
+	0x00213ac3, // n0x0949 c0x0000 (---------------)  + I med
+	0x00209003, // n0x094a c0x0000 (---------------)  + I mil
+	0x0021fe03, // n0x094b c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x094c c0x0000 (---------------)  + I org
+	0x00220e43, // n0x094d c0x0000 (---------------)  + I pro
+	0x003a6543, // n0x094e c0x0000 (---------------)  + I aip
+	0x16233503, // n0x094f c0x0058 (n0x0958-n0x0959)  + I com
+	0x0023a783, // n0x0950 c0x0000 (---------------)  + I edu
+	0x002b9443, // n0x0951 c0x0000 (---------------)  + I fie
+	0x0026cc83, // n0x0952 c0x0000 (---------------)  + I gov
+	0x0027b703, // n0x0953 c0x0000 (---------------)  + I lib
+	0x00213ac3, // n0x0954 c0x0000 (---------------)  + I med
+	0x0022d1c3, // n0x0955 c0x0000 (---------------)  + I org
+	0x00204603, // n0x0956 c0x0000 (---------------)  + I pri
+	0x00320cc4, // n0x0957 c0x0000 (---------------)  + I riik
+	0x000ffa08, // n0x0958 c0x0000 (---------------)  +   blogspot
+	0x16a33503, // n0x0959 c0x005a (n0x0962-n0x0963)  + I com
+	0x0023a783, // n0x095a c0x0000 (---------------)  + I edu
+	0x002a7083, // n0x095b c0x0000 (---------------)  + I eun
+	0x0026cc83, // n0x095c c0x0000 (---------------)  + I gov
+	0x00209003, // n0x095d c0x0000 (---------------)  + I mil
+	0x00205284, // n0x095e c0x0000 (---------------)  + I name
+	0x0021fe03, // n0x095f c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x0960 c0x0000 (---------------)  + I org
+	0x0021d703, // n0x0961 c0x0000 (---------------)  + I sci
+	0x000ffa08, // n0x0962 c0x0000 (---------------)  +   blogspot
+	0x17233503, // n0x0963 c0x005c (n0x0968-n0x0969)  + I com
+	0x0023a783, // n0x0964 c0x0000 (---------------)  + I edu
+	0x00213183, // n0x0965 c0x0000 (---------------)  + I gob
+	0x00201483, // n0x0966 c0x0000 (---------------)  + I nom
+	0x0022d1c3, // n0x0967 c0x0000 (---------------)  + I org
+	0x000ffa08, // n0x0968 c0x0000 (---------------)  +   blogspot
+	0x00330b83, // n0x0969 c0x0000 (---------------)  + I biz
+	0x00233503, // n0x096a c0x0000 (---------------)  + I com
+	0x0023a783, // n0x096b c0x0000 (---------------)  + I edu
+	0x0026cc83, // n0x096c c0x0000 (---------------)  + I gov
+	0x003a1244, // n0x096d c0x0000 (---------------)  + I info
+	0x00205284, // n0x096e c0x0000 (---------------)  + I name
+	0x0021fe03, // n0x096f c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x0970 c0x0000 (---------------)  + I org
+	0x0031a845, // n0x0971 c0x0000 (---------------)  + I aland
+	0x000ffa08, // n0x0972 c0x0000 (---------------)  +   blogspot
+	0x0003be03, // n0x0973 c0x0000 (---------------)  +   iki
+	0x002ec408, // n0x0974 c0x0000 (---------------)  + I aeroport
+	0x00350d87, // n0x0975 c0x0000 (---------------)  + I assedic
+	0x002d4884, // n0x0976 c0x0000 (---------------)  + I asso
+	0x0032f106, // n0x0977 c0x0000 (---------------)  + I avocat
+	0x00346806, // n0x0978 c0x0000 (---------------)  + I avoues
+	0x000ffa08, // n0x0979 c0x0000 (---------------)  +   blogspot
+	0x0023fdc3, // n0x097a c0x0000 (---------------)  + I cci
+	0x00209b49, // n0x097b c0x0000 (---------------)  + I chambagri
+	0x002b2115, // n0x097c c0x0000 (---------------)  + I chirurgiens-dentistes
+	0x00233503, // n0x097d c0x0000 (---------------)  + I com
+	0x0031ee12, // n0x097e c0x0000 (---------------)  + I experts-comptables
+	0x0031ebcf, // n0x097f c0x0000 (---------------)  + I geometre-expert
+	0x0033d7c4, // n0x0980 c0x0000 (---------------)  + I gouv
+	0x0022a885, // n0x0981 c0x0000 (---------------)  + I greta
+	0x002f2f10, // n0x0982 c0x0000 (---------------)  + I huissier-justice
+	0x00238bc7, // n0x0983 c0x0000 (---------------)  + I medecin
+	0x00201483, // n0x0984 c0x0000 (---------------)  + I nom
+	0x0025c988, // n0x0985 c0x0000 (---------------)  + I notaires
+	0x0034d60a, // n0x0986 c0x0000 (---------------)  + I pharmacien
+	0x00246184, // n0x0987 c0x0000 (---------------)  + I port
+	0x002e1043, // n0x0988 c0x0000 (---------------)  + I prd
+	0x00247506, // n0x0989 c0x0000 (---------------)  + I presse
+	0x00200142, // n0x098a c0x0000 (---------------)  + I tm
+	0x002d1c8b, // n0x098b c0x0000 (---------------)  + I veterinaire
+	0x00233503, // n0x098c c0x0000 (---------------)  + I com
+	0x0023a783, // n0x098d c0x0000 (---------------)  + I edu
+	0x0026cc83, // n0x098e c0x0000 (---------------)  + I gov
+	0x00209003, // n0x098f c0x0000 (---------------)  + I mil
+	0x0021fe03, // n0x0990 c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x0991 c0x0000 (---------------)  + I org
+	0x002e5543, // n0x0992 c0x0000 (---------------)  + I pvt
+	0x00200742, // n0x0993 c0x0000 (---------------)  + I co
+	0x0021fe03, // n0x0994 c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x0995 c0x0000 (---------------)  + I org
+	0x00233503, // n0x0996 c0x0000 (---------------)  + I com
+	0x0023a783, // n0x0997 c0x0000 (---------------)  + I edu
+	0x0026cc83, // n0x0998 c0x0000 (---------------)  + I gov
+	0x00209003, // n0x0999 c0x0000 (---------------)  + I mil
+	0x0022d1c3, // n0x099a c0x0000 (---------------)  + I org
+	0x00233503, // n0x099b c0x0000 (---------------)  + I com
+	0x0023a783, // n0x099c c0x0000 (---------------)  + I edu
+	0x0026cc83, // n0x099d c0x0000 (---------------)  + I gov
+	0x00322cc3, // n0x099e c0x0000 (---------------)  + I ltd
+	0x00218303, // n0x099f c0x0000 (---------------)  + I mod
+	0x0022d1c3, // n0x09a0 c0x0000 (---------------)  + I org
+	0x00200742, // n0x09a1 c0x0000 (---------------)  + I co
+	0x00233503, // n0x09a2 c0x0000 (---------------)  + I com
+	0x0023a783, // n0x09a3 c0x0000 (---------------)  + I edu
+	0x0021fe03, // n0x09a4 c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x09a5 c0x0000 (---------------)  + I org
+	0x00201542, // n0x09a6 c0x0000 (---------------)  + I ac
+	0x00233503, // n0x09a7 c0x0000 (---------------)  + I com
+	0x0023a783, // n0x09a8 c0x0000 (---------------)  + I edu
+	0x0026cc83, // n0x09a9 c0x0000 (---------------)  + I gov
+	0x0021fe03, // n0x09aa c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x09ab c0x0000 (---------------)  + I org
+	0x002d4884, // n0x09ac c0x0000 (---------------)  + I asso
+	0x00233503, // n0x09ad c0x0000 (---------------)  + I com
+	0x0023a783, // n0x09ae c0x0000 (---------------)  + I edu
+	0x00207104, // n0x09af c0x0000 (---------------)  + I mobi
+	0x0021fe03, // n0x09b0 c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x09b1 c0x0000 (---------------)  + I org
+	0x000ffa08, // n0x09b2 c0x0000 (---------------)  +   blogspot
+	0x00233503, // n0x09b3 c0x0000 (---------------)  + I com
+	0x0023a783, // n0x09b4 c0x0000 (---------------)  + I edu
+	0x0026cc83, // n0x09b5 c0x0000 (---------------)  + I gov
+	0x0021fe03, // n0x09b6 c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x09b7 c0x0000 (---------------)  + I org
+	0x00233503, // n0x09b8 c0x0000 (---------------)  + I com
+	0x0023a783, // n0x09b9 c0x0000 (---------------)  + I edu
+	0x00213183, // n0x09ba c0x0000 (---------------)  + I gob
+	0x0021d883, // n0x09bb c0x0000 (---------------)  + I ind
+	0x00209003, // n0x09bc c0x0000 (---------------)  + I mil
+	0x0021fe03, // n0x09bd c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x09be c0x0000 (---------------)  + I org
+	0x00200742, // n0x09bf c0x0000 (---------------)  + I co
+	0x00233503, // n0x09c0 c0x0000 (---------------)  + I com
+	0x0023a783, // n0x09c1 c0x0000 (---------------)  + I edu
+	0x0026cc83, // n0x09c2 c0x0000 (---------------)  + I gov
+	0x0021fe03, // n0x09c3 c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x09c4 c0x0000 (---------------)  + I org
+	0x000ffa08, // n0x09c5 c0x0000 (---------------)  +   blogspot
+	0x00233503, // n0x09c6 c0x0000 (---------------)  + I com
+	0x0023a783, // n0x09c7 c0x0000 (---------------)  + I edu
+	0x0026cc83, // n0x09c8 c0x0000 (---------------)  + I gov
+	0x00317243, // n0x09c9 c0x0000 (---------------)  + I idv
+	0x0002e7c3, // n0x09ca c0x0000 (---------------)  +   inc
+	0x00122cc3, // n0x09cb c0x0000 (---------------)  +   ltd
+	0x0021fe03, // n0x09cc c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x09cd c0x0000 (---------------)  + I org
+	0x003029ca, // n0x09ce c0x0000 (---------------)  + I xn--55qx5d
+	0x0031bd89, // n0x09cf c0x0000 (---------------)  + I xn--ciqpn
+	0x0033ac4b, // n0x09d0 c0x0000 (---------------)  + I xn--gmq050i
+	0x0033b1ca, // n0x09d1 c0x0000 (---------------)  + I xn--gmqw5a
+	0x0034280a, // n0x09d2 c0x0000 (---------------)  + I xn--io0a7i
+	0x00353a8b, // n0x09d3 c0x0000 (---------------)  + I xn--lcvr32d
+	0x0036704a, // n0x09d4 c0x0000 (---------------)  + I xn--mk0axi
+	0x0036fa4a, // n0x09d5 c0x0000 (---------------)  + I xn--mxtq1m
+	0x0037648a, // n0x09d6 c0x0000 (---------------)  + I xn--od0alg
+	0x0037670b, // n0x09d7 c0x0000 (---------------)  + I xn--od0aq3b
+	0x00392609, // n0x09d8 c0x0000 (---------------)  + I xn--tn0ag
+	0x003941ca, // n0x09d9 c0x0000 (---------------)  + I xn--uc0atv
+	0x0039470b, // n0x09da c0x0000 (---------------)  + I xn--uc0ay4a
+	0x0039cfcb, // n0x09db c0x0000 (---------------)  + I xn--wcvs22d
+	0x003a57ca, // n0x09dc c0x0000 (---------------)  + I xn--zf0avx
+	0x00233503, // n0x09dd c0x0000 (---------------)  + I com
+	0x0023a783, // n0x09de c0x0000 (---------------)  + I edu
+	0x00213183, // n0x09df c0x0000 (---------------)  + I gob
+	0x00209003, // n0x09e0 c0x0000 (---------------)  + I mil
+	0x0021fe03, // n0x09e1 c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x09e2 c0x0000 (---------------)  + I org
+	0x000ffa08, // n0x09e3 c0x0000 (---------------)  +   blogspot
+	0x00233503, // n0x09e4 c0x0000 (---------------)  + I com
+	0x00263d84, // n0x09e5 c0x0000 (---------------)  + I from
+	0x00212582, // n0x09e6 c0x0000 (---------------)  + I iz
+	0x00205284, // n0x09e7 c0x0000 (---------------)  + I name
+	0x002a1985, // n0x09e8 c0x0000 (---------------)  + I adult
+	0x002011c3, // n0x09e9 c0x0000 (---------------)  + I art
+	0x002d4884, // n0x09ea c0x0000 (---------------)  + I asso
+	0x00233503, // n0x09eb c0x0000 (---------------)  + I com
+	0x0023d684, // n0x09ec c0x0000 (---------------)  + I coop
+	0x0023a783, // n0x09ed c0x0000 (---------------)  + I edu
+	0x0024d9c4, // n0x09ee c0x0000 (---------------)  + I firm
+	0x0033d7c4, // n0x09ef c0x0000 (---------------)  + I gouv
+	0x003a1244, // n0x09f0 c0x0000 (---------------)  + I info
+	0x00213ac3, // n0x09f1 c0x0000 (---------------)  + I med
+	0x0021fe03, // n0x09f2 c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x09f3 c0x0000 (---------------)  + I org
+	0x00295005, // n0x09f4 c0x0000 (---------------)  + I perso
+	0x00208103, // n0x09f5 c0x0000 (---------------)  + I pol
+	0x00220e43, // n0x09f6 c0x0000 (---------------)  + I pro
+	0x00285b43, // n0x09f7 c0x0000 (---------------)  + I rel
+	0x00352004, // n0x09f8 c0x0000 (---------------)  + I shop
+	0x002ee544, // n0x09f9 c0x0000 (---------------)  + I 2000
+	0x00258185, // n0x09fa c0x0000 (---------------)  + I agrar
+	0x000ffa08, // n0x09fb c0x0000 (---------------)  +   blogspot
+	0x002f9244, // n0x09fc c0x0000 (---------------)  + I bolt
+	0x0037bc46, // n0x09fd c0x0000 (---------------)  + I casino
+	0x00286744, // n0x09fe c0x0000 (---------------)  + I city
+	0x00200742, // n0x09ff c0x0000 (---------------)  + I co
+	0x00343507, // n0x0a00 c0x0000 (---------------)  + I erotica
+	0x00250887, // n0x0a01 c0x0000 (---------------)  + I erotika
+	0x0024b784, // n0x0a02 c0x0000 (---------------)  + I film
+	0x0025b085, // n0x0a03 c0x0000 (---------------)  + I forum
+	0x003700c5, // n0x0a04 c0x0000 (---------------)  + I games
+	0x00234dc5, // n0x0a05 c0x0000 (---------------)  + I hotel
+	0x003a1244, // n0x0a06 c0x0000 (---------------)  + I info
+	0x00224408, // n0x0a07 c0x0000 (---------------)  + I ingatlan
+	0x00293246, // n0x0a08 c0x0000 (---------------)  + I jogasz
+	0x002cce48, // n0x0a09 c0x0000 (---------------)  + I konyvelo
+	0x002435c5, // n0x0a0a c0x0000 (---------------)  + I lakas
+	0x003025c5, // n0x0a0b c0x0000 (---------------)  + I media
+	0x00221dc4, // n0x0a0c c0x0000 (---------------)  + I news
+	0x0022d1c3, // n0x0a0d c0x0000 (---------------)  + I org
+	0x002e1c44, // n0x0a0e c0x0000 (---------------)  + I priv
+	0x00352c46, // n0x0a0f c0x0000 (---------------)  + I reklam
+	0x00247603, // n0x0a10 c0x0000 (---------------)  + I sex
+	0x00352004, // n0x0a11 c0x0000 (---------------)  + I shop
+	0x00294905, // n0x0a12 c0x0000 (---------------)  + I sport
+	0x0023c004, // n0x0a13 c0x0000 (---------------)  + I suli
+	0x0020b984, // n0x0a14 c0x0000 (---------------)  + I szex
+	0x00200142, // n0x0a15 c0x0000 (---------------)  + I tm
+	0x00270746, // n0x0a16 c0x0000 (---------------)  + I tozsde
+	0x00389006, // n0x0a17 c0x0000 (---------------)  + I utazas
+	0x002f5685, // n0x0a18 c0x0000 (---------------)  + I video
+	0x00201542, // n0x0a19 c0x0000 (---------------)  + I ac
+	0x00330b83, // n0x0a1a c0x0000 (---------------)  + I biz
+	0x1c200742, // n0x0a1b c0x0070 (n0x0a24-n0x0a25)  + I co
+	0x0023bb04, // n0x0a1c c0x0000 (---------------)  + I desa
+	0x00202d42, // n0x0a1d c0x0000 (---------------)  + I go
+	0x00209003, // n0x0a1e c0x0000 (---------------)  + I mil
+	0x00226f02, // n0x0a1f c0x0000 (---------------)  + I my
+	0x0021fe03, // n0x0a20 c0x0000 (---------------)  + I net
+	0x00200282, // n0x0a21 c0x0000 (---------------)  + I or
+	0x00217443, // n0x0a22 c0x0000 (---------------)  + I sch
+	0x00221a03, // n0x0a23 c0x0000 (---------------)  + I web
+	0x000ffa08, // n0x0a24 c0x0000 (---------------)  +   blogspot
+	0x000ffa08, // n0x0a25 c0x0000 (---------------)  +   blogspot
+	0x0026cc83, // n0x0a26 c0x0000 (---------------)  + I gov
+	0x00201542, // n0x0a27 c0x0000 (---------------)  + I ac
+	0x1ce00742, // n0x0a28 c0x0073 (n0x0a2f-n0x0a30)  + I co
+	0x0026cc83, // n0x0a29 c0x0000 (---------------)  + I gov
+	0x00268a83, // n0x0a2a c0x0000 (---------------)  + I idf
+	0x00309ac3, // n0x0a2b c0x0000 (---------------)  + I k12
+	0x002335c4, // n0x0a2c c0x0000 (---------------)  + I muni
+	0x0021fe03, // n0x0a2d c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x0a2e c0x0000 (---------------)  + I org
+	0x000ffa08, // n0x0a2f c0x0000 (---------------)  +   blogspot
+	0x00201542, // n0x0a30 c0x0000 (---------------)  + I ac
+	0x1d600742, // n0x0a31 c0x0075 (n0x0a37-n0x0a39)  + I co
+	0x00233503, // n0x0a32 c0x0000 (---------------)  + I com
+	0x0021fe03, // n0x0a33 c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x0a34 c0x0000 (---------------)  + I org
+	0x0020e842, // n0x0a35 c0x0000 (---------------)  + I tt
+	0x00224e42, // n0x0a36 c0x0000 (---------------)  + I tv
+	0x00322cc3, // n0x0a37 c0x0000 (---------------)  + I ltd
+	0x002db143, // n0x0a38 c0x0000 (---------------)  + I plc
+	0x00201542, // n0x0a39 c0x0000 (---------------)  + I ac
+	0x000ffa08, // n0x0a3a c0x0000 (---------------)  +   blogspot
+	0x00200742, // n0x0a3b c0x0000 (---------------)  + I co
+	0x0023a783, // n0x0a3c c0x0000 (---------------)  + I edu
+	0x0024d9c4, // n0x0a3d c0x0000 (---------------)  + I firm
+	0x00205843, // n0x0a3e c0x0000 (---------------)  + I gen
+	0x0026cc83, // n0x0a3f c0x0000 (---------------)  + I gov
+	0x0021d883, // n0x0a40 c0x0000 (---------------)  + I ind
+	0x00209003, // n0x0a41 c0x0000 (---------------)  + I mil
+	0x0021fe03, // n0x0a42 c0x0000 (---------------)  + I net
+	0x00218f83, // n0x0a43 c0x0000 (---------------)  + I nic
+	0x0022d1c3, // n0x0a44 c0x0000 (---------------)  + I org
+	0x0021d683, // n0x0a45 c0x0000 (---------------)  + I res
+	0x0011e793, // n0x0a46 c0x0000 (---------------)  +   barrel-of-knowledge
+	0x001246d4, // n0x0a47 c0x0000 (---------------)  +   barrell-of-knowledge
+	0x00013886, // n0x0a48 c0x0000 (---------------)  +   dyndns
+	0x000562c7, // n0x0a49 c0x0000 (---------------)  +   for-our
+	0x00155d09, // n0x0a4a c0x0000 (---------------)  +   groks-the
+	0x000ebb0a, // n0x0a4b c0x0000 (---------------)  +   groks-this
+	0x00087c4d, // n0x0a4c c0x0000 (---------------)  +   here-for-more
+	0x001a408a, // n0x0a4d c0x0000 (---------------)  +   knowsitall
+	0x0006ba86, // n0x0a4e c0x0000 (---------------)  +   selfip
+	0x000eadc6, // n0x0a4f c0x0000 (---------------)  +   webhop
+	0x00204b82, // n0x0a50 c0x0000 (---------------)  + I eu
+	0x00233503, // n0x0a51 c0x0000 (---------------)  + I com
+	0x00019506, // n0x0a52 c0x0000 (---------------)  +   github
+	0x00155cc5, // n0x0a53 c0x0000 (---------------)  +   ngrok
+	0x0000cb83, // n0x0a54 c0x0000 (---------------)  +   nid
+	0x00011f88, // n0x0a55 c0x0000 (---------------)  +   pantheon
+	0x000af708, // n0x0a56 c0x0000 (---------------)  +   sandcats
+	0x00233503, // n0x0a57 c0x0000 (---------------)  + I com
+	0x0023a783, // n0x0a58 c0x0000 (---------------)  + I edu
+	0x0026cc83, // n0x0a59 c0x0000 (---------------)  + I gov
+	0x00209003, // n0x0a5a c0x0000 (---------------)  + I mil
+	0x0021fe03, // n0x0a5b c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x0a5c c0x0000 (---------------)  + I org
+	0x00201542, // n0x0a5d c0x0000 (---------------)  + I ac
+	0x00200742, // n0x0a5e c0x0000 (---------------)  + I co
+	0x0026cc83, // n0x0a5f c0x0000 (---------------)  + I gov
+	0x0020c782, // n0x0a60 c0x0000 (---------------)  + I id
+	0x0021fe03, // n0x0a61 c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x0a62 c0x0000 (---------------)  + I org
+	0x00217443, // n0x0a63 c0x0000 (---------------)  + I sch
+	0x0035d94f, // n0x0a64 c0x0000 (---------------)  + I xn--mgba3a4f16a
+	0x0035dd0e, // n0x0a65 c0x0000 (---------------)  + I xn--mgba3a4fra
+	0x000ffa08, // n0x0a66 c0x0000 (---------------)  +   blogspot
+	0x00233503, // n0x0a67 c0x0000 (---------------)  + I com
+	0x00048107, // n0x0a68 c0x0000 (---------------)  +   cupcake
+	0x0023a783, // n0x0a69 c0x0000 (---------------)  + I edu
+	0x0026cc83, // n0x0a6a c0x0000 (---------------)  + I gov
+	0x00201603, // n0x0a6b c0x0000 (---------------)  + I int
+	0x0021fe03, // n0x0a6c c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x0a6d c0x0000 (---------------)  + I org
+	0x0021ca03, // n0x0a6e c0x0000 (---------------)  + I abr
+	0x002ed6c7, // n0x0a6f c0x0000 (---------------)  + I abruzzo
+	0x00201002, // n0x0a70 c0x0000 (---------------)  + I ag
+	0x002cd4c9, // n0x0a71 c0x0000 (---------------)  + I agrigento
+	0x002001c2, // n0x0a72 c0x0000 (---------------)  + I al
+	0x00233b0b, // n0x0a73 c0x0000 (---------------)  + I alessandria
+	0x002dfc4a, // n0x0a74 c0x0000 (---------------)  + I alto-adige
+	0x002e3489, // n0x0a75 c0x0000 (---------------)  + I altoadige
+	0x00200502, // n0x0a76 c0x0000 (---------------)  + I an
+	0x00350806, // n0x0a77 c0x0000 (---------------)  + I ancona
+	0x002847d5, // n0x0a78 c0x0000 (---------------)  + I andria-barletta-trani
+	0x00233c55, // n0x0a79 c0x0000 (---------------)  + I andria-trani-barletta
+	0x00290513, // n0x0a7a c0x0000 (---------------)  + I andriabarlettatrani
+	0x002341d3, // n0x0a7b c0x0000 (---------------)  + I andriatranibarletta
+	0x002029c2, // n0x0a7c c0x0000 (---------------)  + I ao
+	0x00216fc5, // n0x0a7d c0x0000 (---------------)  + I aosta
+	0x0030f30c, // n0x0a7e c0x0000 (---------------)  + I aosta-valley
+	0x00216fcb, // n0x0a7f c0x0000 (---------------)  + I aostavalley
+	0x00251085, // n0x0a80 c0x0000 (---------------)  + I aoste
+	0x00200d02, // n0x0a81 c0x0000 (---------------)  + I ap
+	0x002003c2, // n0x0a82 c0x0000 (---------------)  + I aq
+	0x0036c346, // n0x0a83 c0x0000 (---------------)  + I aquila
+	0x00200a42, // n0x0a84 c0x0000 (---------------)  + I ar
+	0x0027a406, // n0x0a85 c0x0000 (---------------)  + I arezzo
+	0x00397ccd, // n0x0a86 c0x0000 (---------------)  + I ascoli-piceno
+	0x0034c1cc, // n0x0a87 c0x0000 (---------------)  + I ascolipiceno
+	0x0021e884, // n0x0a88 c0x0000 (---------------)  + I asti
+	0x00200102, // n0x0a89 c0x0000 (---------------)  + I at
+	0x00203402, // n0x0a8a c0x0000 (---------------)  + I av
+	0x00224c08, // n0x0a8b c0x0000 (---------------)  + I avellino
+	0x00202002, // n0x0a8c c0x0000 (---------------)  + I ba
+	0x00248586, // n0x0a8d c0x0000 (---------------)  + I balsan
+	0x00249204, // n0x0a8e c0x0000 (---------------)  + I bari
+	0x00284995, // n0x0a8f c0x0000 (---------------)  + I barletta-trani-andria
+	0x00290693, // n0x0a90 c0x0000 (---------------)  + I barlettatraniandria
+	0x00207fc3, // n0x0a91 c0x0000 (---------------)  + I bas
+	0x0032ee0a, // n0x0a92 c0x0000 (---------------)  + I basilicata
+	0x0028e2c7, // n0x0a93 c0x0000 (---------------)  + I belluno
+	0x002e4949, // n0x0a94 c0x0000 (---------------)  + I benevento
+	0x00228d47, // n0x0a95 c0x0000 (---------------)  + I bergamo
+	0x002ee482, // n0x0a96 c0x0000 (---------------)  + I bg
+	0x00200002, // n0x0a97 c0x0000 (---------------)  + I bi
+	0x003a4cc6, // n0x0a98 c0x0000 (---------------)  + I biella
+	0x0020c8c2, // n0x0a99 c0x0000 (---------------)  + I bl
+	0x000ffa08, // n0x0a9a c0x0000 (---------------)  +   blogspot
+	0x002104c2, // n0x0a9b c0x0000 (---------------)  + I bn
+	0x0020e402, // n0x0a9c c0x0000 (---------------)  + I bo
+	0x0038df47, // n0x0a9d c0x0000 (---------------)  + I bologna
+	0x0020fec7, // n0x0a9e c0x0000 (---------------)  + I bolzano
+	0x0021c105, // n0x0a9f c0x0000 (---------------)  + I bozen
+	0x0021c402, // n0x0aa0 c0x0000 (---------------)  + I br
+	0x0021d647, // n0x0aa1 c0x0000 (---------------)  + I brescia
+	0x0021d808, // n0x0aa2 c0x0000 (---------------)  + I brindisi
+	0x00237542, // n0x0aa3 c0x0000 (---------------)  + I bs
+	0x0021fd02, // n0x0aa4 c0x0000 (---------------)  + I bt
+	0x00230bc2, // n0x0aa5 c0x0000 (---------------)  + I bz
+	0x00200302, // n0x0aa6 c0x0000 (---------------)  + I ca
+	0x0023eb48, // n0x0aa7 c0x0000 (---------------)  + I cagliari
+	0x00213543, // n0x0aa8 c0x0000 (---------------)  + I cal
+	0x00285688, // n0x0aa9 c0x0000 (---------------)  + I calabria
+	0x0023ad8d, // n0x0aaa c0x0000 (---------------)  + I caltanissetta
+	0x00221ac3, // n0x0aab c0x0000 (---------------)  + I cam
+	0x00316e08, // n0x0aac c0x0000 (---------------)  + I campania
+	0x00241acf, // n0x0aad c0x0000 (---------------)  + I campidano-medio
+	0x00241e8e, // n0x0aae c0x0000 (---------------)  + I campidanomedio
+	0x0034364a, // n0x0aaf c0x0000 (---------------)  + I campobasso
+	0x002f6e11, // n0x0ab0 c0x0000 (---------------)  + I carbonia-iglesias
+	0x002f7290, // n0x0ab1 c0x0000 (---------------)  + I carboniaiglesias
+	0x002b3b4d, // n0x0ab2 c0x0000 (---------------)  + I carrara-massa
+	0x002b3e8c, // n0x0ab3 c0x0000 (---------------)  + I carraramassa
+	0x0022c607, // n0x0ab4 c0x0000 (---------------)  + I caserta
+	0x0032ef87, // n0x0ab5 c0x0000 (---------------)  + I catania
+	0x0032f1c9, // n0x0ab6 c0x0000 (---------------)  + I catanzaro
+	0x0021e982, // n0x0ab7 c0x0000 (---------------)  + I cb
+	0x00200b42, // n0x0ab8 c0x0000 (---------------)  + I ce
+	0x0025870c, // n0x0ab9 c0x0000 (---------------)  + I cesena-forli
+	0x00258a0b, // n0x0aba c0x0000 (---------------)  + I cesenaforli
+	0x00201582, // n0x0abb c0x0000 (---------------)  + I ch
+	0x002d5a46, // n0x0abc c0x0000 (---------------)  + I chieti
+	0x00200682, // n0x0abd c0x0000 (---------------)  + I ci
+	0x00209182, // n0x0abe c0x0000 (---------------)  + I cl
+	0x0021ba42, // n0x0abf c0x0000 (---------------)  + I cn
+	0x00200742, // n0x0ac0 c0x0000 (---------------)  + I co
+	0x00234804, // n0x0ac1 c0x0000 (---------------)  + I como
+	0x00240e07, // n0x0ac2 c0x0000 (---------------)  + I cosenza
+	0x002049c2, // n0x0ac3 c0x0000 (---------------)  + I cr
+	0x00244d07, // n0x0ac4 c0x0000 (---------------)  + I cremona
+	0x00245f87, // n0x0ac5 c0x0000 (---------------)  + I crotone
+	0x00211c82, // n0x0ac6 c0x0000 (---------------)  + I cs
+	0x00231382, // n0x0ac7 c0x0000 (---------------)  + I ct
+	0x00247fc5, // n0x0ac8 c0x0000 (---------------)  + I cuneo
+	0x00229ec2, // n0x0ac9 c0x0000 (---------------)  + I cz
+	0x0025a38e, // n0x0aca c0x0000 (---------------)  + I dell-ogliastra
+	0x0026714d, // n0x0acb c0x0000 (---------------)  + I dellogliastra
+	0x0023a783, // n0x0acc c0x0000 (---------------)  + I edu
+	0x002543ce, // n0x0acd c0x0000 (---------------)  + I emilia-romagna
+	0x0036dc0d, // n0x0ace c0x0000 (---------------)  + I emiliaromagna
+	0x00360a83, // n0x0acf c0x0000 (---------------)  + I emr
+	0x00202bc2, // n0x0ad0 c0x0000 (---------------)  + I en
+	0x00205a84, // n0x0ad1 c0x0000 (---------------)  + I enna
+	0x0024b242, // n0x0ad2 c0x0000 (---------------)  + I fc
+	0x0020b302, // n0x0ad3 c0x0000 (---------------)  + I fe
+	0x002e2545, // n0x0ad4 c0x0000 (---------------)  + I fermo
+	0x00300807, // n0x0ad5 c0x0000 (---------------)  + I ferrara
+	0x0035d282, // n0x0ad6 c0x0000 (---------------)  + I fg
+	0x00207502, // n0x0ad7 c0x0000 (---------------)  + I fi
+	0x0024d307, // n0x0ad8 c0x0000 (---------------)  + I firenze
+	0x00252748, // n0x0ad9 c0x0000 (---------------)  + I florence
+	0x00242902, // n0x0ada c0x0000 (---------------)  + I fm
+	0x003a12c6, // n0x0adb c0x0000 (---------------)  + I foggia
+	0x0025858c, // n0x0adc c0x0000 (---------------)  + I forli-cesena
+	0x002588cb, // n0x0add c0x0000 (---------------)  + I forlicesena
+	0x00200582, // n0x0ade c0x0000 (---------------)  + I fr
+	0x0026050f, // n0x0adf c0x0000 (---------------)  + I friuli-v-giulia
+	0x002608d0, // n0x0ae0 c0x0000 (---------------)  + I friuli-ve-giulia
+	0x00260ccf, // n0x0ae1 c0x0000 (---------------)  + I friuli-vegiulia
+	0x00261095, // n0x0ae2 c0x0000 (---------------)  + I friuli-venezia-giulia
+	0x002615d4, // n0x0ae3 c0x0000 (---------------)  + I friuli-veneziagiulia
+	0x00261ace, // n0x0ae4 c0x0000 (---------------)  + I friuli-vgiulia
+	0x00261e4e, // n0x0ae5 c0x0000 (---------------)  + I friuliv-giulia
+	0x002621cf, // n0x0ae6 c0x0000 (---------------)  + I friulive-giulia
+	0x0026258e, // n0x0ae7 c0x0000 (---------------)  + I friulivegiulia
+	0x00262914, // n0x0ae8 c0x0000 (---------------)  + I friulivenezia-giulia
+	0x00262e13, // n0x0ae9 c0x0000 (---------------)  + I friuliveneziagiulia
+	0x002632cd, // n0x0aea c0x0000 (---------------)  + I friulivgiulia
+	0x002767c9, // n0x0aeb c0x0000 (---------------)  + I frosinone
+	0x00288803, // n0x0aec c0x0000 (---------------)  + I fvg
+	0x002026c2, // n0x0aed c0x0000 (---------------)  + I ge
+	0x00307105, // n0x0aee c0x0000 (---------------)  + I genoa
+	0x00205846, // n0x0aef c0x0000 (---------------)  + I genova
+	0x00202d42, // n0x0af0 c0x0000 (---------------)  + I go
+	0x0026edc7, // n0x0af1 c0x0000 (---------------)  + I gorizia
+	0x0026cc83, // n0x0af2 c0x0000 (---------------)  + I gov
+	0x00200c82, // n0x0af3 c0x0000 (---------------)  + I gr
+	0x00311b48, // n0x0af4 c0x0000 (---------------)  + I grosseto
+	0x002f7051, // n0x0af5 c0x0000 (---------------)  + I iglesias-carbonia
+	0x002f7490, // n0x0af6 c0x0000 (---------------)  + I iglesiascarbonia
+	0x00205c42, // n0x0af7 c0x0000 (---------------)  + I im
+	0x00352747, // n0x0af8 c0x0000 (---------------)  + I imperia
+	0x002006c2, // n0x0af9 c0x0000 (---------------)  + I is
+	0x0025dc87, // n0x0afa c0x0000 (---------------)  + I isernia
+	0x00206fc2, // n0x0afb c0x0000 (---------------)  + I kr
+	0x0025e389, // n0x0afc c0x0000 (---------------)  + I la-spezia
+	0x0036c307, // n0x0afd c0x0000 (---------------)  + I laquila
+	0x0025fe48, // n0x0afe c0x0000 (---------------)  + I laspezia
+	0x00223606, // n0x0aff c0x0000 (---------------)  + I latina
+	0x002db043, // n0x0b00 c0x0000 (---------------)  + I laz
+	0x00309045, // n0x0b01 c0x0000 (---------------)  + I lazio
+	0x0023aa02, // n0x0b02 c0x0000 (---------------)  + I lc
+	0x0020acc2, // n0x0b03 c0x0000 (---------------)  + I le
+	0x003a50c5, // n0x0b04 c0x0000 (---------------)  + I lecce
+	0x0022e105, // n0x0b05 c0x0000 (---------------)  + I lecco
+	0x00207202, // n0x0b06 c0x0000 (---------------)  + I li
+	0x0023c083, // n0x0b07 c0x0000 (---------------)  + I lig
+	0x0023c087, // n0x0b08 c0x0000 (---------------)  + I liguria
+	0x00210307, // n0x0b09 c0x0000 (---------------)  + I livorno
+	0x00200242, // n0x0b0a c0x0000 (---------------)  + I lo
+	0x00259dc4, // n0x0b0b c0x0000 (---------------)  + I lodi
+	0x00214303, // n0x0b0c c0x0000 (---------------)  + I lom
+	0x002c4149, // n0x0b0d c0x0000 (---------------)  + I lombardia
+	0x002db908, // n0x0b0e c0x0000 (---------------)  + I lombardy
+	0x00209e02, // n0x0b0f c0x0000 (---------------)  + I lt
+	0x00202f42, // n0x0b10 c0x0000 (---------------)  + I lu
+	0x0026d147, // n0x0b11 c0x0000 (---------------)  + I lucania
+	0x002b6305, // n0x0b12 c0x0000 (---------------)  + I lucca
+	0x00316908, // n0x0b13 c0x0000 (---------------)  + I macerata
+	0x003a0a07, // n0x0b14 c0x0000 (---------------)  + I mantova
+	0x00201183, // n0x0b15 c0x0000 (---------------)  + I mar
+	0x00284246, // n0x0b16 c0x0000 (---------------)  + I marche
+	0x002b39cd, // n0x0b17 c0x0000 (---------------)  + I massa-carrara
+	0x002b3d4c, // n0x0b18 c0x0000 (---------------)  + I massacarrara
+	0x00256e86, // n0x0b19 c0x0000 (---------------)  + I matera
+	0x00208602, // n0x0b1a c0x0000 (---------------)  + I mb
+	0x0022ac02, // n0x0b1b c0x0000 (---------------)  + I mc
+	0x00203e82, // n0x0b1c c0x0000 (---------------)  + I me
+	0x0024194f, // n0x0b1d c0x0000 (---------------)  + I medio-campidano
+	0x00241d4e, // n0x0b1e c0x0000 (---------------)  + I mediocampidano
+	0x00370147, // n0x0b1f c0x0000 (---------------)  + I messina
+	0x00209002, // n0x0b20 c0x0000 (---------------)  + I mi
+	0x00342685, // n0x0b21 c0x0000 (---------------)  + I milan
+	0x00342686, // n0x0b22 c0x0000 (---------------)  + I milano
+	0x0021fdc2, // n0x0b23 c0x0000 (---------------)  + I mn
+	0x00207102, // n0x0b24 c0x0000 (---------------)  + I mo
+	0x00218306, // n0x0b25 c0x0000 (---------------)  + I modena
+	0x002133c3, // n0x0b26 c0x0000 (---------------)  + I mol
+	0x0025dbc6, // n0x0b27 c0x0000 (---------------)  + I molise
+	0x002c2d45, // n0x0b28 c0x0000 (---------------)  + I monza
+	0x002c2d4d, // n0x0b29 c0x0000 (---------------)  + I monza-brianza
+	0x002c3595, // n0x0b2a c0x0000 (---------------)  + I monza-e-della-brianza
+	0x002c3d4c, // n0x0b2b c0x0000 (---------------)  + I monzabrianza
+	0x002c4a4d, // n0x0b2c c0x0000 (---------------)  + I monzaebrianza
+	0x002c4e12, // n0x0b2d c0x0000 (---------------)  + I monzaedellabrianza
+	0x0020f702, // n0x0b2e c0x0000 (---------------)  + I ms
+	0x00204c02, // n0x0b2f c0x0000 (---------------)  + I mt
+	0x00201402, // n0x0b30 c0x0000 (---------------)  + I na
+	0x00235006, // n0x0b31 c0x0000 (---------------)  + I naples
+	0x002a3d86, // n0x0b32 c0x0000 (---------------)  + I napoli
+	0x00200c02, // n0x0b33 c0x0000 (---------------)  + I no
+	0x002058c6, // n0x0b34 c0x0000 (---------------)  + I novara
+	0x002017c2, // n0x0b35 c0x0000 (---------------)  + I nu
+	0x0039c105, // n0x0b36 c0x0000 (---------------)  + I nuoro
+	0x00200c42, // n0x0b37 c0x0000 (---------------)  + I og
+	0x0025a4c9, // n0x0b38 c0x0000 (---------------)  + I ogliastra
+	0x0027568c, // n0x0b39 c0x0000 (---------------)  + I olbia-tempio
+	0x002759cb, // n0x0b3a c0x0000 (---------------)  + I olbiatempio
+	0x00200282, // n0x0b3b c0x0000 (---------------)  + I or
+	0x00252b88, // n0x0b3c c0x0000 (---------------)  + I oristano
+	0x00200782, // n0x0b3d c0x0000 (---------------)  + I ot
+	0x0020ac42, // n0x0b3e c0x0000 (---------------)  + I pa
+	0x00216d86, // n0x0b3f c0x0000 (---------------)  + I padova
+	0x00361405, // n0x0b40 c0x0000 (---------------)  + I padua
+	0x00379f47, // n0x0b41 c0x0000 (---------------)  + I palermo
+	0x00395345, // n0x0b42 c0x0000 (---------------)  + I parma
+	0x002dbfc5, // n0x0b43 c0x0000 (---------------)  + I pavia
+	0x00248182, // n0x0b44 c0x0000 (---------------)  + I pc
+	0x00352102, // n0x0b45 c0x0000 (---------------)  + I pd
+	0x00207782, // n0x0b46 c0x0000 (---------------)  + I pe
+	0x00270d47, // n0x0b47 c0x0000 (---------------)  + I perugia
+	0x0031c84d, // n0x0b48 c0x0000 (---------------)  + I pesaro-urbino
+	0x0031cbcc, // n0x0b49 c0x0000 (---------------)  + I pesarourbino
+	0x00236987, // n0x0b4a c0x0000 (---------------)  + I pescara
+	0x002495c2, // n0x0b4b c0x0000 (---------------)  + I pg
+	0x00225702, // n0x0b4c c0x0000 (---------------)  + I pi
+	0x00338288, // n0x0b4d c0x0000 (---------------)  + I piacenza
+	0x00258dc8, // n0x0b4e c0x0000 (---------------)  + I piedmont
+	0x002d6308, // n0x0b4f c0x0000 (---------------)  + I piemonte
+	0x002df704, // n0x0b50 c0x0000 (---------------)  + I pisa
+	0x002bee07, // n0x0b51 c0x0000 (---------------)  + I pistoia
+	0x002dcc83, // n0x0b52 c0x0000 (---------------)  + I pmn
+	0x002493c2, // n0x0b53 c0x0000 (---------------)  + I pn
+	0x00200942, // n0x0b54 c0x0000 (---------------)  + I po
+	0x002dfec9, // n0x0b55 c0x0000 (---------------)  + I pordenone
+	0x002093c7, // n0x0b56 c0x0000 (---------------)  + I potenza
+	0x00204602, // n0x0b57 c0x0000 (---------------)  + I pr
+	0x00270245, // n0x0b58 c0x0000 (---------------)  + I prato
+	0x0028c9c2, // n0x0b59 c0x0000 (---------------)  + I pt
+	0x00235302, // n0x0b5a c0x0000 (---------------)  + I pu
+	0x00278843, // n0x0b5b c0x0000 (---------------)  + I pug
+	0x00278846, // n0x0b5c c0x0000 (---------------)  + I puglia
+	0x002e5542, // n0x0b5d c0x0000 (---------------)  + I pv
+	0x002e6302, // n0x0b5e c0x0000 (---------------)  + I pz
+	0x002005c2, // n0x0b5f c0x0000 (---------------)  + I ra
+	0x0030c246, // n0x0b60 c0x0000 (---------------)  + I ragusa
+	0x002059c7, // n0x0b61 c0x0000 (---------------)  + I ravenna
+	0x002002c2, // n0x0b62 c0x0000 (---------------)  + I rc
+	0x00207002, // n0x0b63 c0x0000 (---------------)  + I re
+	0x002ed34f, // n0x0b64 c0x0000 (---------------)  + I reggio-calabria
+	0x0025420d, // n0x0b65 c0x0000 (---------------)  + I reggio-emilia
+	0x0028550e, // n0x0b66 c0x0000 (---------------)  + I reggiocalabria
+	0x0036da8c, // n0x0b67 c0x0000 (---------------)  + I reggioemilia
+	0x0020ce02, // n0x0b68 c0x0000 (---------------)  + I rg
+	0x00200a82, // n0x0b69 c0x0000 (---------------)  + I ri
+	0x00223445, // n0x0b6a c0x0000 (---------------)  + I rieti
+	0x003a5bc6, // n0x0b6b c0x0000 (---------------)  + I rimini
+	0x00222182, // n0x0b6c c0x0000 (---------------)  + I rm
+	0x0020cb42, // n0x0b6d c0x0000 (---------------)  + I rn
+	0x00202202, // n0x0b6e c0x0000 (---------------)  + I ro
+	0x00254584, // n0x0b6f c0x0000 (---------------)  + I roma
+	0x002dd584, // n0x0b70 c0x0000 (---------------)  + I rome
+	0x00334fc6, // n0x0b71 c0x0000 (---------------)  + I rovigo
+	0x002004c2, // n0x0b72 c0x0000 (---------------)  + I sa
+	0x00279747, // n0x0b73 c0x0000 (---------------)  + I salerno
+	0x002257c3, // n0x0b74 c0x0000 (---------------)  + I sar
+	0x00226048, // n0x0b75 c0x0000 (---------------)  + I sardegna
+	0x00227248, // n0x0b76 c0x0000 (---------------)  + I sardinia
+	0x00378687, // n0x0b77 c0x0000 (---------------)  + I sassari
+	0x00234f06, // n0x0b78 c0x0000 (---------------)  + I savona
+	0x0020a402, // n0x0b79 c0x0000 (---------------)  + I si
+	0x0023eac3, // n0x0b7a c0x0000 (---------------)  + I sic
+	0x0036e647, // n0x0b7b c0x0000 (---------------)  + I sicilia
+	0x00252146, // n0x0b7c c0x0000 (---------------)  + I sicily
+	0x002c8945, // n0x0b7d c0x0000 (---------------)  + I siena
+	0x003419c8, // n0x0b7e c0x0000 (---------------)  + I siracusa
+	0x00205682, // n0x0b7f c0x0000 (---------------)  + I so
+	0x00308547, // n0x0b80 c0x0000 (---------------)  + I sondrio
+	0x00209382, // n0x0b81 c0x0000 (---------------)  + I sp
+	0x0033b802, // n0x0b82 c0x0000 (---------------)  + I sr
+	0x002067c2, // n0x0b83 c0x0000 (---------------)  + I ss
+	0x002cebc9, // n0x0b84 c0x0000 (---------------)  + I suedtirol
+	0x00235f42, // n0x0b85 c0x0000 (---------------)  + I sv
+	0x00200a02, // n0x0b86 c0x0000 (---------------)  + I ta
+	0x00234603, // n0x0b87 c0x0000 (---------------)  + I taa
+	0x003096c7, // n0x0b88 c0x0000 (---------------)  + I taranto
+	0x002012c2, // n0x0b89 c0x0000 (---------------)  + I te
+	0x0027580c, // n0x0b8a c0x0000 (---------------)  + I tempio-olbia
+	0x00275b0b, // n0x0b8b c0x0000 (---------------)  + I tempioolbia
+	0x00256f06, // n0x0b8c c0x0000 (---------------)  + I teramo
+	0x0020cac5, // n0x0b8d c0x0000 (---------------)  + I terni
+	0x0024f882, // n0x0b8e c0x0000 (---------------)  + I tn
+	0x00208082, // n0x0b8f c0x0000 (---------------)  + I to
+	0x002b1946, // n0x0b90 c0x0000 (---------------)  + I torino
+	0x002280c3, // n0x0b91 c0x0000 (---------------)  + I tos
+	0x00324e47, // n0x0b92 c0x0000 (---------------)  + I toscana
+	0x00211f42, // n0x0b93 c0x0000 (---------------)  + I tp
+	0x00203002, // n0x0b94 c0x0000 (---------------)  + I tr
+	0x00284655, // n0x0b95 c0x0000 (---------------)  + I trani-andria-barletta
+	0x00233e15, // n0x0b96 c0x0000 (---------------)  + I trani-barletta-andria
+	0x002903d3, // n0x0b97 c0x0000 (---------------)  + I traniandriabarletta
+	0x00234353, // n0x0b98 c0x0000 (---------------)  + I tranibarlettaandria
+	0x00294a07, // n0x0b99 c0x0000 (---------------)  + I trapani
+	0x002b7688, // n0x0b9a c0x0000 (---------------)  + I trentino
+	0x002cf4d0, // n0x0b9b c0x0000 (---------------)  + I trentino-a-adige
+	0x002ef2cf, // n0x0b9c c0x0000 (---------------)  + I trentino-aadige
+	0x00342d53, // n0x0b9d c0x0000 (---------------)  + I trentino-alto-adige
+	0x0034eb92, // n0x0b9e c0x0000 (---------------)  + I trentino-altoadige
+	0x002cd090, // n0x0b9f c0x0000 (---------------)  + I trentino-s-tirol
+	0x002b768f, // n0x0ba0 c0x0000 (---------------)  + I trentino-stirol
+	0x002ba492, // n0x0ba1 c0x0000 (---------------)  + I trentino-sud-tirol
+	0x002c2911, // n0x0ba2 c0x0000 (---------------)  + I trentino-sudtirol
+	0x002ca953, // n0x0ba3 c0x0000 (---------------)  + I trentino-sued-tirol
+	0x002ce992, // n0x0ba4 c0x0000 (---------------)  + I trentino-suedtirol
+	0x002cfd4f, // n0x0ba5 c0x0000 (---------------)  + I trentinoa-adige
+	0x002d4c8e, // n0x0ba6 c0x0000 (---------------)  + I trentinoaadige
+	0x002dfa52, // n0x0ba7 c0x0000 (---------------)  + I trentinoalto-adige
+	0x002e3291, // n0x0ba8 c0x0000 (---------------)  + I trentinoaltoadige
+	0x002e3a8f, // n0x0ba9 c0x0000 (---------------)  + I trentinos-tirol
+	0x002e55ce, // n0x0baa c0x0000 (---------------)  + I trentinostirol
+	0x002e6691, // n0x0bab c0x0000 (---------------)  + I trentinosud-tirol
+	0x002f3a90, // n0x0bac c0x0000 (---------------)  + I trentinosudtirol
+	0x0035a592, // n0x0bad c0x0000 (---------------)  + I trentinosued-tirol
+	0x002e8b91, // n0x0bae c0x0000 (---------------)  + I trentinosuedtirol
+	0x002f8a86, // n0x0baf c0x0000 (---------------)  + I trento
+	0x002f9307, // n0x0bb0 c0x0000 (---------------)  + I treviso
+	0x003673c7, // n0x0bb1 c0x0000 (---------------)  + I trieste
+	0x00203f42, // n0x0bb2 c0x0000 (---------------)  + I ts
+	0x0027f145, // n0x0bb3 c0x0000 (---------------)  + I turin
+	0x002f2c87, // n0x0bb4 c0x0000 (---------------)  + I tuscany
+	0x00224e42, // n0x0bb5 c0x0000 (---------------)  + I tv
+	0x00209242, // n0x0bb6 c0x0000 (---------------)  + I ud
+	0x0022a285, // n0x0bb7 c0x0000 (---------------)  + I udine
+	0x0021e183, // n0x0bb8 c0x0000 (---------------)  + I umb
+	0x00258406, // n0x0bb9 c0x0000 (---------------)  + I umbria
+	0x0031ca0d, // n0x0bba c0x0000 (---------------)  + I urbino-pesaro
+	0x0031cd4c, // n0x0bbb c0x0000 (---------------)  + I urbinopesaro
+	0x002000c2, // n0x0bbc c0x0000 (---------------)  + I va
+	0x0030f18b, // n0x0bbd c0x0000 (---------------)  + I val-d-aosta
+	0x00216e8a, // n0x0bbe c0x0000 (---------------)  + I val-daosta
+	0x00323dca, // n0x0bbf c0x0000 (---------------)  + I vald-aosta
+	0x002b09c9, // n0x0bc0 c0x0000 (---------------)  + I valdaosta
+	0x002deb4b, // n0x0bc1 c0x0000 (---------------)  + I valle-aosta
+	0x003a0b4d, // n0x0bc2 c0x0000 (---------------)  + I valle-d-aosta
+	0x002f338c, // n0x0bc3 c0x0000 (---------------)  + I valle-daosta
+	0x00224e8a, // n0x0bc4 c0x0000 (---------------)  + I valleaosta
+	0x0022594c, // n0x0bc5 c0x0000 (---------------)  + I valled-aosta
+	0x0024098b, // n0x0bc6 c0x0000 (---------------)  + I valledaosta
+	0x00250ecc, // n0x0bc7 c0x0000 (---------------)  + I vallee-aoste
+	0x0025184b, // n0x0bc8 c0x0000 (---------------)  + I valleeaoste
+	0x00275603, // n0x0bc9 c0x0000 (---------------)  + I vao
+	0x002894c6, // n0x0bca c0x0000 (---------------)  + I varese
+	0x002dc5c2, // n0x0bcb c0x0000 (---------------)  + I vb
+	0x002e6b02, // n0x0bcc c0x0000 (---------------)  + I vc
+	0x00210243, // n0x0bcd c0x0000 (---------------)  + I vda
+	0x00202b82, // n0x0bce c0x0000 (---------------)  + I ve
+	0x00202b83, // n0x0bcf c0x0000 (---------------)  + I ven
+	0x00375e46, // n0x0bd0 c0x0000 (---------------)  + I veneto
+	0x00261247, // n0x0bd1 c0x0000 (---------------)  + I venezia
+	0x0026f246, // n0x0bd2 c0x0000 (---------------)  + I venice
+	0x0022d688, // n0x0bd3 c0x0000 (---------------)  + I verbania
+	0x002dddc8, // n0x0bd4 c0x0000 (---------------)  + I vercelli
+	0x003607c6, // n0x0bd5 c0x0000 (---------------)  + I verona
+	0x00205d42, // n0x0bd6 c0x0000 (---------------)  + I vi
+	0x002f504d, // n0x0bd7 c0x0000 (---------------)  + I vibo-valentia
+	0x002f538c, // n0x0bd8 c0x0000 (---------------)  + I vibovalentia
+	0x0033d887, // n0x0bd9 c0x0000 (---------------)  + I vicenza
+	0x002f9107, // n0x0bda c0x0000 (---------------)  + I viterbo
+	0x00211082, // n0x0bdb c0x0000 (---------------)  + I vr
+	0x00227982, // n0x0bdc c0x0000 (---------------)  + I vs
+	0x00271f82, // n0x0bdd c0x0000 (---------------)  + I vt
+	0x00214982, // n0x0bde c0x0000 (---------------)  + I vv
+	0x00200742, // n0x0bdf c0x0000 (---------------)  + I co
+	0x0021fe03, // n0x0be0 c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x0be1 c0x0000 (---------------)  + I org
+	0x00233503, // n0x0be2 c0x0000 (---------------)  + I com
+	0x0023a783, // n0x0be3 c0x0000 (---------------)  + I edu
+	0x0026cc83, // n0x0be4 c0x0000 (---------------)  + I gov
+	0x00209003, // n0x0be5 c0x0000 (---------------)  + I mil
+	0x00205284, // n0x0be6 c0x0000 (---------------)  + I name
+	0x0021fe03, // n0x0be7 c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x0be8 c0x0000 (---------------)  + I org
+	0x00217443, // n0x0be9 c0x0000 (---------------)  + I sch
+	0x00201542, // n0x0bea c0x0000 (---------------)  + I ac
+	0x00200342, // n0x0beb c0x0000 (---------------)  + I ad
+	0x2068f505, // n0x0bec c0x0081 (n0x0c59-n0x0c8d)  + I aichi
+	0x20a01dc5, // n0x0bed c0x0082 (n0x0c8d-n0x0ca9)  + I akita
+	0x20f0bf06, // n0x0bee c0x0083 (n0x0ca9-n0x0cbf)  + I aomori
+	0x000ffa08, // n0x0bef c0x0000 (---------------)  +   blogspot
+	0x212add45, // n0x0bf0 c0x0084 (n0x0cbf-n0x0cf9)  + I chiba
+	0x00200742, // n0x0bf1 c0x0000 (---------------)  + I co
+	0x00202602, // n0x0bf2 c0x0000 (---------------)  + I ed
+	0x21629005, // n0x0bf3 c0x0085 (n0x0cf9-n0x0d0f)  + I ehime
+	0x21a7dac5, // n0x0bf4 c0x0086 (n0x0d0f-n0x0d1e)  + I fukui
+	0x21e7e807, // n0x0bf5 c0x0087 (n0x0d1e-n0x0d5d)  + I fukuoka
+	0x2232fcc9, // n0x0bf6 c0x0088 (n0x0d5d-n0x0d90)  + I fukushima
+	0x2276aec4, // n0x0bf7 c0x0089 (n0x0d90-n0x0db6)  + I gifu
+	0x00202d42, // n0x0bf8 c0x0000 (---------------)  + I go
+	0x00200c82, // n0x0bf9 c0x0000 (---------------)  + I gr
+	0x22b66385, // n0x0bfa c0x008a (n0x0db6-n0x0dda)  + I gunma
+	0x22e0ee49, // n0x0bfb c0x008b (n0x0dda-n0x0df3)  + I hiroshima
+	0x23369e88, // n0x0bfc c0x008c (n0x0df3-n0x0e81)  + I hokkaido
+	0x236aba85, // n0x0bfd c0x008d (n0x0e81-n0x0eaf)  + I hyogo
+	0x23ac1ac7, // n0x0bfe c0x008e (n0x0eaf-n0x0ee2)  + I ibaraki
+	0x23e1a4c8, // n0x0bff c0x008f (n0x0ee2-n0x0ef5)  + I ishikawa
+	0x242d8485, // n0x0c00 c0x0090 (n0x0ef5-n0x0f17)  + I iwate
+	0x24600fc6, // n0x0c01 c0x0091 (n0x0f17-n0x0f26)  + I kagawa
+	0x24a76189, // n0x0c02 c0x0092 (n0x0f26-n0x0f3a)  + I kagoshima
+	0x24f1a4c8, // n0x0c03 c0x0093 (n0x0f3a-n0x0f58)  + I kanagawa
+	0x252b9088, // n0x0c04 c0x0094 (n0x0f58-n0x0f59)* o I kawasaki
+	0x2569c90a, // n0x0c05 c0x0095 (n0x0f59-n0x0f5a)* o I kitakyushu
+	0x25a4f544, // n0x0c06 c0x0096 (n0x0f5a-n0x0f5b)* o I kobe
+	0x25ecb145, // n0x0c07 c0x0097 (n0x0f5b-n0x0f7a)  + I kochi
+	0x262b3748, // n0x0c08 c0x0098 (n0x0f7a-n0x0f94)  + I kumamoto
+	0x266be0c5, // n0x0c09 c0x0099 (n0x0f94-n0x0fb3)  + I kyoto
+	0x00219082, // n0x0c0a c0x0000 (---------------)  + I lg
+	0x26a4b943, // n0x0c0b c0x009a (n0x0fb3-n0x0fd1)  + I mie
+	0x26ea29c6, // n0x0c0c c0x009b (n0x0fd1-n0x0ff2)  + I miyagi
+	0x27266108, // n0x0c0d c0x009c (n0x0ff2-n0x100d)  + I miyazaki
+	0x27754f86, // n0x0c0e c0x009d (n0x100d-n0x1058)  + I nagano
+	0x27adda48, // n0x0c0f c0x009e (n0x1058-n0x106e)  + I nagasaki
+	0x27f0f646, // n0x0c10 c0x009f (n0x106e-n0x106f)* o I nagoya
+	0x282c8a04, // n0x0c11 c0x00a0 (n0x106f-n0x1095)  + I nara
+	0x00202c02, // n0x0c12 c0x0000 (---------------)  + I ne
+	0x2863ff87, // n0x0c13 c0x00a1 (n0x1095-n0x10b7)  + I niigata
+	0x28aa8984, // n0x0c14 c0x00a2 (n0x10b7-n0x10ca)  + I oita
+	0x28e78dc7, // n0x0c15 c0x00a3 (n0x10ca-n0x10e4)  + I okayama
+	0x29395b47, // n0x0c16 c0x00a4 (n0x10e4-n0x110e)  + I okinawa
+	0x00200282, // n0x0c17 c0x0000 (---------------)  + I or
+	0x2969ac45, // n0x0c18 c0x00a5 (n0x110e-n0x1140)  + I osaka
+	0x29a38904, // n0x0c19 c0x00a6 (n0x1140-n0x115a)  + I saga
+	0x29ed9247, // n0x0c1a c0x00a7 (n0x115a-n0x119f)  + I saitama
+	0x2a221087, // n0x0c1b c0x00a8 (n0x119f-n0x11a0)* o I sapporo
+	0x2a682b06, // n0x0c1c c0x00a9 (n0x11a0-n0x11a1)* o I sendai
+	0x2aa285c5, // n0x0c1d c0x00aa (n0x11a1-n0x11b8)  + I shiga
+	0x2ae93dc7, // n0x0c1e c0x00ab (n0x11b8-n0x11cf)  + I shimane
+	0x2b2b2608, // n0x0c1f c0x00ac (n0x11cf-n0x11f3)  + I shizuoka
+	0x2b744e07, // n0x0c20 c0x00ad (n0x11f3-n0x1212)  + I tochigi
+	0x2ba99fc9, // n0x0c21 c0x00ae (n0x1212-n0x1223)  + I tokushima
+	0x2bf41c05, // n0x0c22 c0x00af (n0x1223-n0x125c)  + I tokyo
+	0x2c2f8b87, // n0x0c23 c0x00b0 (n0x125c-n0x1269)  + I tottori
+	0x2c68e9c6, // n0x0c24 c0x00b1 (n0x1269-n0x1281)  + I toyama
+	0x2ca23ac8, // n0x0c25 c0x00b2 (n0x1281-n0x129e)  + I wakayama
+	0x0038988d, // n0x0c26 c0x0000 (---------------)  + I xn--0trq7p7nn
+	0x0024e389, // n0x0c27 c0x0000 (---------------)  + I xn--1ctwo
+	0x0025c1cb, // n0x0c28 c0x0000 (---------------)  + I xn--1lqs03n
+	0x0026024b, // n0x0c29 c0x0000 (---------------)  + I xn--1lqs71d
+	0x0027348b, // n0x0c2a c0x0000 (---------------)  + I xn--2m4a15e
+	0x002a5bcb, // n0x0c2b c0x0000 (---------------)  + I xn--32vp30h
+	0x0030168b, // n0x0c2c c0x0000 (---------------)  + I xn--4it168d
+	0x0030194b, // n0x0c2d c0x0000 (---------------)  + I xn--4it797k
+	0x00301d89, // n0x0c2e c0x0000 (---------------)  + I xn--4pvxs
+	0x00302c4b, // n0x0c2f c0x0000 (---------------)  + I xn--5js045d
+	0x00302f0b, // n0x0c30 c0x0000 (---------------)  + I xn--5rtp49c
+	0x0030338b, // n0x0c31 c0x0000 (---------------)  + I xn--5rtq34k
+	0x003043ca, // n0x0c32 c0x0000 (---------------)  + I xn--6btw5a
+	0x0030490a, // n0x0c33 c0x0000 (---------------)  + I xn--6orx2r
+	0x00304f0c, // n0x0c34 c0x0000 (---------------)  + I xn--7t0a264c
+	0x0030a1cb, // n0x0c35 c0x0000 (---------------)  + I xn--8ltr62k
+	0x0030a74a, // n0x0c36 c0x0000 (---------------)  + I xn--8pvr4u
+	0x0031918a, // n0x0c37 c0x0000 (---------------)  + I xn--c3s14m
+	0x0032940e, // n0x0c38 c0x0000 (---------------)  + I xn--d5qv7z876c
+	0x0032a1ce, // n0x0c39 c0x0000 (---------------)  + I xn--djrs72d6uy
+	0x0032a54a, // n0x0c3a c0x0000 (---------------)  + I xn--djty4k
+	0x0032bb0a, // n0x0c3b c0x0000 (---------------)  + I xn--efvn9s
+	0x0032c78b, // n0x0c3c c0x0000 (---------------)  + I xn--ehqz56n
+	0x0032ca4b, // n0x0c3d c0x0000 (---------------)  + I xn--elqq16h
+	0x0032d78b, // n0x0c3e c0x0000 (---------------)  + I xn--f6qx53a
+	0x0034834b, // n0x0c3f c0x0000 (---------------)  + I xn--k7yn95e
+	0x0034894a, // n0x0c40 c0x0000 (---------------)  + I xn--kbrq7o
+	0x0034960b, // n0x0c41 c0x0000 (---------------)  + I xn--klt787d
+	0x003498ca, // n0x0c42 c0x0000 (---------------)  + I xn--kltp7d
+	0x00349b4a, // n0x0c43 c0x0000 (---------------)  + I xn--kltx9a
+	0x00349dca, // n0x0c44 c0x0000 (---------------)  + I xn--klty5x
+	0x00367e8b, // n0x0c45 c0x0000 (---------------)  + I xn--mkru45i
+	0x0037178b, // n0x0c46 c0x0000 (---------------)  + I xn--nit225k
+	0x003733ce, // n0x0c47 c0x0000 (---------------)  + I xn--ntso0iqx3a
+	0x0037374b, // n0x0c48 c0x0000 (---------------)  + I xn--ntsq17g
+	0x0037b18b, // n0x0c49 c0x0000 (---------------)  + I xn--pssu33l
+	0x0037d28b, // n0x0c4a c0x0000 (---------------)  + I xn--qqqt11m
+	0x0038144a, // n0x0c4b c0x0000 (---------------)  + I xn--rht27z
+	0x003816c9, // n0x0c4c c0x0000 (---------------)  + I xn--rht3d
+	0x0038190a, // n0x0c4d c0x0000 (---------------)  + I xn--rht61e
+	0x00382f8a, // n0x0c4e c0x0000 (---------------)  + I xn--rny31h
+	0x00392e8b, // n0x0c4f c0x0000 (---------------)  + I xn--tor131o
+	0x003949cb, // n0x0c50 c0x0000 (---------------)  + I xn--uist22h
+	0x0039548a, // n0x0c51 c0x0000 (---------------)  + I xn--uisz3g
+	0x003967cb, // n0x0c52 c0x0000 (---------------)  + I xn--uuwu58a
+	0x0039a30b, // n0x0c53 c0x0000 (---------------)  + I xn--vgu402c
+	0x003a520b, // n0x0c54 c0x0000 (---------------)  + I xn--zbx025d
+	0x2ce808c8, // n0x0c55 c0x00b3 (n0x129e-n0x12c0)  + I yamagata
+	0x2d2873c9, // n0x0c56 c0x00b4 (n0x12c0-n0x12d0)  + I yamaguchi
+	0x2d6a15c9, // n0x0c57 c0x00b5 (n0x12d0-n0x12ec)  + I yamanashi
+	0x2dad09c8, // n0x0c58 c0x00b6 (n0x12ec-n0x12ed)* o I yokohama
+	0x00334d45, // n0x0c59 c0x0000 (---------------)  + I aisai
+	0x00201883, // n0x0c5a c0x0000 (---------------)  + I ama
+	0x00203fc4, // n0x0c5b c0x0000 (---------------)  + I anjo
+	0x00360985, // n0x0c5c c0x0000 (---------------)  + I asuke
+	0x0036ac06, // n0x0c5d c0x0000 (---------------)  + I chiryu
+	0x002ac6c5, // n0x0c5e c0x0000 (---------------)  + I chita
+	0x00286bc4, // n0x0c5f c0x0000 (---------------)  + I fuso
+	0x0026ecc8, // n0x0c60 c0x0000 (---------------)  + I gamagori
+	0x00256185, // n0x0c61 c0x0000 (---------------)  + I handa
+	0x0028ff84, // n0x0c62 c0x0000 (---------------)  + I hazu
+	0x002c3247, // n0x0c63 c0x0000 (---------------)  + I hekinan
+	0x0029d24a, // n0x0c64 c0x0000 (---------------)  + I higashiura
+	0x002d218a, // n0x0c65 c0x0000 (---------------)  + I ichinomiya
+	0x0032bfc7, // n0x0c66 c0x0000 (---------------)  + I inazawa
+	0x00201787, // n0x0c67 c0x0000 (---------------)  + I inuyama
+	0x002f2007, // n0x0c68 c0x0000 (---------------)  + I isshiki
+	0x0031d107, // n0x0c69 c0x0000 (---------------)  + I iwakura
+	0x002a25c5, // n0x0c6a c0x0000 (---------------)  + I kanie
+	0x00325246, // n0x0c6b c0x0000 (---------------)  + I kariya
+	0x00321d87, // n0x0c6c c0x0000 (---------------)  + I kasugai
+	0x002571c4, // n0x0c6d c0x0000 (---------------)  + I kira
+	0x002f0206, // n0x0c6e c0x0000 (---------------)  + I kiyosu
+	0x00296f06, // n0x0c6f c0x0000 (---------------)  + I komaki
+	0x00206b85, // n0x0c70 c0x0000 (---------------)  + I konan
+	0x00229444, // n0x0c71 c0x0000 (---------------)  + I kota
+	0x002da306, // n0x0c72 c0x0000 (---------------)  + I mihama
+	0x0029c447, // n0x0c73 c0x0000 (---------------)  + I miyoshi
+	0x002251c6, // n0x0c74 c0x0000 (---------------)  + I nishio
+	0x00266c47, // n0x0c75 c0x0000 (---------------)  + I nisshin
+	0x0027cb43, // n0x0c76 c0x0000 (---------------)  + I obu
+	0x00252346, // n0x0c77 c0x0000 (---------------)  + I oguchi
+	0x00236085, // n0x0c78 c0x0000 (---------------)  + I oharu
+	0x0027e907, // n0x0c79 c0x0000 (---------------)  + I okazaki
+	0x002bf04a, // n0x0c7a c0x0000 (---------------)  + I owariasahi
+	0x002ae744, // n0x0c7b c0x0000 (---------------)  + I seto
+	0x00219288, // n0x0c7c c0x0000 (---------------)  + I shikatsu
+	0x00299589, // n0x0c7d c0x0000 (---------------)  + I shinshiro
+	0x002aff87, // n0x0c7e c0x0000 (---------------)  + I shitara
+	0x002e8506, // n0x0c7f c0x0000 (---------------)  + I tahara
+	0x00365ec8, // n0x0c80 c0x0000 (---------------)  + I takahama
+	0x00307489, // n0x0c81 c0x0000 (---------------)  + I tobishima
+	0x00375f44, // n0x0c82 c0x0000 (---------------)  + I toei
+	0x00337204, // n0x0c83 c0x0000 (---------------)  + I togo
+	0x002fa0c5, // n0x0c84 c0x0000 (---------------)  + I tokai
+	0x002bfec8, // n0x0c85 c0x0000 (---------------)  + I tokoname
+	0x002c0907, // n0x0c86 c0x0000 (---------------)  + I toyoake
+	0x0028df09, // n0x0c87 c0x0000 (---------------)  + I toyohashi
+	0x00247dc8, // n0x0c88 c0x0000 (---------------)  + I toyokawa
+	0x00366606, // n0x0c89 c0x0000 (---------------)  + I toyone
+	0x0025bb86, // n0x0c8a c0x0000 (---------------)  + I toyota
+	0x00297a48, // n0x0c8b c0x0000 (---------------)  + I tsushima
+	0x0036a786, // n0x0c8c c0x0000 (---------------)  + I yatomi
+	0x00201dc5, // n0x0c8d c0x0000 (---------------)  + I akita
+	0x00282bc6, // n0x0c8e c0x0000 (---------------)  + I daisen
+	0x002790c8, // n0x0c8f c0x0000 (---------------)  + I fujisato
+	0x0023ab86, // n0x0c90 c0x0000 (---------------)  + I gojome
+	0x0025778b, // n0x0c91 c0x0000 (---------------)  + I hachirogata
+	0x0028ab86, // n0x0c92 c0x0000 (---------------)  + I happou
+	0x002997cd, // n0x0c93 c0x0000 (---------------)  + I higashinaruse
+	0x0038e545, // n0x0c94 c0x0000 (---------------)  + I honjo
+	0x002a8846, // n0x0c95 c0x0000 (---------------)  + I honjyo
+	0x0021a585, // n0x0c96 c0x0000 (---------------)  + I ikawa
+	0x00296349, // n0x0c97 c0x0000 (---------------)  + I kamikoani
+	0x00320ec7, // n0x0c98 c0x0000 (---------------)  + I kamioka
+	0x00378048, // n0x0c99 c0x0000 (---------------)  + I katagami
+	0x00305386, // n0x0c9a c0x0000 (---------------)  + I kazuno
+	0x002983c9, // n0x0c9b c0x0000 (---------------)  + I kitaakita
+	0x002dd306, // n0x0c9c c0x0000 (---------------)  + I kosaka
+	0x002befc5, // n0x0c9d c0x0000 (---------------)  + I kyowa
+	0x0022f486, // n0x0c9e c0x0000 (---------------)  + I misato
+	0x002b16c6, // n0x0c9f c0x0000 (---------------)  + I mitane
+	0x002c6849, // n0x0ca0 c0x0000 (---------------)  + I moriyoshi
+	0x0033cfc6, // n0x0ca1 c0x0000 (---------------)  + I nikaho
+	0x0037ebc7, // n0x0ca2 c0x0000 (---------------)  + I noshiro
+	0x002c5f85, // n0x0ca3 c0x0000 (---------------)  + I odate
+	0x00202a03, // n0x0ca4 c0x0000 (---------------)  + I oga
+	0x00223845, // n0x0ca5 c0x0000 (---------------)  + I ogata
+	0x002a6287, // n0x0ca6 c0x0000 (---------------)  + I semboku
+	0x00330a06, // n0x0ca7 c0x0000 (---------------)  + I yokote
+	0x0038e449, // n0x0ca8 c0x0000 (---------------)  + I yurihonjo
+	0x0030bf06, // n0x0ca9 c0x0000 (---------------)  + I aomori
+	0x00282e06, // n0x0caa c0x0000 (---------------)  + I gonohe
+	0x0020db09, // n0x0cab c0x0000 (---------------)  + I hachinohe
+	0x002825c9, // n0x0cac c0x0000 (---------------)  + I hashikami
+	0x0029f407, // n0x0cad c0x0000 (---------------)  + I hiranai
+	0x002eb708, // n0x0cae c0x0000 (---------------)  + I hirosaki
+	0x002692c9, // n0x0caf c0x0000 (---------------)  + I itayanagi
+	0x0027edc8, // n0x0cb0 c0x0000 (---------------)  + I kuroishi
+	0x0037d506, // n0x0cb1 c0x0000 (---------------)  + I misawa
+	0x002d0505, // n0x0cb2 c0x0000 (---------------)  + I mutsu
+	0x0021e54a, // n0x0cb3 c0x0000 (---------------)  + I nakadomari
+	0x00282e86, // n0x0cb4 c0x0000 (---------------)  + I noheji
+	0x00207e46, // n0x0cb5 c0x0000 (---------------)  + I oirase
+	0x002a2b85, // n0x0cb6 c0x0000 (---------------)  + I owani
+	0x0036b208, // n0x0cb7 c0x0000 (---------------)  + I rokunohe
+	0x0020ea87, // n0x0cb8 c0x0000 (---------------)  + I sannohe
+	0x0023638a, // n0x0cb9 c0x0000 (---------------)  + I shichinohe
+	0x0024e0c6, // n0x0cba c0x0000 (---------------)  + I shingo
+	0x00240bc5, // n0x0cbb c0x0000 (---------------)  + I takko
+	0x0024a2c6, // n0x0cbc c0x0000 (---------------)  + I towada
+	0x00297647, // n0x0cbd c0x0000 (---------------)  + I tsugaru
+	0x002e83c7, // n0x0cbe c0x0000 (---------------)  + I tsuruta
+	0x0037e845, // n0x0cbf c0x0000 (---------------)  + I abiko
+	0x002bf185, // n0x0cc0 c0x0000 (---------------)  + I asahi
+	0x002e59c6, // n0x0cc1 c0x0000 (---------------)  + I chonan
+	0x002e6b46, // n0x0cc2 c0x0000 (---------------)  + I chosei
+	0x00300346, // n0x0cc3 c0x0000 (---------------)  + I choshi
+	0x0030ba84, // n0x0cc4 c0x0000 (---------------)  + I chuo
+	0x00281689, // n0x0cc5 c0x0000 (---------------)  + I funabashi
+	0x00288286, // n0x0cc6 c0x0000 (---------------)  + I futtsu
+	0x0034ad4a, // n0x0cc7 c0x0000 (---------------)  + I hanamigawa
+	0x0028f548, // n0x0cc8 c0x0000 (---------------)  + I ichihara
+	0x00265608, // n0x0cc9 c0x0000 (---------------)  + I ichikawa
+	0x002d218a, // n0x0cca c0x0000 (---------------)  + I ichinomiya
+	0x003a0f85, // n0x0ccb c0x0000 (---------------)  + I inzai
+	0x0029c385, // n0x0ccc c0x0000 (---------------)  + I isumi
+	0x00307d08, // n0x0ccd c0x0000 (---------------)  + I kamagaya
+	0x002caec8, // n0x0cce c0x0000 (---------------)  + I kamogawa
+	0x002037c7, // n0x0ccf c0x0000 (---------------)  + I kashiwa
+	0x00294d86, // n0x0cd0 c0x0000 (---------------)  + I katori
+	0x003141c8, // n0x0cd1 c0x0000 (---------------)  + I katsuura
+	0x002303c7, // n0x0cd2 c0x0000 (---------------)  + I kimitsu
+	0x00280d88, // n0x0cd3 c0x0000 (---------------)  + I kisarazu
+	0x00368e86, // n0x0cd4 c0x0000 (---------------)  + I kozaki
+	0x00283fc8, // n0x0cd5 c0x0000 (---------------)  + I kujukuri
+	0x002b4246, // n0x0cd6 c0x0000 (---------------)  + I kyonan
+	0x00243747, // n0x0cd7 c0x0000 (---------------)  + I matsudo
+	0x00298e06, // n0x0cd8 c0x0000 (---------------)  + I midori
+	0x002da306, // n0x0cd9 c0x0000 (---------------)  + I mihama
+	0x0023c6ca, // n0x0cda c0x0000 (---------------)  + I minamiboso
+	0x00234886, // n0x0cdb c0x0000 (---------------)  + I mobara
+	0x002d0509, // n0x0cdc c0x0000 (---------------)  + I mutsuzawa
+	0x002ae046, // n0x0cdd c0x0000 (---------------)  + I nagara
+	0x002d164a, // n0x0cde c0x0000 (---------------)  + I nagareyama
+	0x002c8a09, // n0x0cdf c0x0000 (---------------)  + I narashino
+	0x0037df46, // n0x0ce0 c0x0000 (---------------)  + I narita
+	0x0037f944, // n0x0ce1 c0x0000 (---------------)  + I noda
+	0x003071cd, // n0x0ce2 c0x0000 (---------------)  + I oamishirasato
+	0x00287647, // n0x0ce3 c0x0000 (---------------)  + I omigawa
+	0x00316686, // n0x0ce4 c0x0000 (---------------)  + I onjuku
+	0x002b8f45, // n0x0ce5 c0x0000 (---------------)  + I otaki
+	0x002dd385, // n0x0ce6 c0x0000 (---------------)  + I sakae
+	0x00307fc6, // n0x0ce7 c0x0000 (---------------)  + I sakura
+	0x0028d9c9, // n0x0ce8 c0x0000 (---------------)  + I shimofusa
+	0x002aaf87, // n0x0ce9 c0x0000 (---------------)  + I shirako
+	0x0027a9c6, // n0x0cea c0x0000 (---------------)  + I shiroi
+	0x002af8c6, // n0x0ceb c0x0000 (---------------)  + I shisui
+	0x00286c49, // n0x0cec c0x0000 (---------------)  + I sodegaura
+	0x0021f484, // n0x0ced c0x0000 (---------------)  + I sosa
+	0x0036bcc4, // n0x0cee c0x0000 (---------------)  + I tako
+	0x002040c8, // n0x0cef c0x0000 (---------------)  + I tateyama
+	0x002aea86, // n0x0cf0 c0x0000 (---------------)  + I togane
+	0x0029ed88, // n0x0cf1 c0x0000 (---------------)  + I tohnosho
+	0x0022f408, // n0x0cf2 c0x0000 (---------------)  + I tomisato
+	0x00280587, // n0x0cf3 c0x0000 (---------------)  + I urayasu
+	0x003a6349, // n0x0cf4 c0x0000 (---------------)  + I yachimata
+	0x00300547, // n0x0cf5 c0x0000 (---------------)  + I yachiyo
+	0x002adc0a, // n0x0cf6 c0x0000 (---------------)  + I yokaichiba
+	0x0022edcf, // n0x0cf7 c0x0000 (---------------)  + I yokoshibahikari
+	0x00269dca, // n0x0cf8 c0x0000 (---------------)  + I yotsukaido
+	0x00223245, // n0x0cf9 c0x0000 (---------------)  + I ainan
+	0x00279305, // n0x0cfa c0x0000 (---------------)  + I honai
+	0x00216985, // n0x0cfb c0x0000 (---------------)  + I ikata
+	0x00249147, // n0x0cfc c0x0000 (---------------)  + I imabari
+	0x00206043, // n0x0cfd c0x0000 (---------------)  + I iyo
+	0x002eb908, // n0x0cfe c0x0000 (---------------)  + I kamijima
+	0x002f5c86, // n0x0cff c0x0000 (---------------)  + I kihoku
+	0x002f5d89, // n0x0d00 c0x0000 (---------------)  + I kumakogen
+	0x003a3b06, // n0x0d01 c0x0000 (---------------)  + I masaki
+	0x002c02c7, // n0x0d02 c0x0000 (---------------)  + I matsuno
+	0x00298189, // n0x0d03 c0x0000 (---------------)  + I matsuyama
+	0x00377f48, // n0x0d04 c0x0000 (---------------)  + I namikata
+	0x002a2c47, // n0x0d05 c0x0000 (---------------)  + I niihama
+	0x00300a43, // n0x0d06 c0x0000 (---------------)  + I ozu
+	0x00334dc5, // n0x0d07 c0x0000 (---------------)  + I saijo
+	0x002396c5, // n0x0d08 c0x0000 (---------------)  + I seiyo
+	0x0030b8cb, // n0x0d09 c0x0000 (---------------)  + I shikokuchuo
+	0x002be184, // n0x0d0a c0x0000 (---------------)  + I tobe
+	0x0020b004, // n0x0d0b c0x0000 (---------------)  + I toon
+	0x00278086, // n0x0d0c c0x0000 (---------------)  + I uchiko
+	0x00300dc7, // n0x0d0d c0x0000 (---------------)  + I uwajima
+	0x0038f14a, // n0x0d0e c0x0000 (---------------)  + I yawatahama
+	0x0024b9c7, // n0x0d0f c0x0000 (---------------)  + I echizen
+	0x00375fc7, // n0x0d10 c0x0000 (---------------)  + I eiheiji
+	0x0027dac5, // n0x0d11 c0x0000 (---------------)  + I fukui
+	0x00202585, // n0x0d12 c0x0000 (---------------)  + I ikeda
+	0x0021ebc9, // n0x0d13 c0x0000 (---------------)  + I katsuyama
+	0x002da306, // n0x0d14 c0x0000 (---------------)  + I mihama
+	0x0024b84d, // n0x0d15 c0x0000 (---------------)  + I minamiechizen
+	0x00395f05, // n0x0d16 c0x0000 (---------------)  + I obama
+	0x00299783, // n0x0d17 c0x0000 (---------------)  + I ohi
+	0x0020a703, // n0x0d18 c0x0000 (---------------)  + I ono
+	0x002f6605, // n0x0d19 c0x0000 (---------------)  + I sabae
+	0x0034ca05, // n0x0d1a c0x0000 (---------------)  + I sakai
+	0x00365ec8, // n0x0d1b c0x0000 (---------------)  + I takahama
+	0x0027b9c7, // n0x0d1c c0x0000 (---------------)  + I tsuruga
+	0x0036ba46, // n0x0d1d c0x0000 (---------------)  + I wakasa
+	0x0029d906, // n0x0d1e c0x0000 (---------------)  + I ashiya
+	0x0022d885, // n0x0d1f c0x0000 (---------------)  + I buzen
+	0x0023aa47, // n0x0d20 c0x0000 (---------------)  + I chikugo
+	0x00201a07, // n0x0d21 c0x0000 (---------------)  + I chikuho
+	0x00293107, // n0x0d22 c0x0000 (---------------)  + I chikujo
+	0x002cb1ca, // n0x0d23 c0x0000 (---------------)  + I chikushino
+	0x00252408, // n0x0d24 c0x0000 (---------------)  + I chikuzen
+	0x0030ba84, // n0x0d25 c0x0000 (---------------)  + I chuo
+	0x00214b07, // n0x0d26 c0x0000 (---------------)  + I dazaifu
+	0x0027cc87, // n0x0d27 c0x0000 (---------------)  + I fukuchi
+	0x0032c406, // n0x0d28 c0x0000 (---------------)  + I hakata
+	0x00268047, // n0x0d29 c0x0000 (---------------)  + I higashi
+	0x002d2bc8, // n0x0d2a c0x0000 (---------------)  + I hirokawa
+	0x002a14c8, // n0x0d2b c0x0000 (---------------)  + I hisayama
+	0x0026e786, // n0x0d2c c0x0000 (---------------)  + I iizuka
+	0x0022b108, // n0x0d2d c0x0000 (---------------)  + I inatsuki
+	0x002c6404, // n0x0d2e c0x0000 (---------------)  + I kaho
+	0x00321d86, // n0x0d2f c0x0000 (---------------)  + I kasuga
+	0x0020f406, // n0x0d30 c0x0000 (---------------)  + I kasuya
+	0x00206106, // n0x0d31 c0x0000 (---------------)  + I kawara
+	0x002ebf06, // n0x0d32 c0x0000 (---------------)  + I keisen
+	0x00226304, // n0x0d33 c0x0000 (---------------)  + I koga
+	0x0031d1c6, // n0x0d34 c0x0000 (---------------)  + I kurate
+	0x002b81c6, // n0x0d35 c0x0000 (---------------)  + I kurogi
+	0x002969c6, // n0x0d36 c0x0000 (---------------)  + I kurume
+	0x00228406, // n0x0d37 c0x0000 (---------------)  + I minami
+	0x0020a5c6, // n0x0d38 c0x0000 (---------------)  + I miyako
+	0x002d2a06, // n0x0d39 c0x0000 (---------------)  + I miyama
+	0x0036b948, // n0x0d3a c0x0000 (---------------)  + I miyawaka
+	0x002f0088, // n0x0d3b c0x0000 (---------------)  + I mizumaki
+	0x002cbdc8, // n0x0d3c c0x0000 (---------------)  + I munakata
+	0x002ac8c8, // n0x0d3d c0x0000 (---------------)  + I nakagawa
+	0x00307c86, // n0x0d3e c0x0000 (---------------)  + I nakama
+	0x00211805, // n0x0d3f c0x0000 (---------------)  + I nishi
+	0x00223806, // n0x0d40 c0x0000 (---------------)  + I nogata
+	0x002abb05, // n0x0d41 c0x0000 (---------------)  + I ogori
+	0x00380887, // n0x0d42 c0x0000 (---------------)  + I okagaki
+	0x002060c5, // n0x0d43 c0x0000 (---------------)  + I okawa
+	0x00215483, // n0x0d44 c0x0000 (---------------)  + I oki
+	0x00203a85, // n0x0d45 c0x0000 (---------------)  + I omuta
+	0x002b6104, // n0x0d46 c0x0000 (---------------)  + I onga
+	0x0020a705, // n0x0d47 c0x0000 (---------------)  + I onojo
+	0x00216003, // n0x0d48 c0x0000 (---------------)  + I oto
+	0x002d87c7, // n0x0d49 c0x0000 (---------------)  + I saigawa
+	0x0036fd08, // n0x0d4a c0x0000 (---------------)  + I sasaguri
+	0x00266d06, // n0x0d4b c0x0000 (---------------)  + I shingu
+	0x002a224d, // n0x0d4c c0x0000 (---------------)  + I shinyoshitomi
+	0x002792c6, // n0x0d4d c0x0000 (---------------)  + I shonai
+	0x00295a45, // n0x0d4e c0x0000 (---------------)  + I soeda
+	0x002c6c03, // n0x0d4f c0x0000 (---------------)  + I sue
+	0x002b3109, // n0x0d50 c0x0000 (---------------)  + I tachiarai
+	0x002c1c86, // n0x0d51 c0x0000 (---------------)  + I tagawa
+	0x00238646, // n0x0d52 c0x0000 (---------------)  + I takata
+	0x0034cf44, // n0x0d53 c0x0000 (---------------)  + I toho
+	0x00269d47, // n0x0d54 c0x0000 (---------------)  + I toyotsu
+	0x0023bd46, // n0x0d55 c0x0000 (---------------)  + I tsuiki
+	0x0036b045, // n0x0d56 c0x0000 (---------------)  + I ukiha
+	0x0020b583, // n0x0d57 c0x0000 (---------------)  + I umi
+	0x002066c4, // n0x0d58 c0x0000 (---------------)  + I usui
+	0x0027ce46, // n0x0d59 c0x0000 (---------------)  + I yamada
+	0x002a7d84, // n0x0d5a c0x0000 (---------------)  + I yame
+	0x0030df48, // n0x0d5b c0x0000 (---------------)  + I yanagawa
+	0x00383d09, // n0x0d5c c0x0000 (---------------)  + I yukuhashi
+	0x002bde89, // n0x0d5d c0x0000 (---------------)  + I aizubange
+	0x0029eb8a, // n0x0d5e c0x0000 (---------------)  + I aizumisato
+	0x002453cd, // n0x0d5f c0x0000 (---------------)  + I aizuwakamatsu
+	0x00248a07, // n0x0d60 c0x0000 (---------------)  + I asakawa
+	0x00207cc6, // n0x0d61 c0x0000 (---------------)  + I bandai
+	0x0020c7c4, // n0x0d62 c0x0000 (---------------)  + I date
+	0x0032fcc9, // n0x0d63 c0x0000 (---------------)  + I fukushima
+	0x002860c8, // n0x0d64 c0x0000 (---------------)  + I furudono
+	0x00287246, // n0x0d65 c0x0000 (---------------)  + I futaba
+	0x0025a746, // n0x0d66 c0x0000 (---------------)  + I hanawa
+	0x00268047, // n0x0d67 c0x0000 (---------------)  + I higashi
+	0x00347f46, // n0x0d68 c0x0000 (---------------)  + I hirata
+	0x0021d4c6, // n0x0d69 c0x0000 (---------------)  + I hirono
+	0x00384006, // n0x0d6a c0x0000 (---------------)  + I iitate
+	0x00395bca, // n0x0d6b c0x0000 (---------------)  + I inawashiro
+	0x0021a4c8, // n0x0d6c c0x0000 (---------------)  + I ishikawa
+	0x0022da85, // n0x0d6d c0x0000 (---------------)  + I iwaki
+	0x002802c9, // n0x0d6e c0x0000 (---------------)  + I izumizaki
+	0x0028128a, // n0x0d6f c0x0000 (---------------)  + I kagamiishi
+	0x002c7848, // n0x0d70 c0x0000 (---------------)  + I kaneyama
+	0x0029b888, // n0x0d71 c0x0000 (---------------)  + I kawamata
+	0x00295fc8, // n0x0d72 c0x0000 (---------------)  + I kitakata
+	0x00201e0c, // n0x0d73 c0x0000 (---------------)  + I kitashiobara
+	0x002d5305, // n0x0d74 c0x0000 (---------------)  + I koori
+	0x0029db88, // n0x0d75 c0x0000 (---------------)  + I koriyama
+	0x00342586, // n0x0d76 c0x0000 (---------------)  + I kunimi
+	0x00306306, // n0x0d77 c0x0000 (---------------)  + I miharu
+	0x002bf3c7, // n0x0d78 c0x0000 (---------------)  + I mishima
+	0x0024b8c5, // n0x0d79 c0x0000 (---------------)  + I namie
+	0x00282d45, // n0x0d7a c0x0000 (---------------)  + I nango
+	0x002bdd49, // n0x0d7b c0x0000 (---------------)  + I nishiaizu
+	0x00211d87, // n0x0d7c c0x0000 (---------------)  + I nishigo
+	0x002f5d45, // n0x0d7d c0x0000 (---------------)  + I okuma
+	0x0021f187, // n0x0d7e c0x0000 (---------------)  + I omotego
+	0x0020a703, // n0x0d7f c0x0000 (---------------)  + I ono
+	0x002c0e45, // n0x0d80 c0x0000 (---------------)  + I otama
+	0x00346648, // n0x0d81 c0x0000 (---------------)  + I samegawa
+	0x002b1287, // n0x0d82 c0x0000 (---------------)  + I shimogo
+	0x0029b749, // n0x0d83 c0x0000 (---------------)  + I shirakawa
+	0x00319905, // n0x0d84 c0x0000 (---------------)  + I showa
+	0x0035d844, // n0x0d85 c0x0000 (---------------)  + I soma
+	0x002a0308, // n0x0d86 c0x0000 (---------------)  + I sukagawa
+	0x0022c747, // n0x0d87 c0x0000 (---------------)  + I taishin
+	0x002a2e08, // n0x0d88 c0x0000 (---------------)  + I tamakawa
+	0x00330f48, // n0x0d89 c0x0000 (---------------)  + I tanagura
+	0x002d9885, // n0x0d8a c0x0000 (---------------)  + I tenei
+	0x00350b06, // n0x0d8b c0x0000 (---------------)  + I yabuki
+	0x0028f086, // n0x0d8c c0x0000 (---------------)  + I yamato
+	0x00250089, // n0x0d8d c0x0000 (---------------)  + I yamatsuri
+	0x00314a47, // n0x0d8e c0x0000 (---------------)  + I yanaizu
+	0x002abfc6, // n0x0d8f c0x0000 (---------------)  + I yugawa
+	0x0028ca87, // n0x0d90 c0x0000 (---------------)  + I anpachi
+	0x002183c3, // n0x0d91 c0x0000 (---------------)  + I ena
+	0x0036aec4, // n0x0d92 c0x0000 (---------------)  + I gifu
+	0x002a0c45, // n0x0d93 c0x0000 (---------------)  + I ginan
+	0x00214d84, // n0x0d94 c0x0000 (---------------)  + I godo
+	0x00343c04, // n0x0d95 c0x0000 (---------------)  + I gujo
+	0x00280b47, // n0x0d96 c0x0000 (---------------)  + I hashima
+	0x00218a07, // n0x0d97 c0x0000 (---------------)  + I hichiso
+	0x0027ab84, // n0x0d98 c0x0000 (---------------)  + I hida
+	0x0029b590, // n0x0d99 c0x0000 (---------------)  + I higashishirakawa
+	0x00308147, // n0x0d9a c0x0000 (---------------)  + I ibigawa
+	0x00202585, // n0x0d9b c0x0000 (---------------)  + I ikeda
+	0x002ef98c, // n0x0d9c c0x0000 (---------------)  + I kakamigahara
+	0x00279cc4, // n0x0d9d c0x0000 (---------------)  + I kani
+	0x0029b388, // n0x0d9e c0x0000 (---------------)  + I kasahara
+	0x00243649, // n0x0d9f c0x0000 (---------------)  + I kasamatsu
+	0x00301506, // n0x0da0 c0x0000 (---------------)  + I kawaue
+	0x0021f588, // n0x0da1 c0x0000 (---------------)  + I kitagata
+	0x0024ff84, // n0x0da2 c0x0000 (---------------)  + I mino
+	0x002d7b88, // n0x0da3 c0x0000 (---------------)  + I minokamo
+	0x00268506, // n0x0da4 c0x0000 (---------------)  + I mitake
+	0x00228288, // n0x0da5 c0x0000 (---------------)  + I mizunami
+	0x002a0946, // n0x0da6 c0x0000 (---------------)  + I motosu
+	0x0037a2cb, // n0x0da7 c0x0000 (---------------)  + I nakatsugawa
+	0x00202a05, // n0x0da8 c0x0000 (---------------)  + I ogaki
+	0x002c6388, // n0x0da9 c0x0000 (---------------)  + I sakahogi
+	0x00217fc4, // n0x0daa c0x0000 (---------------)  + I seki
+	0x0028224a, // n0x0dab c0x0000 (---------------)  + I sekigahara
+	0x0029b749, // n0x0dac c0x0000 (---------------)  + I shirakawa
+	0x00312006, // n0x0dad c0x0000 (---------------)  + I tajimi
+	0x002c0148, // n0x0dae c0x0000 (---------------)  + I takayama
+	0x00274245, // n0x0daf c0x0000 (---------------)  + I tarui
+	0x00222904, // n0x0db0 c0x0000 (---------------)  + I toki
+	0x0029b286, // n0x0db1 c0x0000 (---------------)  + I tomika
+	0x00292fc8, // n0x0db2 c0x0000 (---------------)  + I wanouchi
+	0x002808c8, // n0x0db3 c0x0000 (---------------)  + I yamagata
+	0x00341746, // n0x0db4 c0x0000 (---------------)  + I yaotsu
+	0x00321484, // n0x0db5 c0x0000 (---------------)  + I yoro
+	0x0021e4c6, // n0x0db6 c0x0000 (---------------)  + I annaka
+	0x003005c7, // n0x0db7 c0x0000 (---------------)  + I chiyoda
+	0x00278cc7, // n0x0db8 c0x0000 (---------------)  + I fujioka
+	0x0026804f, // n0x0db9 c0x0000 (---------------)  + I higashiagatsuma
+	0x00204687, // n0x0dba c0x0000 (---------------)  + I isesaki
+	0x0037e007, // n0x0dbb c0x0000 (---------------)  + I itakura
+	0x003061c5, // n0x0dbc c0x0000 (---------------)  + I kanna
+	0x002e2345, // n0x0dbd c0x0000 (---------------)  + I kanra
+	0x0029f0c9, // n0x0dbe c0x0000 (---------------)  + I katashina
+	0x0026b7c6, // n0x0dbf c0x0000 (---------------)  + I kawaba
+	0x0027f4c5, // n0x0dc0 c0x0000 (---------------)  + I kiryu
+	0x002828c7, // n0x0dc1 c0x0000 (---------------)  + I kusatsu
+	0x002c5d48, // n0x0dc2 c0x0000 (---------------)  + I maebashi
+	0x002be885, // n0x0dc3 c0x0000 (---------------)  + I meiwa
+	0x00298e06, // n0x0dc4 c0x0000 (---------------)  + I midori
+	0x00216448, // n0x0dc5 c0x0000 (---------------)  + I minakami
+	0x00354f8a, // n0x0dc6 c0x0000 (---------------)  + I naganohara
+	0x00356448, // n0x0dc7 c0x0000 (---------------)  + I nakanojo
+	0x003a1d07, // n0x0dc8 c0x0000 (---------------)  + I nanmoku
+	0x0022f206, // n0x0dc9 c0x0000 (---------------)  + I numata
+	0x00280286, // n0x0dca c0x0000 (---------------)  + I oizumi
+	0x0021c683, // n0x0dcb c0x0000 (---------------)  + I ora
+	0x00204083, // n0x0dcc c0x0000 (---------------)  + I ota
+	0x00281449, // n0x0dcd c0x0000 (---------------)  + I shibukawa
+	0x00269149, // n0x0dce c0x0000 (---------------)  + I shimonita
+	0x00299ec6, // n0x0dcf c0x0000 (---------------)  + I shinto
+	0x00319905, // n0x0dd0 c0x0000 (---------------)  + I showa
+	0x002a06c8, // n0x0dd1 c0x0000 (---------------)  + I takasaki
+	0x002c0148, // n0x0dd2 c0x0000 (---------------)  + I takayama
+	0x0039a108, // n0x0dd3 c0x0000 (---------------)  + I tamamura
+	0x0038408b, // n0x0dd4 c0x0000 (---------------)  + I tatebayashi
+	0x002a2487, // n0x0dd5 c0x0000 (---------------)  + I tomioka
+	0x002ff549, // n0x0dd6 c0x0000 (---------------)  + I tsukiyono
+	0x002682c8, // n0x0dd7 c0x0000 (---------------)  + I tsumagoi
+	0x00387304, // n0x0dd8 c0x0000 (---------------)  + I ueno
+	0x002c6948, // n0x0dd9 c0x0000 (---------------)  + I yoshioka
+	0x0028bb49, // n0x0dda c0x0000 (---------------)  + I asaminami
+	0x002ac2c5, // n0x0ddb c0x0000 (---------------)  + I daiwa
+	0x00249047, // n0x0ddc c0x0000 (---------------)  + I etajima
+	0x002bc1c5, // n0x0ddd c0x0000 (---------------)  + I fuchu
+	0x002807c8, // n0x0dde c0x0000 (---------------)  + I fukuyama
+	0x0028f38b, // n0x0ddf c0x0000 (---------------)  + I hatsukaichi
+	0x00293b10, // n0x0de0 c0x0000 (---------------)  + I higashihiroshima
+	0x002a8645, // n0x0de1 c0x0000 (---------------)  + I hongo
+	0x00217f0c, // n0x0de2 c0x0000 (---------------)  + I jinsekikogen
+	0x0036bc05, // n0x0de3 c0x0000 (---------------)  + I kaita
+	0x0027db43, // n0x0de4 c0x0000 (---------------)  + I kui
+	0x00383786, // n0x0de5 c0x0000 (---------------)  + I kumano
+	0x002b7544, // n0x0de6 c0x0000 (---------------)  + I kure
+	0x003a69c6, // n0x0de7 c0x0000 (---------------)  + I mihara
+	0x0029c447, // n0x0de8 c0x0000 (---------------)  + I miyoshi
+	0x002164c4, // n0x0de9 c0x0000 (---------------)  + I naka
+	0x002d2088, // n0x0dea c0x0000 (---------------)  + I onomichi
+	0x002eb7cd, // n0x0deb c0x0000 (---------------)  + I osakikamijima
+	0x00305a45, // n0x0dec c0x0000 (---------------)  + I otake
+	0x002458c4, // n0x0ded c0x0000 (---------------)  + I saka
+	0x00222f84, // n0x0dee c0x0000 (---------------)  + I sera
+	0x0027fd49, // n0x0def c0x0000 (---------------)  + I seranishi
+	0x00286908, // n0x0df0 c0x0000 (---------------)  + I shinichi
+	0x0030bd87, // n0x0df1 c0x0000 (---------------)  + I shobara
+	0x00268588, // n0x0df2 c0x0000 (---------------)  + I takehara
+	0x00281748, // n0x0df3 c0x0000 (---------------)  + I abashiri
+	0x0027acc5, // n0x0df4 c0x0000 (---------------)  + I abira
+	0x00208b87, // n0x0df5 c0x0000 (---------------)  + I aibetsu
+	0x0027ac47, // n0x0df6 c0x0000 (---------------)  + I akabira
+	0x00209907, // n0x0df7 c0x0000 (---------------)  + I akkeshi
+	0x002bf189, // n0x0df8 c0x0000 (---------------)  + I asahikawa
+	0x0023bbc9, // n0x0df9 c0x0000 (---------------)  + I ashibetsu
+	0x00244e86, // n0x0dfa c0x0000 (---------------)  + I ashoro
+	0x002b4086, // n0x0dfb c0x0000 (---------------)  + I assabu
+	0x00268286, // n0x0dfc c0x0000 (---------------)  + I atsuma
+	0x0026a3c5, // n0x0dfd c0x0000 (---------------)  + I bibai
+	0x002d81c4, // n0x0dfe c0x0000 (---------------)  + I biei
+	0x00200ec6, // n0x0dff c0x0000 (---------------)  + I bifuka
+	0x00202106, // n0x0e00 c0x0000 (---------------)  + I bihoro
+	0x0027ad08, // n0x0e01 c0x0000 (---------------)  + I biratori
+	0x0029730b, // n0x0e02 c0x0000 (---------------)  + I chippubetsu
+	0x002ae607, // n0x0e03 c0x0000 (---------------)  + I chitose
+	0x0020c7c4, // n0x0e04 c0x0000 (---------------)  + I date
+	0x00223e46, // n0x0e05 c0x0000 (---------------)  + I ebetsu
+	0x00283707, // n0x0e06 c0x0000 (---------------)  + I embetsu
+	0x002f5f45, // n0x0e07 c0x0000 (---------------)  + I eniwa
+	0x00239145, // n0x0e08 c0x0000 (---------------)  + I erimo
+	0x00200484, // n0x0e09 c0x0000 (---------------)  + I esan
+	0x0023bb46, // n0x0e0a c0x0000 (---------------)  + I esashi
+	0x00200f48, // n0x0e0b c0x0000 (---------------)  + I fukagawa
+	0x0032fcc9, // n0x0e0c c0x0000 (---------------)  + I fukushima
+	0x00253846, // n0x0e0d c0x0000 (---------------)  + I furano
+	0x00285888, // n0x0e0e c0x0000 (---------------)  + I furubira
+	0x0036b106, // n0x0e0f c0x0000 (---------------)  + I haboro
+	0x0032ccc8, // n0x0e10 c0x0000 (---------------)  + I hakodate
+	0x002a9b8c, // n0x0e11 c0x0000 (---------------)  + I hamatonbetsu
+	0x0027ab86, // n0x0e12 c0x0000 (---------------)  + I hidaka
+	0x0029570d, // n0x0e13 c0x0000 (---------------)  + I higashikagura
+	0x00295b8b, // n0x0e14 c0x0000 (---------------)  + I higashikawa
+	0x0037ec85, // n0x0e15 c0x0000 (---------------)  + I hiroo
+	0x00201b47, // n0x0e16 c0x0000 (---------------)  + I hokuryu
+	0x0033d0c6, // n0x0e17 c0x0000 (---------------)  + I hokuto
+	0x002e8288, // n0x0e18 c0x0000 (---------------)  + I honbetsu
+	0x00244f09, // n0x0e19 c0x0000 (---------------)  + I horokanai
+	0x002bd888, // n0x0e1a c0x0000 (---------------)  + I horonobe
+	0x00202585, // n0x0e1b c0x0000 (---------------)  + I ikeda
+	0x002fe547, // n0x0e1c c0x0000 (---------------)  + I imakane
+	0x0027eec8, // n0x0e1d c0x0000 (---------------)  + I ishikari
+	0x00272289, // n0x0e1e c0x0000 (---------------)  + I iwamizawa
+	0x0023b0c6, // n0x0e1f c0x0000 (---------------)  + I iwanai
+	0x0025c78a, // n0x0e20 c0x0000 (---------------)  + I kamifurano
+	0x002e8008, // n0x0e21 c0x0000 (---------------)  + I kamikawa
+	0x002bd6cb, // n0x0e22 c0x0000 (---------------)  + I kamishihoro
+	0x00291a4c, // n0x0e23 c0x0000 (---------------)  + I kamisunagawa
+	0x002d7c88, // n0x0e24 c0x0000 (---------------)  + I kamoenai
+	0x0027c586, // n0x0e25 c0x0000 (---------------)  + I kayabe
+	0x00208588, // n0x0e26 c0x0000 (---------------)  + I kembuchi
+	0x002047c7, // n0x0e27 c0x0000 (---------------)  + I kikonai
+	0x0023be49, // n0x0e28 c0x0000 (---------------)  + I kimobetsu
+	0x0020ed4d, // n0x0e29 c0x0000 (---------------)  + I kitahiroshima
+	0x0029d586, // n0x0e2a c0x0000 (---------------)  + I kitami
+	0x00297008, // n0x0e2b c0x0000 (---------------)  + I kiyosato
+	0x002eff49, // n0x0e2c c0x0000 (---------------)  + I koshimizu
+	0x002b4a48, // n0x0e2d c0x0000 (---------------)  + I kunneppu
+	0x002840c8, // n0x0e2e c0x0000 (---------------)  + I kuriyama
+	0x002b8a8c, // n0x0e2f c0x0000 (---------------)  + I kuromatsunai
+	0x002b9a07, // n0x0e30 c0x0000 (---------------)  + I kushiro
+	0x002ba907, // n0x0e31 c0x0000 (---------------)  + I kutchan
+	0x002befc5, // n0x0e32 c0x0000 (---------------)  + I kyowa
+	0x0024eec7, // n0x0e33 c0x0000 (---------------)  + I mashike
+	0x002c5c08, // n0x0e34 c0x0000 (---------------)  + I matsumae
+	0x0029b306, // n0x0e35 c0x0000 (---------------)  + I mikasa
+	0x002536cc, // n0x0e36 c0x0000 (---------------)  + I minamifurano
+	0x002e3788, // n0x0e37 c0x0000 (---------------)  + I mombetsu
+	0x002c7c48, // n0x0e38 c0x0000 (---------------)  + I moseushi
+	0x002b6d86, // n0x0e39 c0x0000 (---------------)  + I mukawa
+	0x003961c7, // n0x0e3a c0x0000 (---------------)  + I muroran
+	0x00245084, // n0x0e3b c0x0000 (---------------)  + I naie
+	0x002ac8c8, // n0x0e3c c0x0000 (---------------)  + I nakagawa
+	0x0021840c, // n0x0e3d c0x0000 (---------------)  + I nakasatsunai
+	0x0036decc, // n0x0e3e c0x0000 (---------------)  + I nakatombetsu
+	0x002232c5, // n0x0e3f c0x0000 (---------------)  + I nanae
+	0x0038ae07, // n0x0e40 c0x0000 (---------------)  + I nanporo
+	0x00321406, // n0x0e41 c0x0000 (---------------)  + I nayoro
+	0x00396146, // n0x0e42 c0x0000 (---------------)  + I nemuro
+	0x00296508, // n0x0e43 c0x0000 (---------------)  + I niikappu
+	0x0039e6c4, // n0x0e44 c0x0000 (---------------)  + I niki
+	0x002251cb, // n0x0e45 c0x0000 (---------------)  + I nishiokoppe
+	0x0033214b, // n0x0e46 c0x0000 (---------------)  + I noboribetsu
+	0x0022f206, // n0x0e47 c0x0000 (---------------)  + I numata
+	0x002eb647, // n0x0e48 c0x0000 (---------------)  + I obihiro
+	0x00309145, // n0x0e49 c0x0000 (---------------)  + I obira
+	0x0026f985, // n0x0e4a c0x0000 (---------------)  + I oketo
+	0x00225306, // n0x0e4b c0x0000 (---------------)  + I okoppe
+	0x00274205, // n0x0e4c c0x0000 (---------------)  + I otaru
+	0x002be145, // n0x0e4d c0x0000 (---------------)  + I otobe
+	0x002bf687, // n0x0e4e c0x0000 (---------------)  + I otofuke
+	0x00278689, // n0x0e4f c0x0000 (---------------)  + I otoineppu
+	0x002e6d04, // n0x0e50 c0x0000 (---------------)  + I oumu
+	0x00277145, // n0x0e51 c0x0000 (---------------)  + I ozora
+	0x002d72c5, // n0x0e52 c0x0000 (---------------)  + I pippu
+	0x00289ac8, // n0x0e53 c0x0000 (---------------)  + I rankoshi
+	0x002d1ec5, // n0x0e54 c0x0000 (---------------)  + I rebun
+	0x002a7649, // n0x0e55 c0x0000 (---------------)  + I rikubetsu
+	0x002a5647, // n0x0e56 c0x0000 (---------------)  + I rishiri
+	0x002a564b, // n0x0e57 c0x0000 (---------------)  + I rishirifuji
+	0x0031cf46, // n0x0e58 c0x0000 (---------------)  + I saroma
+	0x0036b689, // n0x0e59 c0x0000 (---------------)  + I sarufutsu
+	0x00229388, // n0x0e5a c0x0000 (---------------)  + I shakotan
+	0x00259285, // n0x0e5b c0x0000 (---------------)  + I shari
+	0x00209a08, // n0x0e5c c0x0000 (---------------)  + I shibecha
+	0x0023bc08, // n0x0e5d c0x0000 (---------------)  + I shibetsu
+	0x0021afc7, // n0x0e5e c0x0000 (---------------)  + I shikabe
+	0x00280147, // n0x0e5f c0x0000 (---------------)  + I shikaoi
+	0x00280bc9, // n0x0e60 c0x0000 (---------------)  + I shimamaki
+	0x002281c7, // n0x0e61 c0x0000 (---------------)  + I shimizu
+	0x00263849, // n0x0e62 c0x0000 (---------------)  + I shimokawa
+	0x0029120c, // n0x0e63 c0x0000 (---------------)  + I shinshinotsu
+	0x00299ec8, // n0x0e64 c0x0000 (---------------)  + I shintoku
+	0x002d9d89, // n0x0e65 c0x0000 (---------------)  + I shiranuka
+	0x002d5707, // n0x0e66 c0x0000 (---------------)  + I shiraoi
+	0x00281809, // n0x0e67 c0x0000 (---------------)  + I shiriuchi
+	0x00218b47, // n0x0e68 c0x0000 (---------------)  + I sobetsu
+	0x00291b48, // n0x0e69 c0x0000 (---------------)  + I sunagawa
+	0x00289e05, // n0x0e6a c0x0000 (---------------)  + I taiki
+	0x00321d06, // n0x0e6b c0x0000 (---------------)  + I takasu
+	0x002b8f88, // n0x0e6c c0x0000 (---------------)  + I takikawa
+	0x002f8588, // n0x0e6d c0x0000 (---------------)  + I takinoue
+	0x00281149, // n0x0e6e c0x0000 (---------------)  + I teshikaga
+	0x002be187, // n0x0e6f c0x0000 (---------------)  + I tobetsu
+	0x00270305, // n0x0e70 c0x0000 (---------------)  + I tohma
+	0x0020bf49, // n0x0e71 c0x0000 (---------------)  + I tomakomai
+	0x00269686, // n0x0e72 c0x0000 (---------------)  + I tomari
+	0x0028e9c4, // n0x0e73 c0x0000 (---------------)  + I toya
+	0x0034cc46, // n0x0e74 c0x0000 (---------------)  + I toyako
+	0x00265f88, // n0x0e75 c0x0000 (---------------)  + I toyotomi
+	0x0026ae47, // n0x0e76 c0x0000 (---------------)  + I toyoura
+	0x00297508, // n0x0e77 c0x0000 (---------------)  + I tsubetsu
+	0x0022b1c9, // n0x0e78 c0x0000 (---------------)  + I tsukigata
+	0x002b6b07, // n0x0e79 c0x0000 (---------------)  + I urakawa
+	0x0029d406, // n0x0e7a c0x0000 (---------------)  + I urausu
+	0x00201c04, // n0x0e7b c0x0000 (---------------)  + I uryu
+	0x00203b09, // n0x0e7c c0x0000 (---------------)  + I utashinai
+	0x00208a08, // n0x0e7d c0x0000 (---------------)  + I wakkanai
+	0x002b6c47, // n0x0e7e c0x0000 (---------------)  + I wassamu
+	0x00325346, // n0x0e7f c0x0000 (---------------)  + I yakumo
+	0x00239786, // n0x0e80 c0x0000 (---------------)  + I yoichi
+	0x00207dc4, // n0x0e81 c0x0000 (---------------)  + I aioi
+	0x002a8a46, // n0x0e82 c0x0000 (---------------)  + I akashi
+	0x0020a683, // n0x0e83 c0x0000 (---------------)  + I ako
+	0x002ec709, // n0x0e84 c0x0000 (---------------)  + I amagasaki
+	0x002029c6, // n0x0e85 c0x0000 (---------------)  + I aogaki
+	0x0029bac5, // n0x0e86 c0x0000 (---------------)  + I asago
+	0x0029d906, // n0x0e87 c0x0000 (---------------)  + I ashiya
+	0x002a2f45, // n0x0e88 c0x0000 (---------------)  + I awaji
+	0x0027f348, // n0x0e89 c0x0000 (---------------)  + I fukusaki
+	0x002d79c7, // n0x0e8a c0x0000 (---------------)  + I goshiki
+	0x00205b86, // n0x0e8b c0x0000 (---------------)  + I harima
+	0x00229046, // n0x0e8c c0x0000 (---------------)  + I himeji
+	0x00265608, // n0x0e8d c0x0000 (---------------)  + I ichikawa
+	0x0029f247, // n0x0e8e c0x0000 (---------------)  + I inagawa
+	0x0029d5c5, // n0x0e8f c0x0000 (---------------)  + I itami
+	0x0029de08, // n0x0e90 c0x0000 (---------------)  + I kakogawa
+	0x00383348, // n0x0e91 c0x0000 (---------------)  + I kamigori
+	0x002e8008, // n0x0e92 c0x0000 (---------------)  + I kamikawa
+	0x0036bac5, // n0x0e93 c0x0000 (---------------)  + I kasai
+	0x00321d86, // n0x0e94 c0x0000 (---------------)  + I kasuga
+	0x002bdc49, // n0x0e95 c0x0000 (---------------)  + I kawanishi
+	0x0028ef04, // n0x0e96 c0x0000 (---------------)  + I miki
+	0x0036a88b, // n0x0e97 c0x0000 (---------------)  + I minamiawaji
+	0x0021d1cb, // n0x0e98 c0x0000 (---------------)  + I nishinomiya
+	0x0022d989, // n0x0e99 c0x0000 (---------------)  + I nishiwaki
+	0x0020a703, // n0x0e9a c0x0000 (---------------)  + I ono
+	0x00259bc5, // n0x0e9b c0x0000 (---------------)  + I sanda
+	0x002069c6, // n0x0e9c c0x0000 (---------------)  + I sannan
+	0x002db6c8, // n0x0e9d c0x0000 (---------------)  + I sasayama
+	0x0022ed44, // n0x0e9e c0x0000 (---------------)  + I sayo
+	0x00266d06, // n0x0e9f c0x0000 (---------------)  + I shingu
+	0x002cb309, // n0x0ea0 c0x0000 (---------------)  + I shinonsen
+	0x002af085, // n0x0ea1 c0x0000 (---------------)  + I shiso
+	0x002bf5c6, // n0x0ea2 c0x0000 (---------------)  + I sumoto
+	0x0022c746, // n0x0ea3 c0x0000 (---------------)  + I taishi
+	0x00216a44, // n0x0ea4 c0x0000 (---------------)  + I taka
+	0x0029614a, // n0x0ea5 c0x0000 (---------------)  + I takarazuka
+	0x0029ba08, // n0x0ea6 c0x0000 (---------------)  + I takasago
+	0x002f8586, // n0x0ea7 c0x0000 (---------------)  + I takino
+	0x002ce105, // n0x0ea8 c0x0000 (---------------)  + I tamba
+	0x0020d407, // n0x0ea9 c0x0000 (---------------)  + I tatsuno
+	0x0024fbc7, // n0x0eaa c0x0000 (---------------)  + I toyooka
+	0x00350b04, // n0x0eab c0x0000 (---------------)  + I yabu
+	0x0021d407, // n0x0eac c0x0000 (---------------)  + I yashiro
+	0x00206084, // n0x0ead c0x0000 (---------------)  + I yoka
+	0x00206086, // n0x0eae c0x0000 (---------------)  + I yokawa
+	0x00208fc3, // n0x0eaf c0x0000 (---------------)  + I ami
+	0x002bf185, // n0x0eb0 c0x0000 (---------------)  + I asahi
+	0x0034be85, // n0x0eb1 c0x0000 (---------------)  + I bando
+	0x0022cac8, // n0x0eb2 c0x0000 (---------------)  + I chikusei
+	0x00214cc5, // n0x0eb3 c0x0000 (---------------)  + I daigo
+	0x0027a8c9, // n0x0eb4 c0x0000 (---------------)  + I fujishiro
+	0x002a27c7, // n0x0eb5 c0x0000 (---------------)  + I hitachi
+	0x002ac70b, // n0x0eb6 c0x0000 (---------------)  + I hitachinaka
+	0x002a27cc, // n0x0eb7 c0x0000 (---------------)  + I hitachiomiya
+	0x002a344a, // n0x0eb8 c0x0000 (---------------)  + I hitachiota
+	0x002c1ac7, // n0x0eb9 c0x0000 (---------------)  + I ibaraki
+	0x002013c3, // n0x0eba c0x0000 (---------------)  + I ina
+	0x00370248, // n0x0ebb c0x0000 (---------------)  + I inashiki
+	0x0036bc85, // n0x0ebc c0x0000 (---------------)  + I itako
+	0x002be905, // n0x0ebd c0x0000 (---------------)  + I iwama
+	0x00334e84, // n0x0ebe c0x0000 (---------------)  + I joso
+	0x00291a46, // n0x0ebf c0x0000 (---------------)  + I kamisu
+	0x00243646, // n0x0ec0 c0x0000 (---------------)  + I kasama
+	0x002a8a87, // n0x0ec1 c0x0000 (---------------)  + I kashima
+	0x0020b4cb, // n0x0ec2 c0x0000 (---------------)  + I kasumigaura
+	0x00226304, // n0x0ec3 c0x0000 (---------------)  + I koga
+	0x003781c4, // n0x0ec4 c0x0000 (---------------)  + I miho
+	0x0026e904, // n0x0ec5 c0x0000 (---------------)  + I mito
+	0x002c60c6, // n0x0ec6 c0x0000 (---------------)  + I moriya
+	0x002164c4, // n0x0ec7 c0x0000 (---------------)  + I naka
+	0x002bffc8, // n0x0ec8 c0x0000 (---------------)  + I namegata
+	0x00334c85, // n0x0ec9 c0x0000 (---------------)  + I oarai
+	0x00245a05, // n0x0eca c0x0000 (---------------)  + I ogawa
+	0x0039a047, // n0x0ecb c0x0000 (---------------)  + I omitama
+	0x00201c49, // n0x0ecc c0x0000 (---------------)  + I ryugasaki
+	0x0034ca05, // n0x0ecd c0x0000 (---------------)  + I sakai
+	0x00372a4a, // n0x0ece c0x0000 (---------------)  + I sakuragawa
+	0x002c5e89, // n0x0ecf c0x0000 (---------------)  + I shimodate
+	0x00285e4a, // n0x0ed0 c0x0000 (---------------)  + I shimotsuma
+	0x00395d09, // n0x0ed1 c0x0000 (---------------)  + I shirosato
+	0x00332b04, // n0x0ed2 c0x0000 (---------------)  + I sowa
+	0x002af985, // n0x0ed3 c0x0000 (---------------)  + I suifu
+	0x00348048, // n0x0ed4 c0x0000 (---------------)  + I takahagi
+	0x002d930b, // n0x0ed5 c0x0000 (---------------)  + I tamatsukuri
+	0x002fa0c5, // n0x0ed6 c0x0000 (---------------)  + I tokai
+	0x0028e1c6, // n0x0ed7 c0x0000 (---------------)  + I tomobe
+	0x00221d44, // n0x0ed8 c0x0000 (---------------)  + I tone
+	0x0027ae06, // n0x0ed9 c0x0000 (---------------)  + I toride
+	0x002b6989, // n0x0eda c0x0000 (---------------)  + I tsuchiura
+	0x00223f07, // n0x0edb c0x0000 (---------------)  + I tsukuba
+	0x0030c0c8, // n0x0edc c0x0000 (---------------)  + I uchihara
+	0x00245746, // n0x0edd c0x0000 (---------------)  + I ushiku
+	0x00300547, // n0x0ede c0x0000 (---------------)  + I yachiyo
+	0x002808c8, // n0x0edf c0x0000 (---------------)  + I yamagata
+	0x00386686, // n0x0ee0 c0x0000 (---------------)  + I yawara
+	0x0024e8c4, // n0x0ee1 c0x0000 (---------------)  + I yuki
+	0x0035e047, // n0x0ee2 c0x0000 (---------------)  + I anamizu
+	0x00344045, // n0x0ee3 c0x0000 (---------------)  + I hakui
+	0x0034a747, // n0x0ee4 c0x0000 (---------------)  + I hakusan
+	0x00200fc4, // n0x0ee5 c0x0000 (---------------)  + I kaga
+	0x0033d046, // n0x0ee6 c0x0000 (---------------)  + I kahoku
+	0x0021a748, // n0x0ee7 c0x0000 (---------------)  + I kanazawa
+	0x00295d48, // n0x0ee8 c0x0000 (---------------)  + I kawakita
+	0x002aa707, // n0x0ee9 c0x0000 (---------------)  + I komatsu
+	0x002546c8, // n0x0eea c0x0000 (---------------)  + I nakanoto
+	0x002b4305, // n0x0eeb c0x0000 (---------------)  + I nanao
+	0x0020a544, // n0x0eec c0x0000 (---------------)  + I nomi
+	0x00265508, // n0x0eed c0x0000 (---------------)  + I nonoichi
+	0x002547c4, // n0x0eee c0x0000 (---------------)  + I noto
+	0x00216905, // n0x0eef c0x0000 (---------------)  + I shika
+	0x002eeb44, // n0x0ef0 c0x0000 (---------------)  + I suzu
+	0x002304c7, // n0x0ef1 c0x0000 (---------------)  + I tsubata
+	0x00288347, // n0x0ef2 c0x0000 (---------------)  + I tsurugi
+	0x00281948, // n0x0ef3 c0x0000 (---------------)  + I uchinada
+	0x002a2f86, // n0x0ef4 c0x0000 (---------------)  + I wajima
+	0x00214c45, // n0x0ef5 c0x0000 (---------------)  + I fudai
+	0x0027a6c8, // n0x0ef6 c0x0000 (---------------)  + I fujisawa
+	0x00356648, // n0x0ef7 c0x0000 (---------------)  + I hanamaki
+	0x0029eac9, // n0x0ef8 c0x0000 (---------------)  + I hiraizumi
+	0x0021d4c6, // n0x0ef9 c0x0000 (---------------)  + I hirono
+	0x00236408, // n0x0efa c0x0000 (---------------)  + I ichinohe
+	0x002820ca, // n0x0efb c0x0000 (---------------)  + I ichinoseki
+	0x002f5fc8, // n0x0efc c0x0000 (---------------)  + I iwaizumi
+	0x002d8485, // n0x0efd c0x0000 (---------------)  + I iwate
+	0x00224706, // n0x0efe c0x0000 (---------------)  + I joboji
+	0x0028d888, // n0x0eff c0x0000 (---------------)  + I kamaishi
+	0x002fe60a, // n0x0f00 c0x0000 (---------------)  + I kanegasaki
+	0x00271b47, // n0x0f01 c0x0000 (---------------)  + I karumai
+	0x002864c5, // n0x0f02 c0x0000 (---------------)  + I kawai
+	0x00294308, // n0x0f03 c0x0000 (---------------)  + I kitakami
+	0x00371504, // n0x0f04 c0x0000 (---------------)  + I kuji
+	0x0036b286, // n0x0f05 c0x0000 (---------------)  + I kunohe
+	0x002bb088, // n0x0f06 c0x0000 (---------------)  + I kuzumaki
+	0x0020a5c6, // n0x0f07 c0x0000 (---------------)  + I miyako
+	0x002ea148, // n0x0f08 c0x0000 (---------------)  + I mizusawa
+	0x0022aa47, // n0x0f09 c0x0000 (---------------)  + I morioka
+	0x002072c6, // n0x0f0a c0x0000 (---------------)  + I ninohe
+	0x0037f944, // n0x0f0b c0x0000 (---------------)  + I noda
+	0x002db247, // n0x0f0c c0x0000 (---------------)  + I ofunato
+	0x00342084, // n0x0f0d c0x0000 (---------------)  + I oshu
+	0x002b6947, // n0x0f0e c0x0000 (---------------)  + I otsuchi
+	0x0023848d, // n0x0f0f c0x0000 (---------------)  + I rikuzentakata
+	0x00203845, // n0x0f10 c0x0000 (---------------)  + I shiwa
+	0x002b108b, // n0x0f11 c0x0000 (---------------)  + I shizukuishi
+	0x002a0a46, // n0x0f12 c0x0000 (---------------)  + I sumita
+	0x00252c88, // n0x0f13 c0x0000 (---------------)  + I tanohata
+	0x003895c4, // n0x0f14 c0x0000 (---------------)  + I tono
+	0x00276f06, // n0x0f15 c0x0000 (---------------)  + I yahaba
+	0x0027ce46, // n0x0f16 c0x0000 (---------------)  + I yamada
+	0x002088c7, // n0x0f17 c0x0000 (---------------)  + I ayagawa
+	0x002953cd, // n0x0f18 c0x0000 (---------------)  + I higashikagawa
+	0x00322787, // n0x0f19 c0x0000 (---------------)  + I kanonji
+	0x00339cc8, // n0x0f1a c0x0000 (---------------)  + I kotohira
+	0x00366045, // n0x0f1b c0x0000 (---------------)  + I manno
+	0x00297bc8, // n0x0f1c c0x0000 (---------------)  + I marugame
+	0x002c0886, // n0x0f1d c0x0000 (---------------)  + I mitoyo
+	0x002b4388, // n0x0f1e c0x0000 (---------------)  + I naoshima
+	0x00213bc6, // n0x0f1f c0x0000 (---------------)  + I sanuki
+	0x0032f6c7, // n0x0f20 c0x0000 (---------------)  + I tadotsu
+	0x0021f709, // n0x0f21 c0x0000 (---------------)  + I takamatsu
+	0x003895c7, // n0x0f22 c0x0000 (---------------)  + I tonosho
+	0x00287508, // n0x0f23 c0x0000 (---------------)  + I uchinomi
+	0x00273885, // n0x0f24 c0x0000 (---------------)  + I utazu
+	0x0021c188, // n0x0f25 c0x0000 (---------------)  + I zentsuji
+	0x00309245, // n0x0f26 c0x0000 (---------------)  + I akune
+	0x00240f85, // n0x0f27 c0x0000 (---------------)  + I amami
+	0x002e4bc5, // n0x0f28 c0x0000 (---------------)  + I hioki
+	0x00223543, // n0x0f29 c0x0000 (---------------)  + I isa
+	0x00282c44, // n0x0f2a c0x0000 (---------------)  + I isen
+	0x002802c5, // n0x0f2b c0x0000 (---------------)  + I izumi
+	0x00276189, // n0x0f2c c0x0000 (---------------)  + I kagoshima
+	0x002b2786, // n0x0f2d c0x0000 (---------------)  + I kanoya
+	0x002d2cc8, // n0x0f2e c0x0000 (---------------)  + I kawanabe
+	0x002fe805, // n0x0f2f c0x0000 (---------------)  + I kinko
+	0x0030b707, // n0x0f30 c0x0000 (---------------)  + I kouyama
+	0x0032f9ca, // n0x0f31 c0x0000 (---------------)  + I makurazaki
+	0x002bf509, // n0x0f32 c0x0000 (---------------)  + I matsumoto
+	0x002b15ca, // n0x0f33 c0x0000 (---------------)  + I minamitane
+	0x002cbe48, // n0x0f34 c0x0000 (---------------)  + I nakatane
+	0x0021efcc, // n0x0f35 c0x0000 (---------------)  + I nishinoomote
+	0x0028294d, // n0x0f36 c0x0000 (---------------)  + I satsumasendai
+	0x00315283, // n0x0f37 c0x0000 (---------------)  + I soo
+	0x002ea048, // n0x0f38 c0x0000 (---------------)  + I tarumizu
+	0x00206685, // n0x0f39 c0x0000 (---------------)  + I yusui
+	0x00354d46, // n0x0f3a c0x0000 (---------------)  + I aikawa
+	0x00377dc6, // n0x0f3b c0x0000 (---------------)  + I atsugi
+	0x0024d085, // n0x0f3c c0x0000 (---------------)  + I ayase
+	0x0028cb89, // n0x0f3d c0x0000 (---------------)  + I chigasaki
+	0x00325545, // n0x0f3e c0x0000 (---------------)  + I ebina
+	0x0027a6c8, // n0x0f3f c0x0000 (---------------)  + I fujisawa
+	0x0025ad86, // n0x0f40 c0x0000 (---------------)  + I hadano
+	0x00339046, // n0x0f41 c0x0000 (---------------)  + I hakone
+	0x002a01c9, // n0x0f42 c0x0000 (---------------)  + I hiratsuka
+	0x00385e87, // n0x0f43 c0x0000 (---------------)  + I isehara
+	0x002fdec6, // n0x0f44 c0x0000 (---------------)  + I kaisei
+	0x0032f948, // n0x0f45 c0x0000 (---------------)  + I kamakura
+	0x00206008, // n0x0f46 c0x0000 (---------------)  + I kiyokawa
+	0x002d0bc7, // n0x0f47 c0x0000 (---------------)  + I matsuda
+	0x0022840e, // n0x0f48 c0x0000 (---------------)  + I minamiashigara
+	0x002c0ac5, // n0x0f49 c0x0000 (---------------)  + I miura
+	0x00272185, // n0x0f4a c0x0000 (---------------)  + I nakai
+	0x0020a4c8, // n0x0f4b c0x0000 (---------------)  + I ninomiya
+	0x00384a47, // n0x0f4c c0x0000 (---------------)  + I odawara
+	0x00207e42, // n0x0f4d c0x0000 (---------------)  + I oi
+	0x002b8604, // n0x0f4e c0x0000 (---------------)  + I oiso
+	0x003a68ca, // n0x0f4f c0x0000 (---------------)  + I sagamihara
+	0x002b6d08, // n0x0f50 c0x0000 (---------------)  + I samukawa
+	0x00283806, // n0x0f51 c0x0000 (---------------)  + I tsukui
+	0x002982c8, // n0x0f52 c0x0000 (---------------)  + I yamakita
+	0x0028f086, // n0x0f53 c0x0000 (---------------)  + I yamato
+	0x00327d48, // n0x0f54 c0x0000 (---------------)  + I yokosuka
+	0x002abfc8, // n0x0f55 c0x0000 (---------------)  + I yugawara
+	0x00240f44, // n0x0f56 c0x0000 (---------------)  + I zama
+	0x0032a845, // n0x0f57 c0x0000 (---------------)  + I zushi
+	0x00686744, // n0x0f58 c0x0001 (---------------)  ! I city
+	0x00686744, // n0x0f59 c0x0001 (---------------)  ! I city
+	0x00686744, // n0x0f5a c0x0001 (---------------)  ! I city
+	0x00201dc3, // n0x0f5b c0x0000 (---------------)  + I aki
+	0x00239606, // n0x0f5c c0x0000 (---------------)  + I geisei
+	0x0027ab86, // n0x0f5d c0x0000 (---------------)  + I hidaka
+	0x0029cc4c, // n0x0f5e c0x0000 (---------------)  + I higashitsuno
+	0x00207303, // n0x0f5f c0x0000 (---------------)  + I ino
+	0x00281286, // n0x0f60 c0x0000 (---------------)  + I kagami
+	0x00216544, // n0x0f61 c0x0000 (---------------)  + I kami
+	0x002c1c08, // n0x0f62 c0x0000 (---------------)  + I kitagawa
+	0x002cb145, // n0x0f63 c0x0000 (---------------)  + I kochi
+	0x003a69c6, // n0x0f64 c0x0000 (---------------)  + I mihara
+	0x002b3848, // n0x0f65 c0x0000 (---------------)  + I motoyama
+	0x002ce6c6, // n0x0f66 c0x0000 (---------------)  + I muroto
+	0x00205b06, // n0x0f67 c0x0000 (---------------)  + I nahari
+	0x00365cc8, // n0x0f68 c0x0000 (---------------)  + I nakamura
+	0x002a0cc7, // n0x0f69 c0x0000 (---------------)  + I nankoku
+	0x00227f89, // n0x0f6a c0x0000 (---------------)  + I nishitosa
+	0x0036be4a, // n0x0f6b c0x0000 (---------------)  + I niyodogawa
+	0x00248784, // n0x0f6c c0x0000 (---------------)  + I ochi
+	0x002060c5, // n0x0f6d c0x0000 (---------------)  + I okawa
+	0x0025bb45, // n0x0f6e c0x0000 (---------------)  + I otoyo
+	0x0021f306, // n0x0f6f c0x0000 (---------------)  + I otsuki
+	0x00248a46, // n0x0f70 c0x0000 (---------------)  + I sakawa
+	0x002a66c6, // n0x0f71 c0x0000 (---------------)  + I sukumo
+	0x002e9346, // n0x0f72 c0x0000 (---------------)  + I susaki
+	0x002280c4, // n0x0f73 c0x0000 (---------------)  + I tosa
+	0x002280cb, // n0x0f74 c0x0000 (---------------)  + I tosashimizu
+	0x00247dc4, // n0x0f75 c0x0000 (---------------)  + I toyo
+	0x0020d485, // n0x0f76 c0x0000 (---------------)  + I tsuno
+	0x002ab485, // n0x0f77 c0x0000 (---------------)  + I umaji
+	0x00280646, // n0x0f78 c0x0000 (---------------)  + I yasuda
+	0x00202348, // n0x0f79 c0x0000 (---------------)  + I yusuhara
+	0x00282807, // n0x0f7a c0x0000 (---------------)  + I amakusa
+	0x0030be84, // n0x0f7b c0x0000 (---------------)  + I arao
+	0x00264783, // n0x0f7c c0x0000 (---------------)  + I aso
+	0x00371005, // n0x0f7d c0x0000 (---------------)  + I choyo
+	0x0024ad87, // n0x0f7e c0x0000 (---------------)  + I gyokuto
+	0x002a41c9, // n0x0f7f c0x0000 (---------------)  + I hitoyoshi
+	0x0028270b, // n0x0f80 c0x0000 (---------------)  + I kamiamakusa
+	0x002a8a87, // n0x0f81 c0x0000 (---------------)  + I kashima
+	0x0022c9c7, // n0x0f82 c0x0000 (---------------)  + I kikuchi
+	0x002d8744, // n0x0f83 c0x0000 (---------------)  + I kosa
+	0x002b3748, // n0x0f84 c0x0000 (---------------)  + I kumamoto
+	0x002aa987, // n0x0f85 c0x0000 (---------------)  + I mashiki
+	0x002a4406, // n0x0f86 c0x0000 (---------------)  + I mifune
+	0x0024e648, // n0x0f87 c0x0000 (---------------)  + I minamata
+	0x002a68cb, // n0x0f88 c0x0000 (---------------)  + I minamioguni
+	0x003608c6, // n0x0f89 c0x0000 (---------------)  + I nagasu
+	0x00212149, // n0x0f8a c0x0000 (---------------)  + I nishihara
+	0x002a6a45, // n0x0f8b c0x0000 (---------------)  + I oguni
+	0x00300a43, // n0x0f8c c0x0000 (---------------)  + I ozu
+	0x002bf5c6, // n0x0f8d c0x0000 (---------------)  + I sumoto
+	0x0022a948, // n0x0f8e c0x0000 (---------------)  + I takamori
+	0x00212703, // n0x0f8f c0x0000 (---------------)  + I uki
+	0x0024ae83, // n0x0f90 c0x0000 (---------------)  + I uto
+	0x00223bc6, // n0x0f91 c0x0000 (---------------)  + I yamaga
+	0x0028f086, // n0x0f92 c0x0000 (---------------)  + I yamato
+	0x00382d0a, // n0x0f93 c0x0000 (---------------)  + I yatsushiro
+	0x0027c5c5, // n0x0f94 c0x0000 (---------------)  + I ayabe
+	0x0027cc8b, // n0x0f95 c0x0000 (---------------)  + I fukuchiyama
+	0x0029d84b, // n0x0f96 c0x0000 (---------------)  + I higashiyama
+	0x00229943, // n0x0f97 c0x0000 (---------------)  + I ide
+	0x0021cc03, // n0x0f98 c0x0000 (---------------)  + I ine
+	0x002adb84, // n0x0f99 c0x0000 (---------------)  + I joyo
+	0x0022ad47, // n0x0f9a c0x0000 (---------------)  + I kameoka
+	0x0022a9c4, // n0x0f9b c0x0000 (---------------)  + I kamo
+	0x00201e04, // n0x0f9c c0x0000 (---------------)  + I kita
+	0x00342404, // n0x0f9d c0x0000 (---------------)  + I kizu
+	0x002f62c8, // n0x0f9e c0x0000 (---------------)  + I kumiyama
+	0x002ce048, // n0x0f9f c0x0000 (---------------)  + I kyotamba
+	0x0031f2c9, // n0x0fa0 c0x0000 (---------------)  + I kyotanabe
+	0x00341c88, // n0x0fa1 c0x0000 (---------------)  + I kyotango
+	0x002d1847, // n0x0fa2 c0x0000 (---------------)  + I maizuru
+	0x00228406, // n0x0fa3 c0x0000 (---------------)  + I minami
+	0x002d290f, // n0x0fa4 c0x0000 (---------------)  + I minamiyamashiro
+	0x002c0c06, // n0x0fa5 c0x0000 (---------------)  + I miyazu
+	0x002cb0c4, // n0x0fa6 c0x0000 (---------------)  + I muko
+	0x002cde8a, // n0x0fa7 c0x0000 (---------------)  + I nagaokakyo
+	0x0024ac87, // n0x0fa8 c0x0000 (---------------)  + I nakagyo
+	0x00206c06, // n0x0fa9 c0x0000 (---------------)  + I nantan
+	0x0028ea09, // n0x0faa c0x0000 (---------------)  + I oyamazaki
+	0x0031f245, // n0x0fab c0x0000 (---------------)  + I sakyo
+	0x0022cc05, // n0x0fac c0x0000 (---------------)  + I seika
+	0x0031f386, // n0x0fad c0x0000 (---------------)  + I tanabe
+	0x0021c2c3, // n0x0fae c0x0000 (---------------)  + I uji
+	0x00371549, // n0x0faf c0x0000 (---------------)  + I ujitawara
+	0x0021a646, // n0x0fb0 c0x0000 (---------------)  + I wazuka
+	0x0022af89, // n0x0fb1 c0x0000 (---------------)  + I yamashina
+	0x0038f146, // n0x0fb2 c0x0000 (---------------)  + I yawata
+	0x002bf185, // n0x0fb3 c0x0000 (---------------)  + I asahi
+	0x002236c5, // n0x0fb4 c0x0000 (---------------)  + I inabe
+	0x00204683, // n0x0fb5 c0x0000 (---------------)  + I ise
+	0x0022ae88, // n0x0fb6 c0x0000 (---------------)  + I kameyama
+	0x0039f7c7, // n0x0fb7 c0x0000 (---------------)  + I kawagoe
+	0x002f5c84, // n0x0fb8 c0x0000 (---------------)  + I kiho
+	0x0021f408, // n0x0fb9 c0x0000 (---------------)  + I kisosaki
+	0x002da084, // n0x0fba c0x0000 (---------------)  + I kiwa
+	0x002b9886, // n0x0fbb c0x0000 (---------------)  + I komono
+	0x00383786, // n0x0fbc c0x0000 (---------------)  + I kumano
+	0x00243e46, // n0x0fbd c0x0000 (---------------)  + I kuwana
+	0x002c6249, // n0x0fbe c0x0000 (---------------)  + I matsusaka
+	0x002be885, // n0x0fbf c0x0000 (---------------)  + I meiwa
+	0x002da306, // n0x0fc0 c0x0000 (---------------)  + I mihama
+	0x0025b189, // n0x0fc1 c0x0000 (---------------)  + I minamiise
+	0x002bfd46, // n0x0fc2 c0x0000 (---------------)  + I misugi
+	0x002d2a06, // n0x0fc3 c0x0000 (---------------)  + I miyama
+	0x0037fcc6, // n0x0fc4 c0x0000 (---------------)  + I nabari
+	0x0020ef45, // n0x0fc5 c0x0000 (---------------)  + I shima
+	0x002eeb46, // n0x0fc6 c0x0000 (---------------)  + I suzuka
+	0x0032f6c4, // n0x0fc7 c0x0000 (---------------)  + I tado
+	0x00289e05, // n0x0fc8 c0x0000 (---------------)  + I taiki
+	0x002b8f84, // n0x0fc9 c0x0000 (---------------)  + I taki
+	0x003037c6, // n0x0fca c0x0000 (---------------)  + I tamaki
+	0x00395ec4, // n0x0fcb c0x0000 (---------------)  + I toba
+	0x00208c83, // n0x0fcc c0x0000 (---------------)  + I tsu
+	0x00286185, // n0x0fcd c0x0000 (---------------)  + I udono
+	0x0023b908, // n0x0fce c0x0000 (---------------)  + I ureshino
+	0x00351b87, // n0x0fcf c0x0000 (---------------)  + I watarai
+	0x002b1f89, // n0x0fd0 c0x0000 (---------------)  + I yokkaichi
+	0x002863c8, // n0x0fd1 c0x0000 (---------------)  + I furukawa
+	0x00297811, // n0x0fd2 c0x0000 (---------------)  + I higashimatsushima
+	0x0022c7ca, // n0x0fd3 c0x0000 (---------------)  + I ishinomaki
+	0x0022f147, // n0x0fd4 c0x0000 (---------------)  + I iwanuma
+	0x0039fd06, // n0x0fd5 c0x0000 (---------------)  + I kakuda
+	0x00216544, // n0x0fd6 c0x0000 (---------------)  + I kami
+	0x002b9088, // n0x0fd7 c0x0000 (---------------)  + I kawasaki
+	0x002935c9, // n0x0fd8 c0x0000 (---------------)  + I kesennuma
+	0x002a8bc8, // n0x0fd9 c0x0000 (---------------)  + I marumori
+	0x002979ca, // n0x0fda c0x0000 (---------------)  + I matsushima
+	0x002a740d, // n0x0fdb c0x0000 (---------------)  + I minamisanriku
+	0x0022f486, // n0x0fdc c0x0000 (---------------)  + I misato
+	0x00365dc6, // n0x0fdd c0x0000 (---------------)  + I murata
+	0x002db306, // n0x0fde c0x0000 (---------------)  + I natori
+	0x0037e6c7, // n0x0fdf c0x0000 (---------------)  + I ogawara
+	0x0029ef85, // n0x0fe0 c0x0000 (---------------)  + I ohira
+	0x003508c7, // n0x0fe1 c0x0000 (---------------)  + I onagawa
+	0x0021f4c5, // n0x0fe2 c0x0000 (---------------)  + I osaki
+	0x002a5784, // n0x0fe3 c0x0000 (---------------)  + I rifu
+	0x002a9286, // n0x0fe4 c0x0000 (---------------)  + I semine
+	0x00321bc7, // n0x0fe5 c0x0000 (---------------)  + I shibata
+	0x0037124d, // n0x0fe6 c0x0000 (---------------)  + I shichikashuku
+	0x0028d7c7, // n0x0fe7 c0x0000 (---------------)  + I shikama
+	0x0026ebc8, // n0x0fe8 c0x0000 (---------------)  + I shiogama
+	0x0027a9c9, // n0x0fe9 c0x0000 (---------------)  + I shiroishi
+	0x00224606, // n0x0fea c0x0000 (---------------)  + I tagajo
+	0x0023b045, // n0x0feb c0x0000 (---------------)  + I taiwa
+	0x00216044, // n0x0fec c0x0000 (---------------)  + I tome
+	0x00266086, // n0x0fed c0x0000 (---------------)  + I tomiya
+	0x00350a06, // n0x0fee c0x0000 (---------------)  + I wakuya
+	0x002b6e86, // n0x0fef c0x0000 (---------------)  + I watari
+	0x0029ae08, // n0x0ff0 c0x0000 (---------------)  + I yamamoto
+	0x00212d43, // n0x0ff1 c0x0000 (---------------)  + I zao
+	0x002088c3, // n0x0ff2 c0x0000 (---------------)  + I aya
+	0x00328105, // n0x0ff3 c0x0000 (---------------)  + I ebino
+	0x00337286, // n0x0ff4 c0x0000 (---------------)  + I gokase
+	0x002abf85, // n0x0ff5 c0x0000 (---------------)  + I hyuga
+	0x00245948, // n0x0ff6 c0x0000 (---------------)  + I kadogawa
+	0x0029c60a, // n0x0ff7 c0x0000 (---------------)  + I kawaminami
+	0x002ddbc4, // n0x0ff8 c0x0000 (---------------)  + I kijo
+	0x002c1c08, // n0x0ff9 c0x0000 (---------------)  + I kitagawa
+	0x00295fc8, // n0x0ffa c0x0000 (---------------)  + I kitakata
+	0x00280487, // n0x0ffb c0x0000 (---------------)  + I kitaura
+	0x002fe8c9, // n0x0ffc c0x0000 (---------------)  + I kobayashi
+	0x002b3448, // n0x0ffd c0x0000 (---------------)  + I kunitomi
+	0x0029a047, // n0x0ffe c0x0000 (---------------)  + I kushima
+	0x00294c06, // n0x0fff c0x0000 (---------------)  + I mimata
+	0x0020a5ca, // n0x1000 c0x0000 (---------------)  + I miyakonojo
+	0x00266108, // n0x1001 c0x0000 (---------------)  + I miyazaki
+	0x002bd509, // n0x1002 c0x0000 (---------------)  + I morotsuka
+	0x002869c8, // n0x1003 c0x0000 (---------------)  + I nichinan
+	0x0021c809, // n0x1004 c0x0000 (---------------)  + I nishimera
+	0x002bd987, // n0x1005 c0x0000 (---------------)  + I nobeoka
+	0x00341b45, // n0x1006 c0x0000 (---------------)  + I saito
+	0x002a1746, // n0x1007 c0x0000 (---------------)  + I shiiba
+	0x0029b188, // n0x1008 c0x0000 (---------------)  + I shintomi
+	0x00252e08, // n0x1009 c0x0000 (---------------)  + I takaharu
+	0x0022b388, // n0x100a c0x0000 (---------------)  + I takanabe
+	0x00216a48, // n0x100b c0x0000 (---------------)  + I takazaki
+	0x0020d485, // n0x100c c0x0000 (---------------)  + I tsuno
+	0x00201544, // n0x100d c0x0000 (---------------)  + I achi
+	0x0039f4c8, // n0x100e c0x0000 (---------------)  + I agematsu
+	0x00206d04, // n0x100f c0x0000 (---------------)  + I anan
+	0x00395b04, // n0x1010 c0x0000 (---------------)  + I aoki
+	0x002bf185, // n0x1011 c0x0000 (---------------)  + I asahi
+	0x0028ffc7, // n0x1012 c0x0000 (---------------)  + I azumino
+	0x00201a09, // n0x1013 c0x0000 (---------------)  + I chikuhoku
+	0x002086c7, // n0x1014 c0x0000 (---------------)  + I chikuma
+	0x0020db85, // n0x1015 c0x0000 (---------------)  + I chino
+	0x00278286, // n0x1016 c0x0000 (---------------)  + I fujimi
+	0x0033bb06, // n0x1017 c0x0000 (---------------)  + I hakuba
+	0x00202444, // n0x1018 c0x0000 (---------------)  + I hara
+	0x002a0506, // n0x1019 c0x0000 (---------------)  + I hiraya
+	0x00214a84, // n0x101a c0x0000 (---------------)  + I iida
+	0x0025cc86, // n0x101b c0x0000 (---------------)  + I iijima
+	0x0039e786, // n0x101c c0x0000 (---------------)  + I iiyama
+	0x00212546, // n0x101d c0x0000 (---------------)  + I iizuna
+	0x00202585, // n0x101e c0x0000 (---------------)  + I ikeda
+	0x00245807, // n0x101f c0x0000 (---------------)  + I ikusaka
+	0x002013c3, // n0x1020 c0x0000 (---------------)  + I ina
+	0x00249f89, // n0x1021 c0x0000 (---------------)  + I karuizawa
+	0x002fdbc8, // n0x1022 c0x0000 (---------------)  + I kawakami
+	0x0021f404, // n0x1023 c0x0000 (---------------)  + I kiso
+	0x0032fbcd, // n0x1024 c0x0000 (---------------)  + I kisofukushima
+	0x00295e48, // n0x1025 c0x0000 (---------------)  + I kitaaiki
+	0x0028e748, // n0x1026 c0x0000 (---------------)  + I komagane
+	0x002bd486, // n0x1027 c0x0000 (---------------)  + I komoro
+	0x0021f809, // n0x1028 c0x0000 (---------------)  + I matsukawa
+	0x002bf509, // n0x1029 c0x0000 (---------------)  + I matsumoto
+	0x002b6685, // n0x102a c0x0000 (---------------)  + I miasa
+	0x0029c70a, // n0x102b c0x0000 (---------------)  + I minamiaiki
+	0x0027f80a, // n0x102c c0x0000 (---------------)  + I minamimaki
+	0x0028850c, // n0x102d c0x0000 (---------------)  + I minamiminowa
+	0x00288686, // n0x102e c0x0000 (---------------)  + I minowa
+	0x00278b46, // n0x102f c0x0000 (---------------)  + I miyada
+	0x002c0d86, // n0x1030 c0x0000 (---------------)  + I miyota
+	0x00257009, // n0x1031 c0x0000 (---------------)  + I mochizuki
+	0x00354f86, // n0x1032 c0x0000 (---------------)  + I nagano
+	0x00291bc6, // n0x1033 c0x0000 (---------------)  + I nagawa
+	0x00325606, // n0x1034 c0x0000 (---------------)  + I nagiso
+	0x002ac8c8, // n0x1035 c0x0000 (---------------)  + I nakagawa
+	0x002546c6, // n0x1036 c0x0000 (---------------)  + I nakano
+	0x002c658b, // n0x1037 c0x0000 (---------------)  + I nozawaonsen
+	0x00290145, // n0x1038 c0x0000 (---------------)  + I obuse
+	0x00245a05, // n0x1039 c0x0000 (---------------)  + I ogawa
+	0x00278dc5, // n0x103a c0x0000 (---------------)  + I okaya
+	0x002014c6, // n0x103b c0x0000 (---------------)  + I omachi
+	0x0020a583, // n0x103c c0x0000 (---------------)  + I omi
+	0x00243dc6, // n0x103d c0x0000 (---------------)  + I ookuwa
+	0x0028d747, // n0x103e c0x0000 (---------------)  + I ooshika
+	0x002b8f45, // n0x103f c0x0000 (---------------)  + I otaki
+	0x0025bc45, // n0x1040 c0x0000 (---------------)  + I otari
+	0x002dd385, // n0x1041 c0x0000 (---------------)  + I sakae
+	0x00318606, // n0x1042 c0x0000 (---------------)  + I sakaki
+	0x002b6744, // n0x1043 c0x0000 (---------------)  + I saku
+	0x00369d86, // n0x1044 c0x0000 (---------------)  + I sakuho
+	0x0027b309, // n0x1045 c0x0000 (---------------)  + I shimosuwa
+	0x0020134c, // n0x1046 c0x0000 (---------------)  + I shinanomachi
+	0x002a54c8, // n0x1047 c0x0000 (---------------)  + I shiojiri
+	0x0027b444, // n0x1048 c0x0000 (---------------)  + I suwa
+	0x002ee7c6, // n0x1049 c0x0000 (---------------)  + I suzaka
+	0x002a0b46, // n0x104a c0x0000 (---------------)  + I takagi
+	0x0022a948, // n0x104b c0x0000 (---------------)  + I takamori
+	0x002c0148, // n0x104c c0x0000 (---------------)  + I takayama
+	0x00201249, // n0x104d c0x0000 (---------------)  + I tateshina
+	0x0020d407, // n0x104e c0x0000 (---------------)  + I tatsuno
+	0x002ae7c9, // n0x104f c0x0000 (---------------)  + I togakushi
+	0x0026fa46, // n0x1050 c0x0000 (---------------)  + I togura
+	0x0022f404, // n0x1051 c0x0000 (---------------)  + I tomi
+	0x0020e184, // n0x1052 c0x0000 (---------------)  + I ueda
+	0x0024a344, // n0x1053 c0x0000 (---------------)  + I wada
+	0x002808c8, // n0x1054 c0x0000 (---------------)  + I yamagata
+	0x0020184a, // n0x1055 c0x0000 (---------------)  + I yamanouchi
+	0x0034c986, // n0x1056 c0x0000 (---------------)  + I yasaka
+	0x00353407, // n0x1057 c0x0000 (---------------)  + I yasuoka
+	0x00311d87, // n0x1058 c0x0000 (---------------)  + I chijiwa
+	0x0036b785, // n0x1059 c0x0000 (---------------)  + I futsu
+	0x0028de84, // n0x105a c0x0000 (---------------)  + I goto
+	0x0028bb06, // n0x105b c0x0000 (---------------)  + I hasami
+	0x00339dc6, // n0x105c c0x0000 (---------------)  + I hirado
+	0x0023be03, // n0x105d c0x0000 (---------------)  + I iki
+	0x002fda07, // n0x105e c0x0000 (---------------)  + I isahaya
+	0x00330e48, // n0x105f c0x0000 (---------------)  + I kawatana
+	0x002b67ca, // n0x1060 c0x0000 (---------------)  + I kuchinotsu
+	0x002c9f88, // n0x1061 c0x0000 (---------------)  + I matsuura
+	0x002dda48, // n0x1062 c0x0000 (---------------)  + I nagasaki
+	0x00395f05, // n0x1063 c0x0000 (---------------)  + I obama
+	0x0037ed85, // n0x1064 c0x0000 (---------------)  + I omura
+	0x002ae705, // n0x1065 c0x0000 (---------------)  + I oseto
+	0x0036bb46, // n0x1066 c0x0000 (---------------)  + I saikai
+	0x003a3f06, // n0x1067 c0x0000 (---------------)  + I sasebo
+	0x00218945, // n0x1068 c0x0000 (---------------)  + I seihi
+	0x002ec949, // n0x1069 c0x0000 (---------------)  + I shimabara
+	0x0028dc8c, // n0x106a c0x0000 (---------------)  + I shinkamigoto
+	0x00240187, // n0x106b c0x0000 (---------------)  + I togitsu
+	0x00297a48, // n0x106c c0x0000 (---------------)  + I tsushima
+	0x0028c145, // n0x106d c0x0000 (---------------)  + I unzen
+	0x00686744, // n0x106e c0x0001 (---------------)  ! I city
+	0x00259644, // n0x106f c0x0000 (---------------)  + I ando
+	0x002b13c4, // n0x1070 c0x0000 (---------------)  + I gose
+	0x0020dcc6, // n0x1071 c0x0000 (---------------)  + I heguri
+	0x0029e3ce, // n0x1072 c0x0000 (---------------)  + I higashiyoshino
+	0x0022cc87, // n0x1073 c0x0000 (---------------)  + I ikaruga
+	0x00296ec5, // n0x1074 c0x0000 (---------------)  + I ikoma
+	0x0028ee8c, // n0x1075 c0x0000 (---------------)  + I kamikitayama
+	0x002d9f47, // n0x1076 c0x0000 (---------------)  + I kanmaki
+	0x00321b47, // n0x1077 c0x0000 (---------------)  + I kashiba
+	0x00398f89, // n0x1078 c0x0000 (---------------)  + I kashihara
+	0x00219349, // n0x1079 c0x0000 (---------------)  + I katsuragi
+	0x002864c5, // n0x107a c0x0000 (---------------)  + I kawai
+	0x002fdbc8, // n0x107b c0x0000 (---------------)  + I kawakami
+	0x002bdc49, // n0x107c c0x0000 (---------------)  + I kawanishi
+	0x002d6e45, // n0x107d c0x0000 (---------------)  + I koryo
+	0x002b8e88, // n0x107e c0x0000 (---------------)  + I kurotaki
+	0x002c6b46, // n0x107f c0x0000 (---------------)  + I mitsue
+	0x002d2306, // n0x1080 c0x0000 (---------------)  + I miyake
+	0x002c8a04, // n0x1081 c0x0000 (---------------)  + I nara
+	0x003281c8, // n0x1082 c0x0000 (---------------)  + I nosegawa
+	0x002247c3, // n0x1083 c0x0000 (---------------)  + I oji
+	0x00209204, // n0x1084 c0x0000 (---------------)  + I ouda
+	0x00371085, // n0x1085 c0x0000 (---------------)  + I oyodo
+	0x00307fc7, // n0x1086 c0x0000 (---------------)  + I sakurai
+	0x00202c85, // n0x1087 c0x0000 (---------------)  + I sango
+	0x00281f89, // n0x1088 c0x0000 (---------------)  + I shimoichi
+	0x0026784d, // n0x1089 c0x0000 (---------------)  + I shimokitayama
+	0x0033bd46, // n0x108a c0x0000 (---------------)  + I shinjo
+	0x002647c4, // n0x108b c0x0000 (---------------)  + I soni
+	0x00294d08, // n0x108c c0x0000 (---------------)  + I takatori
+	0x002784ca, // n0x108d c0x0000 (---------------)  + I tawaramoto
+	0x002177c7, // n0x108e c0x0000 (---------------)  + I tenkawa
+	0x003460c5, // n0x108f c0x0000 (---------------)  + I tenri
+	0x00209243, // n0x1090 c0x0000 (---------------)  + I uda
+	0x0029da0e, // n0x1091 c0x0000 (---------------)  + I yamatokoriyama
+	0x0028f08c, // n0x1092 c0x0000 (---------------)  + I yamatotakada
+	0x002fa407, // n0x1093 c0x0000 (---------------)  + I yamazoe
+	0x0029e587, // n0x1094 c0x0000 (---------------)  + I yoshino
+	0x00201003, // n0x1095 c0x0000 (---------------)  + I aga
+	0x00354fc5, // n0x1096 c0x0000 (---------------)  + I agano
+	0x002b13c5, // n0x1097 c0x0000 (---------------)  + I gosen
+	0x00298688, // n0x1098 c0x0000 (---------------)  + I itoigawa
+	0x00294149, // n0x1099 c0x0000 (---------------)  + I izumozaki
+	0x00292e46, // n0x109a c0x0000 (---------------)  + I joetsu
+	0x0022a9c4, // n0x109b c0x0000 (---------------)  + I kamo
+	0x0022f086, // n0x109c c0x0000 (---------------)  + I kariwa
+	0x00205dcb, // n0x109d c0x0000 (---------------)  + I kashiwazaki
+	0x002c598c, // n0x109e c0x0000 (---------------)  + I minamiuonuma
+	0x002ebdc7, // n0x109f c0x0000 (---------------)  + I mitsuke
+	0x002cae05, // n0x10a0 c0x0000 (---------------)  + I muika
+	0x00383248, // n0x10a1 c0x0000 (---------------)  + I murakami
+	0x002d0985, // n0x10a2 c0x0000 (---------------)  + I myoko
+	0x002cde87, // n0x10a3 c0x0000 (---------------)  + I nagaoka
+	0x0023ff87, // n0x10a4 c0x0000 (---------------)  + I niigata
+	0x0024f385, // n0x10a5 c0x0000 (---------------)  + I ojiya
+	0x0020a583, // n0x10a6 c0x0000 (---------------)  + I omi
+	0x00360584, // n0x10a7 c0x0000 (---------------)  + I sado
+	0x00203f85, // n0x10a8 c0x0000 (---------------)  + I sanjo
+	0x002e6c05, // n0x10a9 c0x0000 (---------------)  + I seiro
+	0x002e6c06, // n0x10aa c0x0000 (---------------)  + I seirou
+	0x0026c588, // n0x10ab c0x0000 (---------------)  + I sekikawa
+	0x00321bc7, // n0x10ac c0x0000 (---------------)  + I shibata
+	0x003780c6, // n0x10ad c0x0000 (---------------)  + I tagami
+	0x00354c46, // n0x10ae c0x0000 (---------------)  + I tainai
+	0x002e4b06, // n0x10af c0x0000 (---------------)  + I tochio
+	0x00297189, // n0x10b0 c0x0000 (---------------)  + I tokamachi
+	0x00208c87, // n0x10b1 c0x0000 (---------------)  + I tsubame
+	0x00292cc6, // n0x10b2 c0x0000 (---------------)  + I tsunan
+	0x002c5b06, // n0x10b3 c0x0000 (---------------)  + I uonuma
+	0x0024f446, // n0x10b4 c0x0000 (---------------)  + I yahiko
+	0x002a8945, // n0x10b5 c0x0000 (---------------)  + I yoita
+	0x00217246, // n0x10b6 c0x0000 (---------------)  + I yuzawa
+	0x0038de05, // n0x10b7 c0x0000 (---------------)  + I beppu
+	0x002d1f48, // n0x10b8 c0x0000 (---------------)  + I bungoono
+	0x00292a0b, // n0x10b9 c0x0000 (---------------)  + I bungotakada
+	0x0028b906, // n0x10ba c0x0000 (---------------)  + I hasama
+	0x00311dc4, // n0x10bb c0x0000 (---------------)  + I hiji
+	0x002fe3c9, // n0x10bc c0x0000 (---------------)  + I himeshima
+	0x002a27c4, // n0x10bd c0x0000 (---------------)  + I hita
+	0x002c6ac8, // n0x10be c0x0000 (---------------)  + I kamitsue
+	0x0028adc7, // n0x10bf c0x0000 (---------------)  + I kokonoe
+	0x00283fc4, // n0x10c0 c0x0000 (---------------)  + I kuju
+	0x002b2a08, // n0x10c1 c0x0000 (---------------)  + I kunisaki
+	0x002ba1c4, // n0x10c2 c0x0000 (---------------)  + I kusu
+	0x002a8984, // n0x10c3 c0x0000 (---------------)  + I oita
+	0x00286f45, // n0x10c4 c0x0000 (---------------)  + I saiki
+	0x00305a86, // n0x10c5 c0x0000 (---------------)  + I taketa
+	0x002f6207, // n0x10c6 c0x0000 (---------------)  + I tsukumi
+	0x0022b983, // n0x10c7 c0x0000 (---------------)  + I usa
+	0x0029d4c5, // n0x10c8 c0x0000 (---------------)  + I usuki
+	0x002bc144, // n0x10c9 c0x0000 (---------------)  + I yufu
+	0x002721c6, // n0x10ca c0x0000 (---------------)  + I akaiwa
+	0x002b6708, // n0x10cb c0x0000 (---------------)  + I asakuchi
+	0x00330b85, // n0x10cc c0x0000 (---------------)  + I bizen
+	0x0028fa49, // n0x10cd c0x0000 (---------------)  + I hayashima
+	0x0020c145, // n0x10ce c0x0000 (---------------)  + I ibara
+	0x002bbb48, // n0x10cf c0x0000 (---------------)  + I kagamino
+	0x00320d87, // n0x10d0 c0x0000 (---------------)  + I kasaoka
+	0x003809c8, // n0x10d1 c0x0000 (---------------)  + I kibichuo
+	0x002b1dc7, // n0x10d2 c0x0000 (---------------)  + I kumenan
+	0x0037e0c9, // n0x10d3 c0x0000 (---------------)  + I kurashiki
+	0x0031d046, // n0x10d4 c0x0000 (---------------)  + I maniwa
+	0x00347a06, // n0x10d5 c0x0000 (---------------)  + I misaki
+	0x00269404, // n0x10d6 c0x0000 (---------------)  + I nagi
+	0x00294b45, // n0x10d7 c0x0000 (---------------)  + I niimi
+	0x002f48cc, // n0x10d8 c0x0000 (---------------)  + I nishiawakura
+	0x00278dc7, // n0x10d9 c0x0000 (---------------)  + I okayama
+	0x002791c7, // n0x10da c0x0000 (---------------)  + I satosho
+	0x00311c48, // n0x10db c0x0000 (---------------)  + I setouchi
+	0x0033bd46, // n0x10dc c0x0000 (---------------)  + I shinjo
+	0x0029eec4, // n0x10dd c0x0000 (---------------)  + I shoo
+	0x00323cc4, // n0x10de c0x0000 (---------------)  + I soja
+	0x00280a49, // n0x10df c0x0000 (---------------)  + I takahashi
+	0x002c0e86, // n0x10e0 c0x0000 (---------------)  + I tamano
+	0x0021ec47, // n0x10e1 c0x0000 (---------------)  + I tsuyama
+	0x00208504, // n0x10e2 c0x0000 (---------------)  + I wake
+	0x002b2886, // n0x10e3 c0x0000 (---------------)  + I yakage
+	0x00320985, // n0x10e4 c0x0000 (---------------)  + I aguni
+	0x002a2ac7, // n0x10e5 c0x0000 (---------------)  + I ginowan
+	0x002c6506, // n0x10e6 c0x0000 (---------------)  + I ginoza
+	0x0025c649, // n0x10e7 c0x0000 (---------------)  + I gushikami
+	0x0027f647, // n0x10e8 c0x0000 (---------------)  + I haebaru
+	0x00268047, // n0x10e9 c0x0000 (---------------)  + I higashi
+	0x002a0046, // n0x10ea c0x0000 (---------------)  + I hirara
+	0x002452c5, // n0x10eb c0x0000 (---------------)  + I iheya
+	0x0027e248, // n0x10ec c0x0000 (---------------)  + I ishigaki
+	0x0021a4c8, // n0x10ed c0x0000 (---------------)  + I ishikawa
+	0x00242b46, // n0x10ee c0x0000 (---------------)  + I itoman
+	0x00330bc5, // n0x10ef c0x0000 (---------------)  + I izena
+	0x00331c86, // n0x10f0 c0x0000 (---------------)  + I kadena
+	0x002154c3, // n0x10f1 c0x0000 (---------------)  + I kin
+	0x00298509, // n0x10f2 c0x0000 (---------------)  + I kitadaito
+	0x002a644e, // n0x10f3 c0x0000 (---------------)  + I kitanakagusuku
+	0x002b1ac8, // n0x10f4 c0x0000 (---------------)  + I kumejima
+	0x002da188, // n0x10f5 c0x0000 (---------------)  + I kunigami
+	0x0024294b, // n0x10f6 c0x0000 (---------------)  + I minamidaito
+	0x0028fc86, // n0x10f7 c0x0000 (---------------)  + I motobu
+	0x002486c4, // n0x10f8 c0x0000 (---------------)  + I nago
+	0x00205b04, // n0x10f9 c0x0000 (---------------)  + I naha
+	0x002a654a, // n0x10fa c0x0000 (---------------)  + I nakagusuku
+	0x00217e07, // n0x10fb c0x0000 (---------------)  + I nakijin
+	0x00292d85, // n0x10fc c0x0000 (---------------)  + I nanjo
+	0x00212149, // n0x10fd c0x0000 (---------------)  + I nishihara
+	0x002b8285, // n0x10fe c0x0000 (---------------)  + I ogimi
+	0x00395b47, // n0x10ff c0x0000 (---------------)  + I okinawa
+	0x00301304, // n0x1100 c0x0000 (---------------)  + I onna
+	0x00383e87, // n0x1101 c0x0000 (---------------)  + I shimoji
+	0x0022f308, // n0x1102 c0x0000 (---------------)  + I taketomi
+	0x002b0046, // n0x1103 c0x0000 (---------------)  + I tarama
+	0x00342249, // n0x1104 c0x0000 (---------------)  + I tokashiki
+	0x002b354a, // n0x1105 c0x0000 (---------------)  + I tomigusuku
+	0x00217d86, // n0x1106 c0x0000 (---------------)  + I tonaki
+	0x00295986, // n0x1107 c0x0000 (---------------)  + I urasoe
+	0x002ab405, // n0x1108 c0x0000 (---------------)  + I uruma
+	0x00373d05, // n0x1109 c0x0000 (---------------)  + I yaese
+	0x00229a47, // n0x110a c0x0000 (---------------)  + I yomitan
+	0x00249888, // n0x110b c0x0000 (---------------)  + I yonabaru
+	0x003208c8, // n0x110c c0x0000 (---------------)  + I yonaguni
+	0x00240f46, // n0x110d c0x0000 (---------------)  + I zamami
+	0x00223745, // n0x110e c0x0000 (---------------)  + I abeno
+	0x002487ce, // n0x110f c0x0000 (---------------)  + I chihayaakasaka
+	0x0030ba84, // n0x1110 c0x0000 (---------------)  + I chuo
+	0x00242ac5, // n0x1111 c0x0000 (---------------)  + I daito
+	0x00277c09, // n0x1112 c0x0000 (---------------)  + I fujiidera
+	0x0026b5c8, // n0x1113 c0x0000 (---------------)  + I habikino
+	0x003a1c46, // n0x1114 c0x0000 (---------------)  + I hannan
+	0x0029aa8c, // n0x1115 c0x0000 (---------------)  + I higashiosaka
+	0x0029c210, // n0x1116 c0x0000 (---------------)  + I higashisumiyoshi
+	0x0029e00f, // n0x1117 c0x0000 (---------------)  + I higashiyodogawa
+	0x0029efc8, // n0x1118 c0x0000 (---------------)  + I hirakata
+	0x002c1ac7, // n0x1119 c0x0000 (---------------)  + I ibaraki
+	0x00202585, // n0x111a c0x0000 (---------------)  + I ikeda
+	0x002802c5, // n0x111b c0x0000 (---------------)  + I izumi
+	0x002f6089, // n0x111c c0x0000 (---------------)  + I izumiotsu
+	0x00294509, // n0x111d c0x0000 (---------------)  + I izumisano
+	0x0021e5c6, // n0x111e c0x0000 (---------------)  + I kadoma
+	0x002fa147, // n0x111f c0x0000 (---------------)  + I kaizuka
+	0x0038ad85, // n0x1120 c0x0000 (---------------)  + I kanan
+	0x002037c9, // n0x1121 c0x0000 (---------------)  + I kashiwara
+	0x0032c486, // n0x1122 c0x0000 (---------------)  + I katano
+	0x00354dcd, // n0x1123 c0x0000 (---------------)  + I kawachinagano
+	0x00287009, // n0x1124 c0x0000 (---------------)  + I kishiwada
+	0x00201e04, // n0x1125 c0x0000 (---------------)  + I kita
+	0x002b1848, // n0x1126 c0x0000 (---------------)  + I kumatori
+	0x0039f589, // n0x1127 c0x0000 (---------------)  + I matsubara
+	0x0034cb46, // n0x1128 c0x0000 (---------------)  + I minato
+	0x00278385, // n0x1129 c0x0000 (---------------)  + I minoh
+	0x00347a06, // n0x112a c0x0000 (---------------)  + I misaki
+	0x0030bf89, // n0x112b c0x0000 (---------------)  + I moriguchi
+	0x00320008, // n0x112c c0x0000 (---------------)  + I neyagawa
+	0x00211805, // n0x112d c0x0000 (---------------)  + I nishi
+	0x0026c504, // n0x112e c0x0000 (---------------)  + I nose
+	0x0029ac4b, // n0x112f c0x0000 (---------------)  + I osakasayama
+	0x0034ca05, // n0x1130 c0x0000 (---------------)  + I sakai
+	0x0029ad86, // n0x1131 c0x0000 (---------------)  + I sayama
+	0x00282c86, // n0x1132 c0x0000 (---------------)  + I sennan
+	0x0024c046, // n0x1133 c0x0000 (---------------)  + I settsu
+	0x0038428b, // n0x1134 c0x0000 (---------------)  + I shijonawate
+	0x0028fb49, // n0x1135 c0x0000 (---------------)  + I shimamoto
+	0x00218c85, // n0x1136 c0x0000 (---------------)  + I suita
+	0x00380787, // n0x1137 c0x0000 (---------------)  + I tadaoka
+	0x0022c746, // n0x1138 c0x0000 (---------------)  + I taishi
+	0x00238746, // n0x1139 c0x0000 (---------------)  + I tajiri
+	0x00281e48, // n0x113a c0x0000 (---------------)  + I takaishi
+	0x00305b89, // n0x113b c0x0000 (---------------)  + I takatsuki
+	0x0026e98c, // n0x113c c0x0000 (---------------)  + I tondabayashi
+	0x0024ab88, // n0x113d c0x0000 (---------------)  + I toyonaka
+	0x0037b006, // n0x113e c0x0000 (---------------)  + I toyono
+	0x00341743, // n0x113f c0x0000 (---------------)  + I yao
+	0x00249246, // n0x1140 c0x0000 (---------------)  + I ariake
+	0x0027ff85, // n0x1141 c0x0000 (---------------)  + I arita
+	0x0027cfc8, // n0x1142 c0x0000 (---------------)  + I fukudomi
+	0x00223146, // n0x1143 c0x0000 (---------------)  + I genkai
+	0x002a2d08, // n0x1144 c0x0000 (---------------)  + I hamatama
+	0x0024ba45, // n0x1145 c0x0000 (---------------)  + I hizen
+	0x0027bc05, // n0x1146 c0x0000 (---------------)  + I imari
+	0x00321008, // n0x1147 c0x0000 (---------------)  + I kamimine
+	0x002eec47, // n0x1148 c0x0000 (---------------)  + I kanzaki
+	0x00377d07, // n0x1149 c0x0000 (---------------)  + I karatsu
+	0x002a8a87, // n0x114a c0x0000 (---------------)  + I kashima
+	0x0021f588, // n0x114b c0x0000 (---------------)  + I kitagata
+	0x0028ebc8, // n0x114c c0x0000 (---------------)  + I kitahata
+	0x0024edc6, // n0x114d c0x0000 (---------------)  + I kiyama
+	0x00303607, // n0x114e c0x0000 (---------------)  + I kouhoku
+	0x0036ad87, // n0x114f c0x0000 (---------------)  + I kyuragi
+	0x0027fe4a, // n0x1150 c0x0000 (---------------)  + I nishiarita
+	0x00213483, // n0x1151 c0x0000 (---------------)  + I ogi
+	0x002014c6, // n0x1152 c0x0000 (---------------)  + I omachi
+	0x00201985, // n0x1153 c0x0000 (---------------)  + I ouchi
+	0x00238904, // n0x1154 c0x0000 (---------------)  + I saga
+	0x0027a9c9, // n0x1155 c0x0000 (---------------)  + I shiroishi
+	0x0037e044, // n0x1156 c0x0000 (---------------)  + I taku
+	0x002a1204, // n0x1157 c0x0000 (---------------)  + I tara
+	0x002a09c4, // n0x1158 c0x0000 (---------------)  + I tosu
+	0x0029e58b, // n0x1159 c0x0000 (---------------)  + I yoshinogari
+	0x0039f707, // n0x115a c0x0000 (---------------)  + I arakawa
+	0x00248a05, // n0x115b c0x0000 (---------------)  + I asaka
+	0x00292888, // n0x115c c0x0000 (---------------)  + I chichibu
+	0x00278286, // n0x115d c0x0000 (---------------)  + I fujimi
+	0x00278288, // n0x115e c0x0000 (---------------)  + I fujimino
+	0x0027c506, // n0x115f c0x0000 (---------------)  + I fukaya
+	0x00289385, // n0x1160 c0x0000 (---------------)  + I hanno
+	0x0028a805, // n0x1161 c0x0000 (---------------)  + I hanyu
+	0x0028c486, // n0x1162 c0x0000 (---------------)  + I hasuda
+	0x0028d4c8, // n0x1163 c0x0000 (---------------)  + I hatogaya
+	0x0028e948, // n0x1164 c0x0000 (---------------)  + I hatoyama
+	0x0027ab86, // n0x1165 c0x0000 (---------------)  + I hidaka
+	0x002926cf, // n0x1166 c0x0000 (---------------)  + I higashichichibu
+	0x00297fd0, // n0x1167 c0x0000 (---------------)  + I higashimatsuyama
+	0x0038e545, // n0x1168 c0x0000 (---------------)  + I honjo
+	0x002013c3, // n0x1169 c0x0000 (---------------)  + I ina
+	0x00251c85, // n0x116a c0x0000 (---------------)  + I iruma
+	0x002ff488, // n0x116b c0x0000 (---------------)  + I iwatsuki
+	0x00294409, // n0x116c c0x0000 (---------------)  + I kamiizumi
+	0x002e8008, // n0x116d c0x0000 (---------------)  + I kamikawa
+	0x0034cdc8, // n0x116e c0x0000 (---------------)  + I kamisato
+	0x00207888, // n0x116f c0x0000 (---------------)  + I kasukabe
+	0x0039f7c7, // n0x1170 c0x0000 (---------------)  + I kawagoe
+	0x00277f49, // n0x1171 c0x0000 (---------------)  + I kawaguchi
+	0x002a2f08, // n0x1172 c0x0000 (---------------)  + I kawajima
+	0x002b7444, // n0x1173 c0x0000 (---------------)  + I kazo
+	0x002a0848, // n0x1174 c0x0000 (---------------)  + I kitamoto
+	0x00289b89, // n0x1175 c0x0000 (---------------)  + I koshigaya
+	0x0030a447, // n0x1176 c0x0000 (---------------)  + I kounosu
+	0x002a63c4, // n0x1177 c0x0000 (---------------)  + I kuki
+	0x00208788, // n0x1178 c0x0000 (---------------)  + I kumagaya
+	0x002455ca, // n0x1179 c0x0000 (---------------)  + I matsubushi
+	0x002d8c06, // n0x117a c0x0000 (---------------)  + I minano
+	0x0022f486, // n0x117b c0x0000 (---------------)  + I misato
+	0x0021d389, // n0x117c c0x0000 (---------------)  + I miyashiro
+	0x0029c447, // n0x117d c0x0000 (---------------)  + I miyoshi
+	0x002c6ec8, // n0x117e c0x0000 (---------------)  + I moroyama
+	0x0038e088, // n0x117f c0x0000 (---------------)  + I nagatoro
+	0x00208388, // n0x1180 c0x0000 (---------------)  + I namegawa
+	0x00352f45, // n0x1181 c0x0000 (---------------)  + I niiza
+	0x00374cc5, // n0x1182 c0x0000 (---------------)  + I ogano
+	0x00245a05, // n0x1183 c0x0000 (---------------)  + I ogawa
+	0x002b1385, // n0x1184 c0x0000 (---------------)  + I ogose
+	0x0035ce07, // n0x1185 c0x0000 (---------------)  + I okegawa
+	0x0020a585, // n0x1186 c0x0000 (---------------)  + I omiya
+	0x002b8f45, // n0x1187 c0x0000 (---------------)  + I otaki
+	0x0033f406, // n0x1188 c0x0000 (---------------)  + I ranzan
+	0x002e7f47, // n0x1189 c0x0000 (---------------)  + I ryokami
+	0x002d9247, // n0x118a c0x0000 (---------------)  + I saitama
+	0x002458c6, // n0x118b c0x0000 (---------------)  + I sakado
+	0x002cc385, // n0x118c c0x0000 (---------------)  + I satte
+	0x0029ad86, // n0x118d c0x0000 (---------------)  + I sayama
+	0x002aaa05, // n0x118e c0x0000 (---------------)  + I shiki
+	0x00306048, // n0x118f c0x0000 (---------------)  + I shiraoka
+	0x002e22c4, // n0x1190 c0x0000 (---------------)  + I soka
+	0x002bfdc6, // n0x1191 c0x0000 (---------------)  + I sugito
+	0x00265904, // n0x1192 c0x0000 (---------------)  + I toda
+	0x00222908, // n0x1193 c0x0000 (---------------)  + I tokigawa
+	0x0038584a, // n0x1194 c0x0000 (---------------)  + I tokorozawa
+	0x0027b9cc, // n0x1195 c0x0000 (---------------)  + I tsurugashima
+	0x0020b6c5, // n0x1196 c0x0000 (---------------)  + I urawa
+	0x00203906, // n0x1197 c0x0000 (---------------)  + I warabi
+	0x0026eb46, // n0x1198 c0x0000 (---------------)  + I yashio
+	0x002296c6, // n0x1199 c0x0000 (---------------)  + I yokoze
+	0x002ff684, // n0x119a c0x0000 (---------------)  + I yono
+	0x00320c45, // n0x119b c0x0000 (---------------)  + I yorii
+	0x0027c347, // n0x119c c0x0000 (---------------)  + I yoshida
+	0x0029c4c9, // n0x119d c0x0000 (---------------)  + I yoshikawa
+	0x002a42c7, // n0x119e c0x0000 (---------------)  + I yoshimi
+	0x00686744, // n0x119f c0x0001 (---------------)  ! I city
+	0x00686744, // n0x11a0 c0x0001 (---------------)  ! I city
+	0x0030bd05, // n0x11a1 c0x0000 (---------------)  + I aisho
+	0x00228e04, // n0x11a2 c0x0000 (---------------)  + I gamo
+	0x0029a44a, // n0x11a3 c0x0000 (---------------)  + I higashiomi
+	0x00278106, // n0x11a4 c0x0000 (---------------)  + I hikone
+	0x0034cd44, // n0x11a5 c0x0000 (---------------)  + I koka
+	0x00206b85, // n0x11a6 c0x0000 (---------------)  + I konan
+	0x002fb505, // n0x11a7 c0x0000 (---------------)  + I kosei
+	0x00301bc4, // n0x11a8 c0x0000 (---------------)  + I koto
+	0x002828c7, // n0x11a9 c0x0000 (---------------)  + I kusatsu
+	0x0020c0c7, // n0x11aa c0x0000 (---------------)  + I maibara
+	0x002c60c8, // n0x11ab c0x0000 (---------------)  + I moriyama
+	0x0025e648, // n0x11ac c0x0000 (---------------)  + I nagahama
+	0x00211809, // n0x11ad c0x0000 (---------------)  + I nishiazai
+	0x0025ae88, // n0x11ae c0x0000 (---------------)  + I notogawa
+	0x0029a60b, // n0x11af c0x0000 (---------------)  + I omihachiman
+	0x0021f304, // n0x11b0 c0x0000 (---------------)  + I otsu
+	0x00337145, // n0x11b1 c0x0000 (---------------)  + I ritto
+	0x0027f545, // n0x11b2 c0x0000 (---------------)  + I ryuoh
+	0x002a8a09, // n0x11b3 c0x0000 (---------------)  + I takashima
+	0x00305b89, // n0x11b4 c0x0000 (---------------)  + I takatsuki
+	0x002fe2c8, // n0x11b5 c0x0000 (---------------)  + I torahime
+	0x0025b488, // n0x11b6 c0x0000 (---------------)  + I toyosato
+	0x00280644, // n0x11b7 c0x0000 (---------------)  + I yasu
+	0x002a0b85, // n0x11b8 c0x0000 (---------------)  + I akagi
+	0x00201883, // n0x11b9 c0x0000 (---------------)  + I ama
+	0x0021f2c5, // n0x11ba c0x0000 (---------------)  + I gotsu
+	0x002da386, // n0x11bb c0x0000 (---------------)  + I hamada
+	0x00293f8c, // n0x11bc c0x0000 (---------------)  + I higashiizumo
+	0x0021a546, // n0x11bd c0x0000 (---------------)  + I hikawa
+	0x002d7a86, // n0x11be c0x0000 (---------------)  + I hikimi
+	0x00294145, // n0x11bf c0x0000 (---------------)  + I izumo
+	0x00318688, // n0x11c0 c0x0000 (---------------)  + I kakinoki
+	0x002b1c46, // n0x11c1 c0x0000 (---------------)  + I masuda
+	0x0039fe86, // n0x11c2 c0x0000 (---------------)  + I matsue
+	0x0022f486, // n0x11c3 c0x0000 (---------------)  + I misato
+	0x0022058c, // n0x11c4 c0x0000 (---------------)  + I nishinoshima
+	0x002b7044, // n0x11c5 c0x0000 (---------------)  + I ohda
+	0x002e4c4a, // n0x11c6 c0x0000 (---------------)  + I okinoshima
+	0x003a1e08, // n0x11c7 c0x0000 (---------------)  + I okuizumo
+	0x00293dc7, // n0x11c8 c0x0000 (---------------)  + I shimane
+	0x0024e7c6, // n0x11c9 c0x0000 (---------------)  + I tamayu
+	0x00292f07, // n0x11ca c0x0000 (---------------)  + I tsuwano
+	0x002e0845, // n0x11cb c0x0000 (---------------)  + I unnan
+	0x00325346, // n0x11cc c0x0000 (---------------)  + I yakumo
+	0x0034fa06, // n0x11cd c0x0000 (---------------)  + I yasugi
+	0x00377bc7, // n0x11ce c0x0000 (---------------)  + I yatsuka
+	0x002b3244, // n0x11cf c0x0000 (---------------)  + I arai
+	0x002305c5, // n0x11d0 c0x0000 (---------------)  + I atami
+	0x00277c04, // n0x11d1 c0x0000 (---------------)  + I fuji
+	0x002a5807, // n0x11d2 c0x0000 (---------------)  + I fujieda
+	0x00277e48, // n0x11d3 c0x0000 (---------------)  + I fujikawa
+	0x002789ca, // n0x11d4 c0x0000 (---------------)  + I fujinomiya
+	0x0027ed47, // n0x11d5 c0x0000 (---------------)  + I fukuroi
+	0x00242cc7, // n0x11d6 c0x0000 (---------------)  + I gotemba
+	0x002c1a47, // n0x11d7 c0x0000 (---------------)  + I haibara
+	0x002d0ac9, // n0x11d8 c0x0000 (---------------)  + I hamamatsu
+	0x00293f8a, // n0x11d9 c0x0000 (---------------)  + I higashiizu
+	0x00228083, // n0x11da c0x0000 (---------------)  + I ito
+	0x00351b45, // n0x11db c0x0000 (---------------)  + I iwata
+	0x00212583, // n0x11dc c0x0000 (---------------)  + I izu
+	0x00342449, // n0x11dd c0x0000 (---------------)  + I izunokuni
+	0x002b9588, // n0x11de c0x0000 (---------------)  + I kakegawa
+	0x003061c7, // n0x11df c0x0000 (---------------)  + I kannami
+	0x002e8109, // n0x11e0 c0x0000 (---------------)  + I kawanehon
+	0x0021a5c6, // n0x11e1 c0x0000 (---------------)  + I kawazu
+	0x003a3c08, // n0x11e2 c0x0000 (---------------)  + I kikugawa
+	0x002d8745, // n0x11e3 c0x0000 (---------------)  + I kosai
+	0x0035674a, // n0x11e4 c0x0000 (---------------)  + I makinohara
+	0x002cf149, // n0x11e5 c0x0000 (---------------)  + I matsuzaki
+	0x0026e649, // n0x11e6 c0x0000 (---------------)  + I minamiizu
+	0x002bf3c7, // n0x11e7 c0x0000 (---------------)  + I mishima
+	0x002a8cc9, // n0x11e8 c0x0000 (---------------)  + I morimachi
+	0x00212448, // n0x11e9 c0x0000 (---------------)  + I nishiizu
+	0x002ee946, // n0x11ea c0x0000 (---------------)  + I numazu
+	0x0037e948, // n0x11eb c0x0000 (---------------)  + I omaezaki
+	0x00212e87, // n0x11ec c0x0000 (---------------)  + I shimada
+	0x002281c7, // n0x11ed c0x0000 (---------------)  + I shimizu
+	0x002c5e87, // n0x11ee c0x0000 (---------------)  + I shimoda
+	0x002b2608, // n0x11ef c0x0000 (---------------)  + I shizuoka
+	0x002ee646, // n0x11f0 c0x0000 (---------------)  + I susono
+	0x00245385, // n0x11f1 c0x0000 (---------------)  + I yaizu
+	0x0027c347, // n0x11f2 c0x0000 (---------------)  + I yoshida
+	0x00295488, // n0x11f3 c0x0000 (---------------)  + I ashikaga
+	0x00344d84, // n0x11f4 c0x0000 (---------------)  + I bato
+	0x0034ac04, // n0x11f5 c0x0000 (---------------)  + I haga
+	0x002fddc7, // n0x11f6 c0x0000 (---------------)  + I ichikai
+	0x002ac347, // n0x11f7 c0x0000 (---------------)  + I iwafune
+	0x002bdaca, // n0x11f8 c0x0000 (---------------)  + I kaminokawa
+	0x002ee8c6, // n0x11f9 c0x0000 (---------------)  + I kanuma
+	0x002fa28a, // n0x11fa c0x0000 (---------------)  + I karasuyama
+	0x002b8547, // n0x11fb c0x0000 (---------------)  + I kuroiso
+	0x0030b847, // n0x11fc c0x0000 (---------------)  + I mashiko
+	0x00241044, // n0x11fd c0x0000 (---------------)  + I mibu
+	0x00263904, // n0x11fe c0x0000 (---------------)  + I moka
+	0x00226bc6, // n0x11ff c0x0000 (---------------)  + I motegi
+	0x002ec144, // n0x1200 c0x0000 (---------------)  + I nasu
+	0x002ec14c, // n0x1201 c0x0000 (---------------)  + I nasushiobara
+	0x00203185, // n0x1202 c0x0000 (---------------)  + I nikko
+	0x00216889, // n0x1203 c0x0000 (---------------)  + I nishikata
+	0x00279884, // n0x1204 c0x0000 (---------------)  + I nogi
+	0x0029ef85, // n0x1205 c0x0000 (---------------)  + I ohira
+	0x00278448, // n0x1206 c0x0000 (---------------)  + I ohtawara
+	0x00250045, // n0x1207 c0x0000 (---------------)  + I oyama
+	0x00307fc6, // n0x1208 c0x0000 (---------------)  + I sakura
+	0x0020f744, // n0x1209 c0x0000 (---------------)  + I sano
+	0x0027e58a, // n0x120a c0x0000 (---------------)  + I shimotsuke
+	0x002a7c86, // n0x120b c0x0000 (---------------)  + I shioya
+	0x002579ca, // n0x120c c0x0000 (---------------)  + I takanezawa
+	0x00344e07, // n0x120d c0x0000 (---------------)  + I tochigi
+	0x00297645, // n0x120e c0x0000 (---------------)  + I tsuga
+	0x0021c2c5, // n0x120f c0x0000 (---------------)  + I ujiie
+	0x0036b7ca, // n0x1210 c0x0000 (---------------)  + I utsunomiya
+	0x002a0605, // n0x1211 c0x0000 (---------------)  + I yaita
+	0x0029eb86, // n0x1212 c0x0000 (---------------)  + I aizumi
+	0x00206d04, // n0x1213 c0x0000 (---------------)  + I anan
+	0x002add06, // n0x1214 c0x0000 (---------------)  + I ichiba
+	0x00229b05, // n0x1215 c0x0000 (---------------)  + I itano
+	0x00223206, // n0x1216 c0x0000 (---------------)  + I kainan
+	0x002aa70c, // n0x1217 c0x0000 (---------------)  + I komatsushima
+	0x002c704a, // n0x1218 c0x0000 (---------------)  + I matsushige
+	0x0027f904, // n0x1219 c0x0000 (---------------)  + I mima
+	0x00228406, // n0x121a c0x0000 (---------------)  + I minami
+	0x0029c447, // n0x121b c0x0000 (---------------)  + I miyoshi
+	0x002ca384, // n0x121c c0x0000 (---------------)  + I mugi
+	0x002ac8c8, // n0x121d c0x0000 (---------------)  + I nakagawa
+	0x00385746, // n0x121e c0x0000 (---------------)  + I naruto
+	0x00248649, // n0x121f c0x0000 (---------------)  + I sanagochi
+	0x002ad349, // n0x1220 c0x0000 (---------------)  + I shishikui
+	0x00299fc9, // n0x1221 c0x0000 (---------------)  + I tokushima
+	0x0036aa46, // n0x1222 c0x0000 (---------------)  + I wajiki
+	0x00212f86, // n0x1223 c0x0000 (---------------)  + I adachi
+	0x0037ea87, // n0x1224 c0x0000 (---------------)  + I akiruno
+	0x002ec888, // n0x1225 c0x0000 (---------------)  + I akishima
+	0x00212d89, // n0x1226 c0x0000 (---------------)  + I aogashima
+	0x0039f707, // n0x1227 c0x0000 (---------------)  + I arakawa
+	0x002b4186, // n0x1228 c0x0000 (---------------)  + I bunkyo
+	0x003005c7, // n0x1229 c0x0000 (---------------)  + I chiyoda
+	0x002db1c5, // n0x122a c0x0000 (---------------)  + I chofu
+	0x0030ba84, // n0x122b c0x0000 (---------------)  + I chuo
+	0x0037e647, // n0x122c c0x0000 (---------------)  + I edogawa
+	0x002bc1c5, // n0x122d c0x0000 (---------------)  + I fuchu
+	0x00286e85, // n0x122e c0x0000 (---------------)  + I fussa
+	0x002fc5c7, // n0x122f c0x0000 (---------------)  + I hachijo
+	0x0024f248, // n0x1230 c0x0000 (---------------)  + I hachioji
+	0x003831c6, // n0x1231 c0x0000 (---------------)  + I hamura
+	0x0029680d, // n0x1232 c0x0000 (---------------)  + I higashikurume
+	0x0029888f, // n0x1233 c0x0000 (---------------)  + I higashimurayama
+	0x0029d84d, // n0x1234 c0x0000 (---------------)  + I higashiyamato
+	0x0020dbc4, // n0x1235 c0x0000 (---------------)  + I hino
+	0x0023ba06, // n0x1236 c0x0000 (---------------)  + I hinode
+	0x002cfa08, // n0x1237 c0x0000 (---------------)  + I hinohara
+	0x003255c5, // n0x1238 c0x0000 (---------------)  + I inagi
+	0x00280008, // n0x1239 c0x0000 (---------------)  + I itabashi
+	0x0021ae8a, // n0x123a c0x0000 (---------------)  + I katsushika
+	0x00201e04, // n0x123b c0x0000 (---------------)  + I kita
+	0x002aaac6, // n0x123c c0x0000 (---------------)  + I kiyose
+	0x0039c647, // n0x123d c0x0000 (---------------)  + I kodaira
+	0x00226307, // n0x123e c0x0000 (---------------)  + I koganei
+	0x002a0d89, // n0x123f c0x0000 (---------------)  + I kokubunji
+	0x0037e905, // n0x1240 c0x0000 (---------------)  + I komae
+	0x00301bc4, // n0x1241 c0x0000 (---------------)  + I koto
+	0x0032a78a, // n0x1242 c0x0000 (---------------)  + I kouzushima
+	0x002b3009, // n0x1243 c0x0000 (---------------)  + I kunitachi
+	0x002a8dc7, // n0x1244 c0x0000 (---------------)  + I machida
+	0x00296ac6, // n0x1245 c0x0000 (---------------)  + I meguro
+	0x0034cb46, // n0x1246 c0x0000 (---------------)  + I minato
+	0x002a0ac6, // n0x1247 c0x0000 (---------------)  + I mitaka
+	0x0035e106, // n0x1248 c0x0000 (---------------)  + I mizuho
+	0x002cee0f, // n0x1249 c0x0000 (---------------)  + I musashimurayama
+	0x002cf8c9, // n0x124a c0x0000 (---------------)  + I musashino
+	0x002546c6, // n0x124b c0x0000 (---------------)  + I nakano
+	0x00256d06, // n0x124c c0x0000 (---------------)  + I nerima
+	0x00355a09, // n0x124d c0x0000 (---------------)  + I ogasawara
+	0x00303707, // n0x124e c0x0000 (---------------)  + I okutama
+	0x00213a83, // n0x124f c0x0000 (---------------)  + I ome
+	0x0020ef06, // n0x1250 c0x0000 (---------------)  + I oshima
+	0x00204083, // n0x1251 c0x0000 (---------------)  + I ota
+	0x0024cf48, // n0x1252 c0x0000 (---------------)  + I setagaya
+	0x00300407, // n0x1253 c0x0000 (---------------)  + I shibuya
+	0x0029f1c9, // n0x1254 c0x0000 (---------------)  + I shinagawa
+	0x00383608, // n0x1255 c0x0000 (---------------)  + I shinjuku
+	0x00377e48, // n0x1256 c0x0000 (---------------)  + I suginami
+	0x0036e146, // n0x1257 c0x0000 (---------------)  + I sumida
+	0x00223909, // n0x1258 c0x0000 (---------------)  + I tachikawa
+	0x002400c5, // n0x1259 c0x0000 (---------------)  + I taito
+	0x0024e7c4, // n0x125a c0x0000 (---------------)  + I tama
+	0x0024aec7, // n0x125b c0x0000 (---------------)  + I toshima
+	0x00257085, // n0x125c c0x0000 (---------------)  + I chizu
+	0x0020dbc4, // n0x125d c0x0000 (---------------)  + I hino
+	0x00248ac8, // n0x125e c0x0000 (---------------)  + I kawahara
+	0x002180c4, // n0x125f c0x0000 (---------------)  + I koge
+	0x00301bc7, // n0x1260 c0x0000 (---------------)  + I kotoura
+	0x0036fc86, // n0x1261 c0x0000 (---------------)  + I misasa
+	0x002e5a85, // n0x1262 c0x0000 (---------------)  + I nanbu
+	0x002869c8, // n0x1263 c0x0000 (---------------)  + I nichinan
+	0x0034ca0b, // n0x1264 c0x0000 (---------------)  + I sakaiminato
+	0x002f8b87, // n0x1265 c0x0000 (---------------)  + I tottori
+	0x0036ba46, // n0x1266 c0x0000 (---------------)  + I wakasa
+	0x002c0c84, // n0x1267 c0x0000 (---------------)  + I yazu
+	0x0030f5c6, // n0x1268 c0x0000 (---------------)  + I yonago
+	0x002bf185, // n0x1269 c0x0000 (---------------)  + I asahi
+	0x002bc1c5, // n0x126a c0x0000 (---------------)  + I fuchu
+	0x0027dfc9, // n0x126b c0x0000 (---------------)  + I fukumitsu
+	0x002824c9, // n0x126c c0x0000 (---------------)  + I funahashi
+	0x00228204, // n0x126d c0x0000 (---------------)  + I himi
+	0x00228245, // n0x126e c0x0000 (---------------)  + I imizu
+	0x00228445, // n0x126f c0x0000 (---------------)  + I inami
+	0x003565c6, // n0x1270 c0x0000 (---------------)  + I johana
+	0x002fdcc8, // n0x1271 c0x0000 (---------------)  + I kamiichi
+	0x002b7bc6, // n0x1272 c0x0000 (---------------)  + I kurobe
+	0x00330c8b, // n0x1273 c0x0000 (---------------)  + I nakaniikawa
+	0x0030138a, // n0x1274 c0x0000 (---------------)  + I namerikawa
+	0x00342185, // n0x1275 c0x0000 (---------------)  + I nanto
+	0x0028a886, // n0x1276 c0x0000 (---------------)  + I nyuzen
+	0x002f5985, // n0x1277 c0x0000 (---------------)  + I oyabe
+	0x00218d45, // n0x1278 c0x0000 (---------------)  + I taira
+	0x0028ed47, // n0x1279 c0x0000 (---------------)  + I takaoka
+	0x002040c8, // n0x127a c0x0000 (---------------)  + I tateyama
+	0x0025af04, // n0x127b c0x0000 (---------------)  + I toga
+	0x002b6586, // n0x127c c0x0000 (---------------)  + I tonami
+	0x0028e9c6, // n0x127d c0x0000 (---------------)  + I toyama
+	0x00212607, // n0x127e c0x0000 (---------------)  + I unazuki
+	0x00300a04, // n0x127f c0x0000 (---------------)  + I uozu
+	0x0027ce46, // n0x1280 c0x0000 (---------------)  + I yamada
+	0x0023ec85, // n0x1281 c0x0000 (---------------)  + I arida
+	0x0023ec89, // n0x1282 c0x0000 (---------------)  + I aridagawa
+	0x00213184, // n0x1283 c0x0000 (---------------)  + I gobo
+	0x0028e009, // n0x1284 c0x0000 (---------------)  + I hashimoto
+	0x0027ab86, // n0x1285 c0x0000 (---------------)  + I hidaka
+	0x002b9ac8, // n0x1286 c0x0000 (---------------)  + I hirogawa
+	0x00228445, // n0x1287 c0x0000 (---------------)  + I inami
+	0x00311e85, // n0x1288 c0x0000 (---------------)  + I iwade
+	0x00223206, // n0x1289 c0x0000 (---------------)  + I kainan
+	0x0026e889, // n0x128a c0x0000 (---------------)  + I kamitonda
+	0x00219349, // n0x128b c0x0000 (---------------)  + I katsuragi
+	0x002d7b06, // n0x128c c0x0000 (---------------)  + I kimino
+	0x0026b6c8, // n0x128d c0x0000 (---------------)  + I kinokawa
+	0x00267988, // n0x128e c0x0000 (---------------)  + I kitayama
+	0x002f5944, // n0x128f c0x0000 (---------------)  + I koya
+	0x0032dcc4, // n0x1290 c0x0000 (---------------)  + I koza
+	0x0032dcc8, // n0x1291 c0x0000 (---------------)  + I kozagawa
+	0x00316788, // n0x1292 c0x0000 (---------------)  + I kudoyama
+	0x002ae8c9, // n0x1293 c0x0000 (---------------)  + I kushimoto
+	0x002da306, // n0x1294 c0x0000 (---------------)  + I mihama
+	0x0022f486, // n0x1295 c0x0000 (---------------)  + I misato
+	0x0031408d, // n0x1296 c0x0000 (---------------)  + I nachikatsuura
+	0x00266d06, // n0x1297 c0x0000 (---------------)  + I shingu
+	0x002a9a49, // n0x1298 c0x0000 (---------------)  + I shirahama
+	0x00201685, // n0x1299 c0x0000 (---------------)  + I taiji
+	0x0031f386, // n0x129a c0x0000 (---------------)  + I tanabe
+	0x00223ac8, // n0x129b c0x0000 (---------------)  + I wakayama
+	0x00310745, // n0x129c c0x0000 (---------------)  + I yuasa
+	0x0036adc4, // n0x129d c0x0000 (---------------)  + I yura
+	0x002bf185, // n0x129e c0x0000 (---------------)  + I asahi
+	0x00281b48, // n0x129f c0x0000 (---------------)  + I funagata
+	0x0029a209, // n0x12a0 c0x0000 (---------------)  + I higashine
+	0x00277cc4, // n0x12a1 c0x0000 (---------------)  + I iide
+	0x0033d046, // n0x12a2 c0x0000 (---------------)  + I kahoku
+	0x0024ff0a, // n0x12a3 c0x0000 (---------------)  + I kaminoyama
+	0x002c7848, // n0x12a4 c0x0000 (---------------)  + I kaneyama
+	0x002bdc49, // n0x12a5 c0x0000 (---------------)  + I kawanishi
+	0x0029378a, // n0x12a6 c0x0000 (---------------)  + I mamurogawa
+	0x002e8086, // n0x12a7 c0x0000 (---------------)  + I mikawa
+	0x00298a48, // n0x12a8 c0x0000 (---------------)  + I murayama
+	0x002cdc45, // n0x12a9 c0x0000 (---------------)  + I nagai
+	0x002c9e08, // n0x12aa c0x0000 (---------------)  + I nakayama
+	0x002b1ec5, // n0x12ab c0x0000 (---------------)  + I nanyo
+	0x0021a489, // n0x12ac c0x0000 (---------------)  + I nishikawa
+	0x00361849, // n0x12ad c0x0000 (---------------)  + I obanazawa
+	0x00203282, // n0x12ae c0x0000 (---------------)  + I oe
+	0x002a6a45, // n0x12af c0x0000 (---------------)  + I oguni
+	0x0026f6c6, // n0x12b0 c0x0000 (---------------)  + I ohkura
+	0x0027aac7, // n0x12b1 c0x0000 (---------------)  + I oishida
+	0x00238905, // n0x12b2 c0x0000 (---------------)  + I sagae
+	0x002f8486, // n0x12b3 c0x0000 (---------------)  + I sakata
+	0x00310808, // n0x12b4 c0x0000 (---------------)  + I sakegawa
+	0x0033bd46, // n0x12b5 c0x0000 (---------------)  + I shinjo
+	0x00347f09, // n0x12b6 c0x0000 (---------------)  + I shirataka
+	0x002792c6, // n0x12b7 c0x0000 (---------------)  + I shonai
+	0x00281cc8, // n0x12b8 c0x0000 (---------------)  + I takahata
+	0x002a94c5, // n0x12b9 c0x0000 (---------------)  + I tendo
+	0x0026de86, // n0x12ba c0x0000 (---------------)  + I tozawa
+	0x0032f7c8, // n0x12bb c0x0000 (---------------)  + I tsuruoka
+	0x002808c8, // n0x12bc c0x0000 (---------------)  + I yamagata
+	0x0039e808, // n0x12bd c0x0000 (---------------)  + I yamanobe
+	0x00366688, // n0x12be c0x0000 (---------------)  + I yonezawa
+	0x00217244, // n0x12bf c0x0000 (---------------)  + I yuza
+	0x0022d843, // n0x12c0 c0x0000 (---------------)  + I abu
+	0x00348144, // n0x12c1 c0x0000 (---------------)  + I hagi
+	0x0022f006, // n0x12c2 c0x0000 (---------------)  + I hikari
+	0x002db204, // n0x12c3 c0x0000 (---------------)  + I hofu
+	0x002da0c7, // n0x12c4 c0x0000 (---------------)  + I iwakuni
+	0x0039fd89, // n0x12c5 c0x0000 (---------------)  + I kudamatsu
+	0x002c0485, // n0x12c6 c0x0000 (---------------)  + I mitou
+	0x0038e086, // n0x12c7 c0x0000 (---------------)  + I nagato
+	0x0020ef06, // n0x12c8 c0x0000 (---------------)  + I oshima
+	0x0026c3cb, // n0x12c9 c0x0000 (---------------)  + I shimonoseki
+	0x003420c6, // n0x12ca c0x0000 (---------------)  + I shunan
+	0x00316a86, // n0x12cb c0x0000 (---------------)  + I tabuse
+	0x0022f588, // n0x12cc c0x0000 (---------------)  + I tokuyama
+	0x0025bb86, // n0x12cd c0x0000 (---------------)  + I toyota
+	0x00297443, // n0x12ce c0x0000 (---------------)  + I ube
+	0x0020f9c3, // n0x12cf c0x0000 (---------------)  + I yuu
+	0x0030ba84, // n0x12d0 c0x0000 (---------------)  + I chuo
+	0x00236305, // n0x12d1 c0x0000 (---------------)  + I doshi
+	0x0036af47, // n0x12d2 c0x0000 (---------------)  + I fuefuki
+	0x00277e48, // n0x12d3 c0x0000 (---------------)  + I fujikawa
+	0x00277e4f, // n0x12d4 c0x0000 (---------------)  + I fujikawaguchiko
+	0x0027c24b, // n0x12d5 c0x0000 (---------------)  + I fujiyoshida
+	0x002fdac8, // n0x12d6 c0x0000 (---------------)  + I hayakawa
+	0x0033d0c6, // n0x12d7 c0x0000 (---------------)  + I hokuto
+	0x0026560e, // n0x12d8 c0x0000 (---------------)  + I ichikawamisato
+	0x00223203, // n0x12d9 c0x0000 (---------------)  + I kai
+	0x00240c84, // n0x12da c0x0000 (---------------)  + I kofu
+	0x00342045, // n0x12db c0x0000 (---------------)  + I koshu
+	0x00300146, // n0x12dc c0x0000 (---------------)  + I kosuge
+	0x0028bc0b, // n0x12dd c0x0000 (---------------)  + I minami-alps
+	0x00290086, // n0x12de c0x0000 (---------------)  + I minobu
+	0x002164c9, // n0x12df c0x0000 (---------------)  + I nakamichi
+	0x002e5a85, // n0x12e0 c0x0000 (---------------)  + I nanbu
+	0x00381e08, // n0x12e1 c0x0000 (---------------)  + I narusawa
+	0x0020c388, // n0x12e2 c0x0000 (---------------)  + I nirasaki
+	0x0021920c, // n0x12e3 c0x0000 (---------------)  + I nishikatsura
+	0x0029e5c6, // n0x12e4 c0x0000 (---------------)  + I oshino
+	0x0021f306, // n0x12e5 c0x0000 (---------------)  + I otsuki
+	0x00319905, // n0x12e6 c0x0000 (---------------)  + I showa
+	0x002872c8, // n0x12e7 c0x0000 (---------------)  + I tabayama
+	0x0027b9c5, // n0x12e8 c0x0000 (---------------)  + I tsuru
+	0x00387308, // n0x12e9 c0x0000 (---------------)  + I uenohara
+	0x0029dc8a, // n0x12ea c0x0000 (---------------)  + I yamanakako
+	0x002a15c9, // n0x12eb c0x0000 (---------------)  + I yamanashi
+	0x00686744, // n0x12ec c0x0001 (---------------)  ! I city
+	0x2e200742, // n0x12ed c0x00b8 (n0x12ee-n0x12ef)  o I co
+	0x000ffa08, // n0x12ee c0x0000 (---------------)  +   blogspot
+	0x00233503, // n0x12ef c0x0000 (---------------)  + I com
+	0x0023a783, // n0x12f0 c0x0000 (---------------)  + I edu
+	0x0026cc83, // n0x12f1 c0x0000 (---------------)  + I gov
+	0x00209003, // n0x12f2 c0x0000 (---------------)  + I mil
+	0x0021fe03, // n0x12f3 c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x12f4 c0x0000 (---------------)  + I org
+	0x00330b83, // n0x12f5 c0x0000 (---------------)  + I biz
+	0x00233503, // n0x12f6 c0x0000 (---------------)  + I com
+	0x0023a783, // n0x12f7 c0x0000 (---------------)  + I edu
+	0x0026cc83, // n0x12f8 c0x0000 (---------------)  + I gov
+	0x003a1244, // n0x12f9 c0x0000 (---------------)  + I info
+	0x0021fe03, // n0x12fa c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x12fb c0x0000 (---------------)  + I org
+	0x0023f743, // n0x12fc c0x0000 (---------------)  + I ass
+	0x002d4884, // n0x12fd c0x0000 (---------------)  + I asso
+	0x00233503, // n0x12fe c0x0000 (---------------)  + I com
+	0x0023d684, // n0x12ff c0x0000 (---------------)  + I coop
+	0x0023a783, // n0x1300 c0x0000 (---------------)  + I edu
+	0x0033d7c4, // n0x1301 c0x0000 (---------------)  + I gouv
+	0x0026cc83, // n0x1302 c0x0000 (---------------)  + I gov
+	0x00238bc7, // n0x1303 c0x0000 (---------------)  + I medecin
+	0x00209003, // n0x1304 c0x0000 (---------------)  + I mil
+	0x00201483, // n0x1305 c0x0000 (---------------)  + I nom
+	0x0025c988, // n0x1306 c0x0000 (---------------)  + I notaires
+	0x0022d1c3, // n0x1307 c0x0000 (---------------)  + I org
+	0x0034d60b, // n0x1308 c0x0000 (---------------)  + I pharmaciens
+	0x002e1043, // n0x1309 c0x0000 (---------------)  + I prd
+	0x00247506, // n0x130a c0x0000 (---------------)  + I presse
+	0x00200142, // n0x130b c0x0000 (---------------)  + I tm
+	0x002d1c8b, // n0x130c c0x0000 (---------------)  + I veterinaire
+	0x0023a783, // n0x130d c0x0000 (---------------)  + I edu
+	0x0026cc83, // n0x130e c0x0000 (---------------)  + I gov
+	0x0021fe03, // n0x130f c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x1310 c0x0000 (---------------)  + I org
+	0x00233503, // n0x1311 c0x0000 (---------------)  + I com
+	0x0023a783, // n0x1312 c0x0000 (---------------)  + I edu
+	0x0026cc83, // n0x1313 c0x0000 (---------------)  + I gov
+	0x0022d1c3, // n0x1314 c0x0000 (---------------)  + I org
+	0x0022b7c3, // n0x1315 c0x0000 (---------------)  + I rep
+	0x00203003, // n0x1316 c0x0000 (---------------)  + I tra
+	0x00201542, // n0x1317 c0x0000 (---------------)  + I ac
+	0x000ffa08, // n0x1318 c0x0000 (---------------)  +   blogspot
+	0x0022b945, // n0x1319 c0x0000 (---------------)  + I busan
+	0x003051c8, // n0x131a c0x0000 (---------------)  + I chungbuk
+	0x003113c8, // n0x131b c0x0000 (---------------)  + I chungnam
+	0x00200742, // n0x131c c0x0000 (---------------)  + I co
+	0x0024a3c5, // n0x131d c0x0000 (---------------)  + I daegu
+	0x00325007, // n0x131e c0x0000 (---------------)  + I daejeon
+	0x00200482, // n0x131f c0x0000 (---------------)  + I es
+	0x00216707, // n0x1320 c0x0000 (---------------)  + I gangwon
+	0x00202d42, // n0x1321 c0x0000 (---------------)  + I go
+	0x00242707, // n0x1322 c0x0000 (---------------)  + I gwangju
+	0x0030b509, // n0x1323 c0x0000 (---------------)  + I gyeongbuk
+	0x002cd808, // n0x1324 c0x0000 (---------------)  + I gyeonggi
+	0x00208209, // n0x1325 c0x0000 (---------------)  + I gyeongnam
+	0x0023f382, // n0x1326 c0x0000 (---------------)  + I hs
+	0x00268e07, // n0x1327 c0x0000 (---------------)  + I incheon
+	0x002d7884, // n0x1328 c0x0000 (---------------)  + I jeju
+	0x003250c7, // n0x1329 c0x0000 (---------------)  + I jeonbuk
+	0x00301287, // n0x132a c0x0000 (---------------)  + I jeonnam
+	0x002b5502, // n0x132b c0x0000 (---------------)  + I kg
+	0x00209003, // n0x132c c0x0000 (---------------)  + I mil
+	0x0020f702, // n0x132d c0x0000 (---------------)  + I ms
+	0x00202c02, // n0x132e c0x0000 (---------------)  + I ne
+	0x00200282, // n0x132f c0x0000 (---------------)  + I or
+	0x00207782, // n0x1330 c0x0000 (---------------)  + I pe
+	0x00207002, // n0x1331 c0x0000 (---------------)  + I re
+	0x00200702, // n0x1332 c0x0000 (---------------)  + I sc
+	0x00344345, // n0x1333 c0x0000 (---------------)  + I seoul
+	0x00259585, // n0x1334 c0x0000 (---------------)  + I ulsan
+	0x00233503, // n0x1335 c0x0000 (---------------)  + I com
+	0x0023a783, // n0x1336 c0x0000 (---------------)  + I edu
+	0x0026cc83, // n0x1337 c0x0000 (---------------)  + I gov
+	0x0021fe03, // n0x1338 c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x1339 c0x0000 (---------------)  + I org
+	0x00233503, // n0x133a c0x0000 (---------------)  + I com
+	0x0023a783, // n0x133b c0x0000 (---------------)  + I edu
+	0x0026cc83, // n0x133c c0x0000 (---------------)  + I gov
+	0x00209003, // n0x133d c0x0000 (---------------)  + I mil
+	0x0021fe03, // n0x133e c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x133f c0x0000 (---------------)  + I org
+	0x00000301, // n0x1340 c0x0000 (---------------)  +   c
+	0x00233503, // n0x1341 c0x0000 (---------------)  + I com
+	0x0023a783, // n0x1342 c0x0000 (---------------)  + I edu
+	0x0026cc83, // n0x1343 c0x0000 (---------------)  + I gov
+	0x003a1244, // n0x1344 c0x0000 (---------------)  + I info
+	0x00201603, // n0x1345 c0x0000 (---------------)  + I int
+	0x0021fe03, // n0x1346 c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x1347 c0x0000 (---------------)  + I org
+	0x00220f03, // n0x1348 c0x0000 (---------------)  + I per
+	0x00233503, // n0x1349 c0x0000 (---------------)  + I com
+	0x0023a783, // n0x134a c0x0000 (---------------)  + I edu
+	0x0026cc83, // n0x134b c0x0000 (---------------)  + I gov
+	0x0021fe03, // n0x134c c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x134d c0x0000 (---------------)  + I org
+	0x00200742, // n0x134e c0x0000 (---------------)  + I co
+	0x00233503, // n0x134f c0x0000 (---------------)  + I com
+	0x0023a783, // n0x1350 c0x0000 (---------------)  + I edu
+	0x0026cc83, // n0x1351 c0x0000 (---------------)  + I gov
+	0x0021fe03, // n0x1352 c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x1353 c0x0000 (---------------)  + I org
+	0x000ffa08, // n0x1354 c0x0000 (---------------)  +   blogspot
+	0x00201542, // n0x1355 c0x0000 (---------------)  + I ac
+	0x002bad84, // n0x1356 c0x0000 (---------------)  + I assn
+	0x00233503, // n0x1357 c0x0000 (---------------)  + I com
+	0x0023a783, // n0x1358 c0x0000 (---------------)  + I edu
+	0x0026cc83, // n0x1359 c0x0000 (---------------)  + I gov
+	0x00379ec3, // n0x135a c0x0000 (---------------)  + I grp
+	0x00234dc5, // n0x135b c0x0000 (---------------)  + I hotel
+	0x00201603, // n0x135c c0x0000 (---------------)  + I int
+	0x00322cc3, // n0x135d c0x0000 (---------------)  + I ltd
+	0x0021fe03, // n0x135e c0x0000 (---------------)  + I net
+	0x00202d03, // n0x135f c0x0000 (---------------)  + I ngo
+	0x0022d1c3, // n0x1360 c0x0000 (---------------)  + I org
+	0x00217443, // n0x1361 c0x0000 (---------------)  + I sch
+	0x00274803, // n0x1362 c0x0000 (---------------)  + I soc
+	0x00221a03, // n0x1363 c0x0000 (---------------)  + I web
+	0x00233503, // n0x1364 c0x0000 (---------------)  + I com
+	0x0023a783, // n0x1365 c0x0000 (---------------)  + I edu
+	0x0026cc83, // n0x1366 c0x0000 (---------------)  + I gov
+	0x0021fe03, // n0x1367 c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x1368 c0x0000 (---------------)  + I org
+	0x00200742, // n0x1369 c0x0000 (---------------)  + I co
+	0x0022d1c3, // n0x136a c0x0000 (---------------)  + I org
+	0x000ffa08, // n0x136b c0x0000 (---------------)  +   blogspot
+	0x0026cc83, // n0x136c c0x0000 (---------------)  + I gov
+	0x000ffa08, // n0x136d c0x0000 (---------------)  +   blogspot
+	0x002afc83, // n0x136e c0x0000 (---------------)  + I asn
+	0x00233503, // n0x136f c0x0000 (---------------)  + I com
+	0x00236cc4, // n0x1370 c0x0000 (---------------)  + I conf
+	0x0023a783, // n0x1371 c0x0000 (---------------)  + I edu
+	0x0026cc83, // n0x1372 c0x0000 (---------------)  + I gov
+	0x0020c782, // n0x1373 c0x0000 (---------------)  + I id
+	0x00209003, // n0x1374 c0x0000 (---------------)  + I mil
+	0x0021fe03, // n0x1375 c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x1376 c0x0000 (---------------)  + I org
+	0x00233503, // n0x1377 c0x0000 (---------------)  + I com
+	0x0023a783, // n0x1378 c0x0000 (---------------)  + I edu
+	0x0026cc83, // n0x1379 c0x0000 (---------------)  + I gov
+	0x0020c782, // n0x137a c0x0000 (---------------)  + I id
+	0x00213ac3, // n0x137b c0x0000 (---------------)  + I med
+	0x0021fe03, // n0x137c c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x137d c0x0000 (---------------)  + I org
+	0x002db143, // n0x137e c0x0000 (---------------)  + I plc
+	0x00217443, // n0x137f c0x0000 (---------------)  + I sch
+	0x00201542, // n0x1380 c0x0000 (---------------)  + I ac
+	0x00200742, // n0x1381 c0x0000 (---------------)  + I co
+	0x0026cc83, // n0x1382 c0x0000 (---------------)  + I gov
+	0x0021fe03, // n0x1383 c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x1384 c0x0000 (---------------)  + I org
+	0x00247505, // n0x1385 c0x0000 (---------------)  + I press
+	0x002d4884, // n0x1386 c0x0000 (---------------)  + I asso
+	0x00200142, // n0x1387 c0x0000 (---------------)  + I tm
+	0x000ffa08, // n0x1388 c0x0000 (---------------)  +   blogspot
+	0x00201542, // n0x1389 c0x0000 (---------------)  + I ac
+	0x00200742, // n0x138a c0x0000 (---------------)  + I co
+	0x00054d8b, // n0x138b c0x0000 (---------------)  +   diskstation
+	0x00009107, // n0x138c c0x0000 (---------------)  +   dscloud
+	0x0023a783, // n0x138d c0x0000 (---------------)  + I edu
+	0x0026cc83, // n0x138e c0x0000 (---------------)  + I gov
+	0x00157b84, // n0x138f c0x0000 (---------------)  +   i234
+	0x00230483, // n0x1390 c0x0000 (---------------)  + I its
+	0x00156bc4, // n0x1391 c0x0000 (---------------)  +   myds
+	0x0021fe03, // n0x1392 c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x1393 c0x0000 (---------------)  + I org
+	0x002e1c44, // n0x1394 c0x0000 (---------------)  + I priv
+	0x0010b388, // n0x1395 c0x0000 (---------------)  +   synology
+	0x00200742, // n0x1396 c0x0000 (---------------)  + I co
+	0x00233503, // n0x1397 c0x0000 (---------------)  + I com
+	0x0023a783, // n0x1398 c0x0000 (---------------)  + I edu
+	0x0026cc83, // n0x1399 c0x0000 (---------------)  + I gov
+	0x00209003, // n0x139a c0x0000 (---------------)  + I mil
+	0x00201483, // n0x139b c0x0000 (---------------)  + I nom
+	0x0022d1c3, // n0x139c c0x0000 (---------------)  + I org
+	0x002e1043, // n0x139d c0x0000 (---------------)  + I prd
+	0x00200142, // n0x139e c0x0000 (---------------)  + I tm
+	0x000ffa08, // n0x139f c0x0000 (---------------)  +   blogspot
+	0x00233503, // n0x13a0 c0x0000 (---------------)  + I com
+	0x0023a783, // n0x13a1 c0x0000 (---------------)  + I edu
+	0x0026cc83, // n0x13a2 c0x0000 (---------------)  + I gov
+	0x003a1083, // n0x13a3 c0x0000 (---------------)  + I inf
+	0x00205284, // n0x13a4 c0x0000 (---------------)  + I name
+	0x0021fe03, // n0x13a5 c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x13a6 c0x0000 (---------------)  + I org
+	0x00233503, // n0x13a7 c0x0000 (---------------)  + I com
+	0x0023a783, // n0x13a8 c0x0000 (---------------)  + I edu
+	0x0033d7c4, // n0x13a9 c0x0000 (---------------)  + I gouv
+	0x0026cc83, // n0x13aa c0x0000 (---------------)  + I gov
+	0x0021fe03, // n0x13ab c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x13ac c0x0000 (---------------)  + I org
+	0x00247506, // n0x13ad c0x0000 (---------------)  + I presse
+	0x0023a783, // n0x13ae c0x0000 (---------------)  + I edu
+	0x0026cc83, // n0x13af c0x0000 (---------------)  + I gov
+	0x0016ef83, // n0x13b0 c0x0000 (---------------)  +   nyc
+	0x0022d1c3, // n0x13b1 c0x0000 (---------------)  + I org
+	0x00233503, // n0x13b2 c0x0000 (---------------)  + I com
+	0x0023a783, // n0x13b3 c0x0000 (---------------)  + I edu
+	0x0026cc83, // n0x13b4 c0x0000 (---------------)  + I gov
+	0x0021fe03, // n0x13b5 c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x13b6 c0x0000 (---------------)  + I org
+	0x00009107, // n0x13b7 c0x0000 (---------------)  +   dscloud
+	0x000ffa08, // n0x13b8 c0x0000 (---------------)  +   blogspot
+	0x0026cc83, // n0x13b9 c0x0000 (---------------)  + I gov
+	0x00233503, // n0x13ba c0x0000 (---------------)  + I com
+	0x0023a783, // n0x13bb c0x0000 (---------------)  + I edu
+	0x0026cc83, // n0x13bc c0x0000 (---------------)  + I gov
+	0x0021fe03, // n0x13bd c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x13be c0x0000 (---------------)  + I org
+	0x36633503, // n0x13bf c0x00d9 (n0x13c3-n0x13c4)  + I com
+	0x0023a783, // n0x13c0 c0x0000 (---------------)  + I edu
+	0x0021fe03, // n0x13c1 c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x13c2 c0x0000 (---------------)  + I org
+	0x000ffa08, // n0x13c3 c0x0000 (---------------)  +   blogspot
+	0x00201542, // n0x13c4 c0x0000 (---------------)  + I ac
+	0x00200742, // n0x13c5 c0x0000 (---------------)  + I co
+	0x00233503, // n0x13c6 c0x0000 (---------------)  + I com
+	0x0026cc83, // n0x13c7 c0x0000 (---------------)  + I gov
+	0x0021fe03, // n0x13c8 c0x0000 (---------------)  + I net
+	0x00200282, // n0x13c9 c0x0000 (---------------)  + I or
+	0x0022d1c3, // n0x13ca c0x0000 (---------------)  + I org
+	0x0030aec7, // n0x13cb c0x0000 (---------------)  + I academy
+	0x00209c8b, // n0x13cc c0x0000 (---------------)  + I agriculture
+	0x00204903, // n0x13cd c0x0000 (---------------)  + I air
+	0x0023b1c8, // n0x13ce c0x0000 (---------------)  + I airguard
+	0x002ec607, // n0x13cf c0x0000 (---------------)  + I alabama
+	0x00279bc6, // n0x13d0 c0x0000 (---------------)  + I alaska
+	0x00367645, // n0x13d1 c0x0000 (---------------)  + I amber
+	0x002c8609, // n0x13d2 c0x0000 (---------------)  + I ambulance
+	0x00208d88, // n0x13d3 c0x0000 (---------------)  + I american
+	0x002729c9, // n0x13d4 c0x0000 (---------------)  + I americana
+	0x002729d0, // n0x13d5 c0x0000 (---------------)  + I americanantiques
+	0x0035994b, // n0x13d6 c0x0000 (---------------)  + I americanart
+	0x002c8449, // n0x13d7 c0x0000 (---------------)  + I amsterdam
+	0x00200843, // n0x13d8 c0x0000 (---------------)  + I and
+	0x00357549, // n0x13d9 c0x0000 (---------------)  + I annefrank
+	0x00237a06, // n0x13da c0x0000 (---------------)  + I anthro
+	0x00237a0c, // n0x13db c0x0000 (---------------)  + I anthropology
+	0x0022ba08, // n0x13dc c0x0000 (---------------)  + I antiques
+	0x003a2308, // n0x13dd c0x0000 (---------------)  + I aquarium
+	0x00258249, // n0x13de c0x0000 (---------------)  + I arboretum
+	0x0029fb0e, // n0x13df c0x0000 (---------------)  + I archaeological
+	0x0037228b, // n0x13e0 c0x0000 (---------------)  + I archaeology
+	0x0031fa0c, // n0x13e1 c0x0000 (---------------)  + I architecture
+	0x002011c3, // n0x13e2 c0x0000 (---------------)  + I art
+	0x003284cc, // n0x13e3 c0x0000 (---------------)  + I artanddesign
+	0x002043c9, // n0x13e4 c0x0000 (---------------)  + I artcenter
+	0x0020b107, // n0x13e5 c0x0000 (---------------)  + I artdeco
+	0x0023a6cc, // n0x13e6 c0x0000 (---------------)  + I arteducation
+	0x0039208a, // n0x13e7 c0x0000 (---------------)  + I artgallery
+	0x0024bf84, // n0x13e8 c0x0000 (---------------)  + I arts
+	0x0039eacd, // n0x13e9 c0x0000 (---------------)  + I artsandcrafts
+	0x00328388, // n0x13ea c0x0000 (---------------)  + I asmatart
+	0x0039efcd, // n0x13eb c0x0000 (---------------)  + I assassination
+	0x00252046, // n0x13ec c0x0000 (---------------)  + I assisi
+	0x002d488b, // n0x13ed c0x0000 (---------------)  + I association
+	0x00356a09, // n0x13ee c0x0000 (---------------)  + I astronomy
+	0x002244c7, // n0x13ef c0x0000 (---------------)  + I atlanta
+	0x002ea306, // n0x13f0 c0x0000 (---------------)  + I austin
+	0x003082c9, // n0x13f1 c0x0000 (---------------)  + I australia
+	0x00322f8a, // n0x13f2 c0x0000 (---------------)  + I automotive
+	0x0035b848, // n0x13f3 c0x0000 (---------------)  + I aviation
+	0x002e0b84, // n0x13f4 c0x0000 (---------------)  + I axis
+	0x00277007, // n0x13f5 c0x0000 (---------------)  + I badajoz
+	0x002a1847, // n0x13f6 c0x0000 (---------------)  + I baghdad
+	0x002ec084, // n0x13f7 c0x0000 (---------------)  + I bahn
+	0x00228a84, // n0x13f8 c0x0000 (---------------)  + I bale
+	0x0025d289, // n0x13f9 c0x0000 (---------------)  + I baltimore
+	0x002dd889, // n0x13fa c0x0000 (---------------)  + I barcelona
+	0x0022f9c8, // n0x13fb c0x0000 (---------------)  + I baseball
+	0x00210685, // n0x13fc c0x0000 (---------------)  + I basel
+	0x00389345, // n0x13fd c0x0000 (---------------)  + I baths
+	0x0020d246, // n0x13fe c0x0000 (---------------)  + I bauern
+	0x0039e989, // n0x13ff c0x0000 (---------------)  + I beauxarts
+	0x0021b10d, // n0x1400 c0x0000 (---------------)  + I beeldengeluid
+	0x0031f488, // n0x1401 c0x0000 (---------------)  + I bellevue
+	0x0020d147, // n0x1402 c0x0000 (---------------)  + I bergbau
+	0x003676c8, // n0x1403 c0x0000 (---------------)  + I berkeley
+	0x0022e6c6, // n0x1404 c0x0000 (---------------)  + I berlin
+	0x00390744, // n0x1405 c0x0000 (---------------)  + I bern
+	0x0037bf45, // n0x1406 c0x0000 (---------------)  + I bible
+	0x002028c6, // n0x1407 c0x0000 (---------------)  + I bilbao
+	0x00202e84, // n0x1408 c0x0000 (---------------)  + I bill
+	0x002042c7, // n0x1409 c0x0000 (---------------)  + I birdart
+	0x0020628a, // n0x140a c0x0000 (---------------)  + I birthplace
+	0x00212384, // n0x140b c0x0000 (---------------)  + I bonn
+	0x00217cc6, // n0x140c c0x0000 (---------------)  + I boston
+	0x00218e89, // n0x140d c0x0000 (---------------)  + I botanical
+	0x00218e8f, // n0x140e c0x0000 (---------------)  + I botanicalgarden
+	0x0021a18d, // n0x140f c0x0000 (---------------)  + I botanicgarden
+	0x0021a946, // n0x1410 c0x0000 (---------------)  + I botany
+	0x0021ca50, // n0x1411 c0x0000 (---------------)  + I brandywinevalley
+	0x0021ce46, // n0x1412 c0x0000 (---------------)  + I brasil
+	0x0021db87, // n0x1413 c0x0000 (---------------)  + I bristol
+	0x0021df07, // n0x1414 c0x0000 (---------------)  + I british
+	0x0021df0f, // n0x1415 c0x0000 (---------------)  + I britishcolumbia
+	0x0021fa49, // n0x1416 c0x0000 (---------------)  + I broadcast
+	0x00222b06, // n0x1417 c0x0000 (---------------)  + I brunel
+	0x00225e87, // n0x1418 c0x0000 (---------------)  + I brussel
+	0x00225e88, // n0x1419 c0x0000 (---------------)  + I brussels
+	0x00227049, // n0x141a c0x0000 (---------------)  + I bruxelles
+	0x0028fd88, // n0x141b c0x0000 (---------------)  + I building
+	0x002d7647, // n0x141c c0x0000 (---------------)  + I burghof
+	0x0020ca03, // n0x141d c0x0000 (---------------)  + I bus
+	0x00233386, // n0x141e c0x0000 (---------------)  + I bushey
+	0x00200308, // n0x141f c0x0000 (---------------)  + I cadaques
+	0x0029fdca, // n0x1420 c0x0000 (---------------)  + I california
+	0x00221ac9, // n0x1421 c0x0000 (---------------)  + I cambridge
+	0x00208ec3, // n0x1422 c0x0000 (---------------)  + I can
+	0x00324f06, // n0x1423 c0x0000 (---------------)  + I canada
+	0x002b63ca, // n0x1424 c0x0000 (---------------)  + I capebreton
+	0x00365247, // n0x1425 c0x0000 (---------------)  + I carrier
+	0x0020af4a, // n0x1426 c0x0000 (---------------)  + I cartoonart
+	0x0021460e, // n0x1427 c0x0000 (---------------)  + I casadelamoneda
+	0x0021fb86, // n0x1428 c0x0000 (---------------)  + I castle
+	0x002a6c47, // n0x1429 c0x0000 (---------------)  + I castres
+	0x00211b46, // n0x142a c0x0000 (---------------)  + I celtic
+	0x00204486, // n0x142b c0x0000 (---------------)  + I center
+	0x00374acb, // n0x142c c0x0000 (---------------)  + I chattanooga
+	0x002648ca, // n0x142d c0x0000 (---------------)  + I cheltenham
+	0x0035150d, // n0x142e c0x0000 (---------------)  + I chesapeakebay
+	0x00213047, // n0x142f c0x0000 (---------------)  + I chicago
+	0x00274888, // n0x1430 c0x0000 (---------------)  + I children
+	0x00274889, // n0x1431 c0x0000 (---------------)  + I childrens
+	0x0027488f, // n0x1432 c0x0000 (---------------)  + I childrensgarden
+	0x0023984c, // n0x1433 c0x0000 (---------------)  + I chiropractic
+	0x002b5a89, // n0x1434 c0x0000 (---------------)  + I chocolate
+	0x00379b8e, // n0x1435 c0x0000 (---------------)  + I christiansburg
+	0x00238cca, // n0x1436 c0x0000 (---------------)  + I cincinnati
+	0x002ce4c6, // n0x1437 c0x0000 (---------------)  + I cinema
+	0x00337c86, // n0x1438 c0x0000 (---------------)  + I circus
+	0x00363b8c, // n0x1439 c0x0000 (---------------)  + I civilisation
+	0x00367b8c, // n0x143a c0x0000 (---------------)  + I civilization
+	0x0036f008, // n0x143b c0x0000 (---------------)  + I civilwar
+	0x003894c7, // n0x143c c0x0000 (---------------)  + I clinton
+	0x002acc45, // n0x143d c0x0000 (---------------)  + I clock
+	0x00355244, // n0x143e c0x0000 (---------------)  + I coal
+	0x00386b8e, // n0x143f c0x0000 (---------------)  + I coastaldefence
+	0x00323204, // n0x1440 c0x0000 (---------------)  + I cody
+	0x00231d87, // n0x1441 c0x0000 (---------------)  + I coldwar
+	0x00265b8a, // n0x1442 c0x0000 (---------------)  + I collection
+	0x00232454, // n0x1443 c0x0000 (---------------)  + I colonialwilliamsburg
+	0x00232dcf, // n0x1444 c0x0000 (---------------)  + I coloradoplateau
+	0x0021e0c8, // n0x1445 c0x0000 (---------------)  + I columbia
+	0x00233248, // n0x1446 c0x0000 (---------------)  + I columbus
+	0x0036018d, // n0x1447 c0x0000 (---------------)  + I communication
+	0x0036018e, // n0x1448 c0x0000 (---------------)  + I communications
+	0x00233509, // n0x1449 c0x0000 (---------------)  + I community
+	0x00235488, // n0x144a c0x0000 (---------------)  + I computer
+	0x0023548f, // n0x144b c0x0000 (---------------)  + I computerhistory
+	0x0023a3cc, // n0x144c c0x0000 (---------------)  + I contemporary
+	0x0023a3cf, // n0x144d c0x0000 (---------------)  + I contemporaryart
+	0x0023b747, // n0x144e c0x0000 (---------------)  + I convent
+	0x0023de0a, // n0x144f c0x0000 (---------------)  + I copenhagen
+	0x0021c58b, // n0x1450 c0x0000 (---------------)  + I corporation
+	0x0023f888, // n0x1451 c0x0000 (---------------)  + I corvette
+	0x00241807, // n0x1452 c0x0000 (---------------)  + I costume
+	0x0033658d, // n0x1453 c0x0000 (---------------)  + I countryestate
+	0x0031ab06, // n0x1454 c0x0000 (---------------)  + I county
+	0x0039ec86, // n0x1455 c0x0000 (---------------)  + I crafts
+	0x00243c49, // n0x1456 c0x0000 (---------------)  + I cranbrook
+	0x00336b48, // n0x1457 c0x0000 (---------------)  + I creation
+	0x00247888, // n0x1458 c0x0000 (---------------)  + I cultural
+	0x0024788e, // n0x1459 c0x0000 (---------------)  + I culturalcenter
+	0x00209d87, // n0x145a c0x0000 (---------------)  + I culture
+	0x00322345, // n0x145b c0x0000 (---------------)  + I cyber
+	0x0024a985, // n0x145c c0x0000 (---------------)  + I cymru
+	0x00210284, // n0x145d c0x0000 (---------------)  + I dali
+	0x00279e86, // n0x145e c0x0000 (---------------)  + I dallas
+	0x0022f8c8, // n0x145f c0x0000 (---------------)  + I database
+	0x002edd03, // n0x1460 c0x0000 (---------------)  + I ddr
+	0x0025fa0e, // n0x1461 c0x0000 (---------------)  + I decorativearts
+	0x00336948, // n0x1462 c0x0000 (---------------)  + I delaware
+	0x0027af0b, // n0x1463 c0x0000 (---------------)  + I delmenhorst
+	0x003312c7, // n0x1464 c0x0000 (---------------)  + I denmark
+	0x00274145, // n0x1465 c0x0000 (---------------)  + I depot
+	0x0022dcc6, // n0x1466 c0x0000 (---------------)  + I design
+	0x002aa507, // n0x1467 c0x0000 (---------------)  + I detroit
+	0x002fac88, // n0x1468 c0x0000 (---------------)  + I dinosaur
+	0x00330409, // n0x1469 c0x0000 (---------------)  + I discovery
+	0x00237405, // n0x146a c0x0000 (---------------)  + I dolls
+	0x002861c8, // n0x146b c0x0000 (---------------)  + I donostia
+	0x0020cc06, // n0x146c c0x0000 (---------------)  + I durham
+	0x0037574a, // n0x146d c0x0000 (---------------)  + I eastafrica
+	0x00386a89, // n0x146e c0x0000 (---------------)  + I eastcoast
+	0x0023a789, // n0x146f c0x0000 (---------------)  + I education
+	0x0023a78b, // n0x1470 c0x0000 (---------------)  + I educational
+	0x0028c908, // n0x1471 c0x0000 (---------------)  + I egyptian
+	0x002ebf49, // n0x1472 c0x0000 (---------------)  + I eisenbahn
+	0x00210746, // n0x1473 c0x0000 (---------------)  + I elburg
+	0x002e4f4a, // n0x1474 c0x0000 (---------------)  + I elvendrell
+	0x0022980a, // n0x1475 c0x0000 (---------------)  + I embroidery
+	0x0023e00c, // n0x1476 c0x0000 (---------------)  + I encyclopedic
+	0x00213707, // n0x1477 c0x0000 (---------------)  + I england
+	0x002cd60a, // n0x1478 c0x0000 (---------------)  + I entomology
+	0x00326d8b, // n0x1479 c0x0000 (---------------)  + I environment
+	0x00326d99, // n0x147a c0x0000 (---------------)  + I environmentalconservation
+	0x00329a48, // n0x147b c0x0000 (---------------)  + I epilepsy
+	0x00247585, // n0x147c c0x0000 (---------------)  + I essex
+	0x002c2486, // n0x147d c0x0000 (---------------)  + I estate
+	0x0030cf09, // n0x147e c0x0000 (---------------)  + I ethnology
+	0x00205346, // n0x147f c0x0000 (---------------)  + I exeter
+	0x002115ca, // n0x1480 c0x0000 (---------------)  + I exhibition
+	0x00208f86, // n0x1481 c0x0000 (---------------)  + I family
+	0x00271d04, // n0x1482 c0x0000 (---------------)  + I farm
+	0x002c260d, // n0x1483 c0x0000 (---------------)  + I farmequipment
+	0x002ece87, // n0x1484 c0x0000 (---------------)  + I farmers
+	0x00271d09, // n0x1485 c0x0000 (---------------)  + I farmstead
+	0x00366b05, // n0x1486 c0x0000 (---------------)  + I field
+	0x0037ac88, // n0x1487 c0x0000 (---------------)  + I figueres
+	0x0024b549, // n0x1488 c0x0000 (---------------)  + I filatelia
+	0x0024b784, // n0x1489 c0x0000 (---------------)  + I film
+	0x0024be87, // n0x148a c0x0000 (---------------)  + I fineart
+	0x0024be88, // n0x148b c0x0000 (---------------)  + I finearts
+	0x0024c387, // n0x148c c0x0000 (---------------)  + I finland
+	0x00267688, // n0x148d c0x0000 (---------------)  + I flanders
+	0x00252947, // n0x148e c0x0000 (---------------)  + I florida
+	0x00338705, // n0x148f c0x0000 (---------------)  + I force
+	0x00259fcc, // n0x1490 c0x0000 (---------------)  + I fortmissoula
+	0x0025ab89, // n0x1491 c0x0000 (---------------)  + I fortworth
+	0x002b9f4a, // n0x1492 c0x0000 (---------------)  + I foundation
+	0x00385d09, // n0x1493 c0x0000 (---------------)  + I francaise
+	0x00357649, // n0x1494 c0x0000 (---------------)  + I frankfurt
+	0x00256acc, // n0x1495 c0x0000 (---------------)  + I franziskaner
+	0x002e7d0b, // n0x1496 c0x0000 (---------------)  + I freemasonry
+	0x0025c488, // n0x1497 c0x0000 (---------------)  + I freiburg
+	0x00260048, // n0x1498 c0x0000 (---------------)  + I fribourg
+	0x002636c4, // n0x1499 c0x0000 (---------------)  + I frog
+	0x00283c88, // n0x149a c0x0000 (---------------)  + I fundacio
+	0x00285349, // n0x149b c0x0000 (---------------)  + I furniture
+	0x00392147, // n0x149c c0x0000 (---------------)  + I gallery
+	0x002190c6, // n0x149d c0x0000 (---------------)  + I garden
+	0x00246347, // n0x149e c0x0000 (---------------)  + I gateway
+	0x00330689, // n0x149f c0x0000 (---------------)  + I geelvinck
+	0x0021334b, // n0x14a0 c0x0000 (---------------)  + I gemological
+	0x00396387, // n0x14a1 c0x0000 (---------------)  + I geology
+	0x00324c47, // n0x14a2 c0x0000 (---------------)  + I georgia
+	0x00279907, // n0x14a3 c0x0000 (---------------)  + I giessen
+	0x0039ef44, // n0x14a4 c0x0000 (---------------)  + I glas
+	0x0039ef45, // n0x14a5 c0x0000 (---------------)  + I glass
+	0x002a8705, // n0x14a6 c0x0000 (---------------)  + I gorge
+	0x0033454b, // n0x14a7 c0x0000 (---------------)  + I grandrapids
+	0x0038f9c4, // n0x14a8 c0x0000 (---------------)  + I graz
+	0x00266e08, // n0x14a9 c0x0000 (---------------)  + I guernsey
+	0x0029168a, // n0x14aa c0x0000 (---------------)  + I halloffame
+	0x0020ccc7, // n0x14ab c0x0000 (---------------)  + I hamburg
+	0x0031bbc7, // n0x14ac c0x0000 (---------------)  + I handson
+	0x0028b492, // n0x14ad c0x0000 (---------------)  + I harvestcelebration
+	0x0025cb86, // n0x14ae c0x0000 (---------------)  + I hawaii
+	0x0036b386, // n0x14af c0x0000 (---------------)  + I health
+	0x0030f8ce, // n0x14b0 c0x0000 (---------------)  + I heimatunduhren
+	0x0025fd86, // n0x14b1 c0x0000 (---------------)  + I hellas
+	0x0020ebc8, // n0x14b2 c0x0000 (---------------)  + I helsinki
+	0x00290d0f, // n0x14b3 c0x0000 (---------------)  + I hembygdsforbund
+	0x0039f388, // n0x14b4 c0x0000 (---------------)  + I heritage
+	0x0036d908, // n0x14b5 c0x0000 (---------------)  + I histoire
+	0x002fb8ca, // n0x14b6 c0x0000 (---------------)  + I historical
+	0x002fb8d1, // n0x14b7 c0x0000 (---------------)  + I historicalsociety
+	0x002a1f0e, // n0x14b8 c0x0000 (---------------)  + I historichouses
+	0x002567ca, // n0x14b9 c0x0000 (---------------)  + I historisch
+	0x002567cc, // n0x14ba c0x0000 (---------------)  + I historisches
+	0x00235687, // n0x14bb c0x0000 (---------------)  + I history
+	0x00235690, // n0x14bc c0x0000 (---------------)  + I historyofscience
+	0x00202188, // n0x14bd c0x0000 (---------------)  + I horology
+	0x002a2105, // n0x14be c0x0000 (---------------)  + I house
+	0x002aad4a, // n0x14bf c0x0000 (---------------)  + I humanities
+	0x00202ecc, // n0x14c0 c0x0000 (---------------)  + I illustration
+	0x002b44cd, // n0x14c1 c0x0000 (---------------)  + I imageandsound
+	0x002a3c46, // n0x14c2 c0x0000 (---------------)  + I indian
+	0x002a3c47, // n0x14c3 c0x0000 (---------------)  + I indiana
+	0x002a3c4c, // n0x14c4 c0x0000 (---------------)  + I indianapolis
+	0x002f120c, // n0x14c5 c0x0000 (---------------)  + I indianmarket
+	0x0024dd4c, // n0x14c6 c0x0000 (---------------)  + I intelligence
+	0x0028a0cb, // n0x14c7 c0x0000 (---------------)  + I interactive
+	0x002859c4, // n0x14c8 c0x0000 (---------------)  + I iraq
+	0x0021d504, // n0x14c9 c0x0000 (---------------)  + I iron
+	0x0034fb49, // n0x14ca c0x0000 (---------------)  + I isleofman
+	0x002c8ec7, // n0x14cb c0x0000 (---------------)  + I jamison
+	0x00266a49, // n0x14cc c0x0000 (---------------)  + I jefferson
+	0x00283549, // n0x14cd c0x0000 (---------------)  + I jerusalem
+	0x00360f47, // n0x14ce c0x0000 (---------------)  + I jewelry
+	0x00391f06, // n0x14cf c0x0000 (---------------)  + I jewish
+	0x00391f09, // n0x14d0 c0x0000 (---------------)  + I jewishart
+	0x00399f83, // n0x14d1 c0x0000 (---------------)  + I jfk
+	0x0033be4a, // n0x14d2 c0x0000 (---------------)  + I journalism
+	0x00355487, // n0x14d3 c0x0000 (---------------)  + I judaica
+	0x0027744b, // n0x14d4 c0x0000 (---------------)  + I judygarland
+	0x0035138a, // n0x14d5 c0x0000 (---------------)  + I juedisches
+	0x00242844, // n0x14d6 c0x0000 (---------------)  + I juif
+	0x00353546, // n0x14d7 c0x0000 (---------------)  + I karate
+	0x0027efc9, // n0x14d8 c0x0000 (---------------)  + I karikatur
+	0x0028cd44, // n0x14d9 c0x0000 (---------------)  + I kids
+	0x0020324a, // n0x14da c0x0000 (---------------)  + I koebenhavn
+	0x0036bd45, // n0x14db c0x0000 (---------------)  + I koeln
+	0x002b4d85, // n0x14dc c0x0000 (---------------)  + I kunst
+	0x002b4d8d, // n0x14dd c0x0000 (---------------)  + I kunstsammlung
+	0x002b50ce, // n0x14de c0x0000 (---------------)  + I kunstunddesign
+	0x00315585, // n0x14df c0x0000 (---------------)  + I labor
+	0x0038b2c6, // n0x14e0 c0x0000 (---------------)  + I labour
+	0x00247107, // n0x14e1 c0x0000 (---------------)  + I lajolla
+	0x002c990a, // n0x14e2 c0x0000 (---------------)  + I lancashire
+	0x00323506, // n0x14e3 c0x0000 (---------------)  + I landes
+	0x00359c44, // n0x14e4 c0x0000 (---------------)  + I lans
+	0x00359f87, // n0x14e5 c0x0000 (---------------)  + I larsson
+	0x002def0b, // n0x14e6 c0x0000 (---------------)  + I lewismiller
+	0x0022e787, // n0x14e7 c0x0000 (---------------)  + I lincoln
+	0x003a0f44, // n0x14e8 c0x0000 (---------------)  + I linz
+	0x002414c6, // n0x14e9 c0x0000 (---------------)  + I living
+	0x002414cd, // n0x14ea c0x0000 (---------------)  + I livinghistory
+	0x003571cc, // n0x14eb c0x0000 (---------------)  + I localhistory
+	0x00321906, // n0x14ec c0x0000 (---------------)  + I london
+	0x0031f68a, // n0x14ed c0x0000 (---------------)  + I losangeles
+	0x0022b6c6, // n0x14ee c0x0000 (---------------)  + I louvre
+	0x002a7e88, // n0x14ef c0x0000 (---------------)  + I loyalist
+	0x002e6147, // n0x14f0 c0x0000 (---------------)  + I lucerne
+	0x0023ca4a, // n0x14f1 c0x0000 (---------------)  + I luxembourg
+	0x0023dc86, // n0x14f2 c0x0000 (---------------)  + I luzern
+	0x00212f43, // n0x14f3 c0x0000 (---------------)  + I mad
+	0x00317146, // n0x14f4 c0x0000 (---------------)  + I madrid
+	0x00200188, // n0x14f5 c0x0000 (---------------)  + I mallorca
+	0x0029a80a, // n0x14f6 c0x0000 (---------------)  + I manchester
+	0x00251d47, // n0x14f7 c0x0000 (---------------)  + I mansion
+	0x00251d48, // n0x14f8 c0x0000 (---------------)  + I mansions
+	0x0026a704, // n0x14f9 c0x0000 (---------------)  + I manx
+	0x00278f07, // n0x14fa c0x0000 (---------------)  + I marburg
+	0x00269708, // n0x14fb c0x0000 (---------------)  + I maritime
+	0x002a3088, // n0x14fc c0x0000 (---------------)  + I maritimo
+	0x0025cd88, // n0x14fd c0x0000 (---------------)  + I maryland
+	0x002831ca, // n0x14fe c0x0000 (---------------)  + I marylhurst
+	0x003025c5, // n0x14ff c0x0000 (---------------)  + I media
+	0x0023ac87, // n0x1500 c0x0000 (---------------)  + I medical
+	0x00256613, // n0x1501 c0x0000 (---------------)  + I medizinhistorisches
+	0x00259146, // n0x1502 c0x0000 (---------------)  + I meeres
+	0x0026cf88, // n0x1503 c0x0000 (---------------)  + I memorial
+	0x002221c9, // n0x1504 c0x0000 (---------------)  + I mesaverde
+	0x002165c8, // n0x1505 c0x0000 (---------------)  + I michigan
+	0x0036e1cb, // n0x1506 c0x0000 (---------------)  + I midatlantic
+	0x002b8348, // n0x1507 c0x0000 (---------------)  + I military
+	0x00285244, // n0x1508 c0x0000 (---------------)  + I mill
+	0x00321106, // n0x1509 c0x0000 (---------------)  + I miners
+	0x003a5c46, // n0x150a c0x0000 (---------------)  + I mining
+	0x003058c9, // n0x150b c0x0000 (---------------)  + I minnesota
+	0x002bf847, // n0x150c c0x0000 (---------------)  + I missile
+	0x0025a0c8, // n0x150d c0x0000 (---------------)  + I missoula
+	0x003a1f86, // n0x150e c0x0000 (---------------)  + I modern
+	0x0037a084, // n0x150f c0x0000 (---------------)  + I moma
+	0x002c6d85, // n0x1510 c0x0000 (---------------)  + I money
+	0x002c1888, // n0x1511 c0x0000 (---------------)  + I monmouth
+	0x002c1fca, // n0x1512 c0x0000 (---------------)  + I monticello
+	0x002c2288, // n0x1513 c0x0000 (---------------)  + I montreal
+	0x002c74c6, // n0x1514 c0x0000 (---------------)  + I moscow
+	0x0029af0a, // n0x1515 c0x0000 (---------------)  + I motorcycle
+	0x002e6d88, // n0x1516 c0x0000 (---------------)  + I muenchen
+	0x002ca188, // n0x1517 c0x0000 (---------------)  + I muenster
+	0x002cb648, // n0x1518 c0x0000 (---------------)  + I mulhouse
+	0x002cc046, // n0x1519 c0x0000 (---------------)  + I muncie
+	0x002cfc06, // n0x151a c0x0000 (---------------)  + I museet
+	0x002ea80c, // n0x151b c0x0000 (---------------)  + I museumcenter
+	0x002d0110, // n0x151c c0x0000 (---------------)  + I museumvereniging
+	0x00283a85, // n0x151d c0x0000 (---------------)  + I music
+	0x00319548, // n0x151e c0x0000 (---------------)  + I national
+	0x00319550, // n0x151f c0x0000 (---------------)  + I nationalfirearms
+	0x0039f190, // n0x1520 c0x0000 (---------------)  + I nationalheritage
+	0x0027284e, // n0x1521 c0x0000 (---------------)  + I nativeamerican
+	0x002ea48e, // n0x1522 c0x0000 (---------------)  + I naturalhistory
+	0x002ea494, // n0x1523 c0x0000 (---------------)  + I naturalhistorymuseum
+	0x0031ad4f, // n0x1524 c0x0000 (---------------)  + I naturalsciences
+	0x0031b106, // n0x1525 c0x0000 (---------------)  + I nature
+	0x00325e11, // n0x1526 c0x0000 (---------------)  + I naturhistorisches
+	0x00327393, // n0x1527 c0x0000 (---------------)  + I natuurwetenschappen
+	0x00327808, // n0x1528 c0x0000 (---------------)  + I naumburg
+	0x0030f105, // n0x1529 c0x0000 (---------------)  + I naval
+	0x002d7f48, // n0x152a c0x0000 (---------------)  + I nebraska
+	0x002de045, // n0x152b c0x0000 (---------------)  + I neues
+	0x0022a34c, // n0x152c c0x0000 (---------------)  + I newhampshire
+	0x002aeb89, // n0x152d c0x0000 (---------------)  + I newjersey
+	0x00231bc9, // n0x152e c0x0000 (---------------)  + I newmexico
+	0x002460c7, // n0x152f c0x0000 (---------------)  + I newport
+	0x00221dc9, // n0x1530 c0x0000 (---------------)  + I newspaper
+	0x002ed0c7, // n0x1531 c0x0000 (---------------)  + I newyork
+	0x002a2646, // n0x1532 c0x0000 (---------------)  + I niepce
+	0x0037bd47, // n0x1533 c0x0000 (---------------)  + I norfolk
+	0x00239c45, // n0x1534 c0x0000 (---------------)  + I north
+	0x002b5e83, // n0x1535 c0x0000 (---------------)  + I nrw
+	0x002edec9, // n0x1536 c0x0000 (---------------)  + I nuernberg
+	0x003518c9, // n0x1537 c0x0000 (---------------)  + I nuremberg
+	0x0036ef83, // n0x1538 c0x0000 (---------------)  + I nyc
+	0x00215844, // n0x1539 c0x0000 (---------------)  + I nyny
+	0x0032154d, // n0x153a c0x0000 (---------------)  + I oceanographic
+	0x00200b0f, // n0x153b c0x0000 (---------------)  + I oceanographique
+	0x002fc505, // n0x153c c0x0000 (---------------)  + I omaha
+	0x003175c6, // n0x153d c0x0000 (---------------)  + I online
+	0x00200987, // n0x153e c0x0000 (---------------)  + I ontario
+	0x00358c87, // n0x153f c0x0000 (---------------)  + I openair
+	0x00287ec6, // n0x1540 c0x0000 (---------------)  + I oregon
+	0x00287ecb, // n0x1541 c0x0000 (---------------)  + I oregontrail
+	0x002a3605, // n0x1542 c0x0000 (---------------)  + I otago
+	0x0039bec6, // n0x1543 c0x0000 (---------------)  + I oxford
+	0x003909c7, // n0x1544 c0x0000 (---------------)  + I pacific
+	0x0026fec9, // n0x1545 c0x0000 (---------------)  + I paderborn
+	0x00322046, // n0x1546 c0x0000 (---------------)  + I palace
+	0x0020ac45, // n0x1547 c0x0000 (---------------)  + I paleo
+	0x0023a00b, // n0x1548 c0x0000 (---------------)  + I palmsprings
+	0x0025b986, // n0x1549 c0x0000 (---------------)  + I panama
+	0x00277905, // n0x154a c0x0000 (---------------)  + I paris
+	0x002b5648, // n0x154b c0x0000 (---------------)  + I pasadena
+	0x00375008, // n0x154c c0x0000 (---------------)  + I pharmacy
+	0x002d30cc, // n0x154d c0x0000 (---------------)  + I philadelphia
+	0x002d30d0, // n0x154e c0x0000 (---------------)  + I philadelphiaarea
+	0x002d3789, // n0x154f c0x0000 (---------------)  + I philately
+	0x002d3bc7, // n0x1550 c0x0000 (---------------)  + I phoenix
+	0x002d404b, // n0x1551 c0x0000 (---------------)  + I photography
+	0x002d6506, // n0x1552 c0x0000 (---------------)  + I pilots
+	0x002d750a, // n0x1553 c0x0000 (---------------)  + I pittsburgh
+	0x002d898b, // n0x1554 c0x0000 (---------------)  + I planetarium
+	0x002d8d8a, // n0x1555 c0x0000 (---------------)  + I plantation
+	0x002d9006, // n0x1556 c0x0000 (---------------)  + I plants
+	0x002db005, // n0x1557 c0x0000 (---------------)  + I plaza
+	0x002ec506, // n0x1558 c0x0000 (---------------)  + I portal
+	0x00279488, // n0x1559 c0x0000 (---------------)  + I portland
+	0x0024618a, // n0x155a c0x0000 (---------------)  + I portlligat
+	0x0035fe1c, // n0x155b c0x0000 (---------------)  + I posts-and-telecommunications
+	0x002e110c, // n0x155c c0x0000 (---------------)  + I preservation
+	0x002e1408, // n0x155d c0x0000 (---------------)  + I presidio
+	0x00247505, // n0x155e c0x0000 (---------------)  + I press
+	0x002e3107, // n0x155f c0x0000 (---------------)  + I project
+	0x0029f746, // n0x1560 c0x0000 (---------------)  + I public
+	0x0038dec5, // n0x1561 c0x0000 (---------------)  + I pubol
+	0x0021b906, // n0x1562 c0x0000 (---------------)  + I quebec
+	0x00288088, // n0x1563 c0x0000 (---------------)  + I railroad
+	0x002b3287, // n0x1564 c0x0000 (---------------)  + I railway
+	0x0029fa08, // n0x1565 c0x0000 (---------------)  + I research
+	0x002a6d4a, // n0x1566 c0x0000 (---------------)  + I resistance
+	0x0030864c, // n0x1567 c0x0000 (---------------)  + I riodejaneiro
+	0x003088c9, // n0x1568 c0x0000 (---------------)  + I rochester
+	0x0038e207, // n0x1569 c0x0000 (---------------)  + I rockart
+	0x00254584, // n0x156a c0x0000 (---------------)  + I roma
+	0x00252f86, // n0x156b c0x0000 (---------------)  + I russia
+	0x0036d48a, // n0x156c c0x0000 (---------------)  + I saintlouis
+	0x00283645, // n0x156d c0x0000 (---------------)  + I salem
+	0x0034504c, // n0x156e c0x0000 (---------------)  + I salvadordali
+	0x00345cc8, // n0x156f c0x0000 (---------------)  + I salzburg
+	0x0034a848, // n0x1570 c0x0000 (---------------)  + I sandiego
+	0x002004cc, // n0x1571 c0x0000 (---------------)  + I sanfrancisco
+	0x00210c8c, // n0x1572 c0x0000 (---------------)  + I santabarbara
+	0x00211189, // n0x1573 c0x0000 (---------------)  + I santacruz
+	0x002113c7, // n0x1574 c0x0000 (---------------)  + I santafe
+	0x0033d48c, // n0x1575 c0x0000 (---------------)  + I saskatchewan
+	0x003897c4, // n0x1576 c0x0000 (---------------)  + I satx
+	0x00232b4a, // n0x1577 c0x0000 (---------------)  + I savannahga
+	0x0028d04c, // n0x1578 c0x0000 (---------------)  + I schlesisches
+	0x0027104b, // n0x1579 c0x0000 (---------------)  + I schoenbrunn
+	0x0023758b, // n0x157a c0x0000 (---------------)  + I schokoladen
+	0x0023d0c6, // n0x157b c0x0000 (---------------)  + I school
+	0x00243147, // n0x157c c0x0000 (---------------)  + I schweiz
+	0x002358c7, // n0x157d c0x0000 (---------------)  + I science
+	0x002358cf, // n0x157e c0x0000 (---------------)  + I science-fiction
+	0x002f1b51, // n0x157f c0x0000 (---------------)  + I scienceandhistory
+	0x0039e252, // n0x1580 c0x0000 (---------------)  + I scienceandindustry
+	0x0024410d, // n0x1581 c0x0000 (---------------)  + I sciencecenter
+	0x0024410e, // n0x1582 c0x0000 (---------------)  + I sciencecenters
+	0x0024444e, // n0x1583 c0x0000 (---------------)  + I sciencehistory
+	0x0031af08, // n0x1584 c0x0000 (---------------)  + I sciences
+	0x0031af12, // n0x1585 c0x0000 (---------------)  + I sciencesnaturelles
+	0x00200708, // n0x1586 c0x0000 (---------------)  + I scotland
+	0x002fa9c7, // n0x1587 c0x0000 (---------------)  + I seaport
+	0x0024f98a, // n0x1588 c0x0000 (---------------)  + I settlement
+	0x00219c08, // n0x1589 c0x0000 (---------------)  + I settlers
+	0x0025fd45, // n0x158a c0x0000 (---------------)  + I shell
+	0x0035cc4a, // n0x158b c0x0000 (---------------)  + I sherbrooke
+	0x0021d987, // n0x158c c0x0000 (---------------)  + I sibenik
+	0x00341f84, // n0x158d c0x0000 (---------------)  + I silk
+	0x00209743, // n0x158e c0x0000 (---------------)  + I ski
+	0x00296cc5, // n0x158f c0x0000 (---------------)  + I skole
+	0x002fbb47, // n0x1590 c0x0000 (---------------)  + I society
+	0x002f9607, // n0x1591 c0x0000 (---------------)  + I sologne
+	0x002b46ce, // n0x1592 c0x0000 (---------------)  + I soundandvision
+	0x0032bd4d, // n0x1593 c0x0000 (---------------)  + I southcarolina
+	0x0032e849, // n0x1594 c0x0000 (---------------)  + I southwest
+	0x0020bb45, // n0x1595 c0x0000 (---------------)  + I space
+	0x003347c3, // n0x1596 c0x0000 (---------------)  + I spy
+	0x0027a346, // n0x1597 c0x0000 (---------------)  + I square
+	0x003643c5, // n0x1598 c0x0000 (---------------)  + I stadt
+	0x0027b148, // n0x1599 c0x0000 (---------------)  + I stalbans
+	0x00323f89, // n0x159a c0x0000 (---------------)  + I starnberg
+	0x0020f205, // n0x159b c0x0000 (---------------)  + I state
+	0x0033678f, // n0x159c c0x0000 (---------------)  + I stateofdelaware
+	0x00254e87, // n0x159d c0x0000 (---------------)  + I station
+	0x003674c5, // n0x159e c0x0000 (---------------)  + I steam
+	0x00227c0a, // n0x159f c0x0000 (---------------)  + I steiermark
+	0x00303b86, // n0x15a0 c0x0000 (---------------)  + I stjohn
+	0x002a8009, // n0x15a1 c0x0000 (---------------)  + I stockholm
+	0x002e71cc, // n0x15a2 c0x0000 (---------------)  + I stpetersburg
+	0x002e8989, // n0x15a3 c0x0000 (---------------)  + I stuttgart
+	0x00206706, // n0x15a4 c0x0000 (---------------)  + I suisse
+	0x0029148c, // n0x15a5 c0x0000 (---------------)  + I surgeonshall
+	0x002e91c6, // n0x15a6 c0x0000 (---------------)  + I surrey
+	0x002f0688, // n0x15a7 c0x0000 (---------------)  + I svizzera
+	0x002f0886, // n0x15a8 c0x0000 (---------------)  + I sweden
+	0x00329bc6, // n0x15a9 c0x0000 (---------------)  + I sydney
+	0x002294c4, // n0x15aa c0x0000 (---------------)  + I tank
+	0x0025d103, // n0x15ab c0x0000 (---------------)  + I tcm
+	0x002d608a, // n0x15ac c0x0000 (---------------)  + I technology
+	0x0031d2d1, // n0x15ad c0x0000 (---------------)  + I telekommunikation
+	0x002b5c4a, // n0x15ae c0x0000 (---------------)  + I television
+	0x0034d1c5, // n0x15af c0x0000 (---------------)  + I texas
+	0x003844c7, // n0x15b0 c0x0000 (---------------)  + I textile
+	0x002573c7, // n0x15b1 c0x0000 (---------------)  + I theater
+	0x00269804, // n0x15b2 c0x0000 (---------------)  + I time
+	0x0026980b, // n0x15b3 c0x0000 (---------------)  + I timekeeping
+	0x00208088, // n0x15b4 c0x0000 (---------------)  + I topology
+	0x002b1946, // n0x15b5 c0x0000 (---------------)  + I torino
+	0x00311cc5, // n0x15b6 c0x0000 (---------------)  + I touch
+	0x002dc244, // n0x15b7 c0x0000 (---------------)  + I town
+	0x00294809, // n0x15b8 c0x0000 (---------------)  + I transport
+	0x00355f84, // n0x15b9 c0x0000 (---------------)  + I tree
+	0x00359147, // n0x15ba c0x0000 (---------------)  + I trolley
+	0x00329245, // n0x15bb c0x0000 (---------------)  + I trust
+	0x00329247, // n0x15bc c0x0000 (---------------)  + I trustee
+	0x0030fb05, // n0x15bd c0x0000 (---------------)  + I uhren
+	0x00253643, // n0x15be c0x0000 (---------------)  + I ulm
+	0x002fa888, // n0x15bf c0x0000 (---------------)  + I undersea
+	0x00320a0a, // n0x15c0 c0x0000 (---------------)  + I university
+	0x0022b983, // n0x15c1 c0x0000 (---------------)  + I usa
+	0x0022b98a, // n0x15c2 c0x0000 (---------------)  + I usantiques
+	0x0028db46, // n0x15c3 c0x0000 (---------------)  + I usarts
+	0x0033650f, // n0x15c4 c0x0000 (---------------)  + I uscountryestate
+	0x00337d89, // n0x15c5 c0x0000 (---------------)  + I usculture
+	0x0025f990, // n0x15c6 c0x0000 (---------------)  + I usdecorativearts
+	0x0026d6c8, // n0x15c7 c0x0000 (---------------)  + I usgarden
+	0x002c7d49, // n0x15c8 c0x0000 (---------------)  + I ushistory
+	0x0029ca87, // n0x15c9 c0x0000 (---------------)  + I ushuaia
+	0x0024144f, // n0x15ca c0x0000 (---------------)  + I uslivinghistory
+	0x002e84c4, // n0x15cb c0x0000 (---------------)  + I utah
+	0x0033d844, // n0x15cc c0x0000 (---------------)  + I uvic
+	0x00217106, // n0x15cd c0x0000 (---------------)  + I valley
+	0x00236b46, // n0x15ce c0x0000 (---------------)  + I vantaa
+	0x0031504a, // n0x15cf c0x0000 (---------------)  + I versailles
+	0x00311a06, // n0x15d0 c0x0000 (---------------)  + I viking
+	0x002f8f47, // n0x15d1 c0x0000 (---------------)  + I village
+	0x002f7e88, // n0x15d2 c0x0000 (---------------)  + I virginia
+	0x002f8087, // n0x15d3 c0x0000 (---------------)  + I virtual
+	0x002f8247, // n0x15d4 c0x0000 (---------------)  + I virtuel
+	0x0034710a, // n0x15d5 c0x0000 (---------------)  + I vlaanderen
+	0x002fa6cb, // n0x15d6 c0x0000 (---------------)  + I volkenkunde
+	0x00320685, // n0x15d7 c0x0000 (---------------)  + I wales
+	0x0039de88, // n0x15d8 c0x0000 (---------------)  + I wallonie
+	0x00203903, // n0x15d9 c0x0000 (---------------)  + I war
+	0x0023efcc, // n0x15da c0x0000 (---------------)  + I washingtondc
+	0x00376c4f, // n0x15db c0x0000 (---------------)  + I watch-and-clock
+	0x002aca4d, // n0x15dc c0x0000 (---------------)  + I watchandclock
+	0x0023d987, // n0x15dd c0x0000 (---------------)  + I western
+	0x0032e989, // n0x15de c0x0000 (---------------)  + I westfalen
+	0x002b5f07, // n0x15df c0x0000 (---------------)  + I whaling
+	0x00253bc8, // n0x15e0 c0x0000 (---------------)  + I wildlife
+	0x0023264c, // n0x15e1 c0x0000 (---------------)  + I williamsburg
+	0x00285148, // n0x15e2 c0x0000 (---------------)  + I windmill
+	0x00351f08, // n0x15e3 c0x0000 (---------------)  + I workshop
+	0x0030cb8e, // n0x15e4 c0x0000 (---------------)  + I xn--9dbhblg6di
+	0x0031d714, // n0x15e5 c0x0000 (---------------)  + I xn--comunicaes-v6a2o
+	0x0031dc24, // n0x15e6 c0x0000 (---------------)  + I xn--correios-e-telecomunicaes-ghc29a
+	0x0033b8ca, // n0x15e7 c0x0000 (---------------)  + I xn--h1aegh
+	0x0035a14b, // n0x15e8 c0x0000 (---------------)  + I xn--lns-qla
+	0x002ed184, // n0x15e9 c0x0000 (---------------)  + I york
+	0x002ed189, // n0x15ea c0x0000 (---------------)  + I yorkshire
+	0x002aab48, // n0x15eb c0x0000 (---------------)  + I yosemite
+	0x0024b0c5, // n0x15ec c0x0000 (---------------)  + I youth
+	0x002ed80a, // n0x15ed c0x0000 (---------------)  + I zoological
+	0x0027a507, // n0x15ee c0x0000 (---------------)  + I zoology
+	0x002389c4, // n0x15ef c0x0000 (---------------)  + I aero
+	0x00330b83, // n0x15f0 c0x0000 (---------------)  + I biz
+	0x00233503, // n0x15f1 c0x0000 (---------------)  + I com
+	0x0023d684, // n0x15f2 c0x0000 (---------------)  + I coop
+	0x0023a783, // n0x15f3 c0x0000 (---------------)  + I edu
+	0x0026cc83, // n0x15f4 c0x0000 (---------------)  + I gov
+	0x003a1244, // n0x15f5 c0x0000 (---------------)  + I info
+	0x00201603, // n0x15f6 c0x0000 (---------------)  + I int
+	0x00209003, // n0x15f7 c0x0000 (---------------)  + I mil
+	0x002d0106, // n0x15f8 c0x0000 (---------------)  + I museum
+	0x00205284, // n0x15f9 c0x0000 (---------------)  + I name
+	0x0021fe03, // n0x15fa c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x15fb c0x0000 (---------------)  + I org
+	0x00220e43, // n0x15fc c0x0000 (---------------)  + I pro
+	0x00201542, // n0x15fd c0x0000 (---------------)  + I ac
+	0x00330b83, // n0x15fe c0x0000 (---------------)  + I biz
+	0x00200742, // n0x15ff c0x0000 (---------------)  + I co
+	0x00233503, // n0x1600 c0x0000 (---------------)  + I com
+	0x0023d684, // n0x1601 c0x0000 (---------------)  + I coop
+	0x0023a783, // n0x1602 c0x0000 (---------------)  + I edu
+	0x0026cc83, // n0x1603 c0x0000 (---------------)  + I gov
+	0x00201603, // n0x1604 c0x0000 (---------------)  + I int
+	0x002d0106, // n0x1605 c0x0000 (---------------)  + I museum
+	0x0021fe03, // n0x1606 c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x1607 c0x0000 (---------------)  + I org
+	0x000ffa08, // n0x1608 c0x0000 (---------------)  +   blogspot
+	0x00233503, // n0x1609 c0x0000 (---------------)  + I com
+	0x0023a783, // n0x160a c0x0000 (---------------)  + I edu
+	0x00213183, // n0x160b c0x0000 (---------------)  + I gob
+	0x0021fe03, // n0x160c c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x160d c0x0000 (---------------)  + I org
+	0x000ffa08, // n0x160e c0x0000 (---------------)  +   blogspot
+	0x00233503, // n0x160f c0x0000 (---------------)  + I com
+	0x0023a783, // n0x1610 c0x0000 (---------------)  + I edu
+	0x0026cc83, // n0x1611 c0x0000 (---------------)  + I gov
+	0x00209003, // n0x1612 c0x0000 (---------------)  + I mil
+	0x00205284, // n0x1613 c0x0000 (---------------)  + I name
+	0x0021fe03, // n0x1614 c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x1615 c0x0000 (---------------)  + I org
+	0x0062f7c8, // n0x1616 c0x0001 (---------------)  ! I teledata
+	0x00200302, // n0x1617 c0x0000 (---------------)  + I ca
+	0x0022e182, // n0x1618 c0x0000 (---------------)  + I cc
+	0x00200742, // n0x1619 c0x0000 (---------------)  + I co
+	0x00233503, // n0x161a c0x0000 (---------------)  + I com
+	0x0022bf42, // n0x161b c0x0000 (---------------)  + I dr
+	0x002013c2, // n0x161c c0x0000 (---------------)  + I in
+	0x003a1244, // n0x161d c0x0000 (---------------)  + I info
+	0x00207104, // n0x161e c0x0000 (---------------)  + I mobi
+	0x0021bb02, // n0x161f c0x0000 (---------------)  + I mx
+	0x00205284, // n0x1620 c0x0000 (---------------)  + I name
+	0x00200282, // n0x1621 c0x0000 (---------------)  + I or
+	0x0022d1c3, // n0x1622 c0x0000 (---------------)  + I org
+	0x00220e43, // n0x1623 c0x0000 (---------------)  + I pro
+	0x0023d0c6, // n0x1624 c0x0000 (---------------)  + I school
+	0x00224e42, // n0x1625 c0x0000 (---------------)  + I tv
+	0x00202382, // n0x1626 c0x0000 (---------------)  + I us
+	0x0020b942, // n0x1627 c0x0000 (---------------)  + I ws
+	0x38e22103, // n0x1628 c0x00e3 (n0x162a-n0x162b)  o I her
+	0x39218ac3, // n0x1629 c0x00e4 (n0x162b-n0x162c)  o I his
+	0x00057c46, // n0x162a c0x0000 (---------------)  +   forgot
+	0x00057c46, // n0x162b c0x0000 (---------------)  +   forgot
+	0x002d4884, // n0x162c c0x0000 (---------------)  + I asso
+	0x00116c0c, // n0x162d c0x0000 (---------------)  +   at-band-camp
+	0x0001be0c, // n0x162e c0x0000 (---------------)  +   azure-mobile
+	0x00080ecd, // n0x162f c0x0000 (---------------)  +   azurewebsites
+	0x000fb147, // n0x1630 c0x0000 (---------------)  +   blogdns
+	0x00020208, // n0x1631 c0x0000 (---------------)  +   broke-it
+	0x0019898a, // n0x1632 c0x0000 (---------------)  +   buyshouses
+	0x39e3e2c5, // n0x1633 c0x00e7 (n0x1663-n0x1664)  o I cdn77
+	0x0003e2c9, // n0x1634 c0x0000 (---------------)  +   cdn77-ssl
+	0x00009188, // n0x1635 c0x0000 (---------------)  +   cloudapp
+	0x0019d4ca, // n0x1636 c0x0000 (---------------)  +   cloudfront
+	0x0003118e, // n0x1637 c0x0000 (---------------)  +   cloudfunctions
+	0x0014c048, // n0x1638 c0x0000 (---------------)  +   dnsalias
+	0x0007c9c7, // n0x1639 c0x0000 (---------------)  +   dnsdojo
+	0x00160607, // n0x163a c0x0000 (---------------)  +   does-it
+	0x0016a009, // n0x163b c0x0000 (---------------)  +   dontexist
+	0x0008cdc7, // n0x163c c0x0000 (---------------)  +   dsmynas
+	0x00197b48, // n0x163d c0x0000 (---------------)  +   dynalias
+	0x000e9d09, // n0x163e c0x0000 (---------------)  +   dynathome
+	0x001a46c5, // n0x163f c0x0000 (---------------)  +   dynv6
+	0x000a950d, // n0x1640 c0x0000 (---------------)  +   endofinternet
+	0x00008f88, // n0x1641 c0x0000 (---------------)  +   familyds
+	0x3a24c206, // n0x1642 c0x00e8 (n0x1664-n0x1666)  o I fastly
+	0x00064447, // n0x1643 c0x0000 (---------------)  +   from-az
+	0x00065a47, // n0x1644 c0x0000 (---------------)  +   from-co
+	0x0006a1c7, // n0x1645 c0x0000 (---------------)  +   from-la
+	0x0006f3c7, // n0x1646 c0x0000 (---------------)  +   from-ny
+	0x0000d202, // n0x1647 c0x0000 (---------------)  +   gb
+	0x00157907, // n0x1648 c0x0000 (---------------)  +   gets-it
+	0x00064a8c, // n0x1649 c0x0000 (---------------)  +   ham-radio-op
+	0x00146347, // n0x164a c0x0000 (---------------)  +   homeftp
+	0x000a51c6, // n0x164b c0x0000 (---------------)  +   homeip
+	0x000a59c9, // n0x164c c0x0000 (---------------)  +   homelinux
+	0x000a6fc8, // n0x164d c0x0000 (---------------)  +   homeunix
+	0x000195c2, // n0x164e c0x0000 (---------------)  +   hu
+	0x000013c2, // n0x164f c0x0000 (---------------)  +   in
+	0x00007b0b, // n0x1650 c0x0000 (---------------)  +   in-the-band
+	0x00012789, // n0x1651 c0x0000 (---------------)  +   is-a-chef
+	0x0004e989, // n0x1652 c0x0000 (---------------)  +   is-a-geek
+	0x0008e588, // n0x1653 c0x0000 (---------------)  +   isa-geek
+	0x000ae3c2, // n0x1654 c0x0000 (---------------)  +   jp
+	0x00150c09, // n0x1655 c0x0000 (---------------)  +   kicks-ass
+	0x0002168d, // n0x1656 c0x0000 (---------------)  +   office-on-the
+	0x000dcd47, // n0x1657 c0x0000 (---------------)  +   podzone
+	0x000ecb08, // n0x1658 c0x0000 (---------------)  +   rackmaze
+	0x001376cd, // n0x1659 c0x0000 (---------------)  +   scrapper-site
+	0x000046c2, // n0x165a c0x0000 (---------------)  +   se
+	0x0006ba86, // n0x165b c0x0000 (---------------)  +   selfip
+	0x00090208, // n0x165c c0x0000 (---------------)  +   sells-it
+	0x000cb7c8, // n0x165d c0x0000 (---------------)  +   servebbs
+	0x000895c8, // n0x165e c0x0000 (---------------)  +   serveftp
+	0x00054088, // n0x165f c0x0000 (---------------)  +   thruhere
+	0x00000f82, // n0x1660 c0x0000 (---------------)  +   uk
+	0x000eadc6, // n0x1661 c0x0000 (---------------)  +   webhop
+	0x00005f82, // n0x1662 c0x0000 (---------------)  +   za
+	0x000002c1, // n0x1663 c0x0000 (---------------)  +   r
+	0x3a6e2044, // n0x1664 c0x00e9 (n0x1666-n0x1668)  o I prod
+	0x3aa3e443, // n0x1665 c0x00ea (n0x1668-n0x166b)  o I ssl
+	0x00000101, // n0x1666 c0x0000 (---------------)  +   a
+	0x0000d846, // n0x1667 c0x0000 (---------------)  +   global
+	0x00000101, // n0x1668 c0x0000 (---------------)  +   a
+	0x00000001, // n0x1669 c0x0000 (---------------)  +   b
+	0x0000d846, // n0x166a c0x0000 (---------------)  +   global
+	0x0024bf84, // n0x166b c0x0000 (---------------)  + I arts
+	0x00233503, // n0x166c c0x0000 (---------------)  + I com
+	0x0024d9c4, // n0x166d c0x0000 (---------------)  + I firm
+	0x003a1244, // n0x166e c0x0000 (---------------)  + I info
+	0x0021fe03, // n0x166f c0x0000 (---------------)  + I net
+	0x00222085, // n0x1670 c0x0000 (---------------)  + I other
+	0x00220f03, // n0x1671 c0x0000 (---------------)  + I per
+	0x0022a5c3, // n0x1672 c0x0000 (---------------)  + I rec
+	0x00391185, // n0x1673 c0x0000 (---------------)  + I store
+	0x00221a03, // n0x1674 c0x0000 (---------------)  + I web
+	0x3b633503, // n0x1675 c0x00ed (n0x167f-n0x1680)  + I com
+	0x0023a783, // n0x1676 c0x0000 (---------------)  + I edu
+	0x0026cc83, // n0x1677 c0x0000 (---------------)  + I gov
+	0x00200041, // n0x1678 c0x0000 (---------------)  + I i
+	0x00209003, // n0x1679 c0x0000 (---------------)  + I mil
+	0x00207104, // n0x167a c0x0000 (---------------)  + I mobi
+	0x00205284, // n0x167b c0x0000 (---------------)  + I name
+	0x0021fe03, // n0x167c c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x167d c0x0000 (---------------)  + I org
+	0x00217443, // n0x167e c0x0000 (---------------)  + I sch
+	0x000ffa08, // n0x167f c0x0000 (---------------)  +   blogspot
+	0x00201542, // n0x1680 c0x0000 (---------------)  + I ac
+	0x00330b83, // n0x1681 c0x0000 (---------------)  + I biz
+	0x00200742, // n0x1682 c0x0000 (---------------)  + I co
+	0x00233503, // n0x1683 c0x0000 (---------------)  + I com
+	0x0023a783, // n0x1684 c0x0000 (---------------)  + I edu
+	0x00213183, // n0x1685 c0x0000 (---------------)  + I gob
+	0x002013c2, // n0x1686 c0x0000 (---------------)  + I in
+	0x003a1244, // n0x1687 c0x0000 (---------------)  + I info
+	0x00201603, // n0x1688 c0x0000 (---------------)  + I int
+	0x00209003, // n0x1689 c0x0000 (---------------)  + I mil
+	0x0021fe03, // n0x168a c0x0000 (---------------)  + I net
+	0x00201483, // n0x168b c0x0000 (---------------)  + I nom
+	0x0022d1c3, // n0x168c c0x0000 (---------------)  + I org
+	0x00221a03, // n0x168d c0x0000 (---------------)  + I web
+	0x000ffa08, // n0x168e c0x0000 (---------------)  +   blogspot
+	0x00365782, // n0x168f c0x0000 (---------------)  + I bv
+	0x00000742, // n0x1690 c0x0000 (---------------)  +   co
+	0x3c622f02, // n0x1691 c0x00f1 (n0x1967-n0x1968)  + I aa
+	0x00355648, // n0x1692 c0x0000 (---------------)  + I aarborte
+	0x00223386, // n0x1693 c0x0000 (---------------)  + I aejrie
+	0x002bb486, // n0x1694 c0x0000 (---------------)  + I afjord
+	0x00222d07, // n0x1695 c0x0000 (---------------)  + I agdenes
+	0x3ca04f02, // n0x1696 c0x00f2 (n0x1968-n0x1969)  + I ah
+	0x3cf7c888, // n0x1697 c0x00f3 (n0x1969-n0x196a)  o I akershus
+	0x00354a4a, // n0x1698 c0x0000 (---------------)  + I aknoluokta
+	0x00263ec8, // n0x1699 c0x0000 (---------------)  + I akrehamn
+	0x002001c2, // n0x169a c0x0000 (---------------)  + I al
+	0x003552c9, // n0x169b c0x0000 (---------------)  + I alaheadju
+	0x003206c7, // n0x169c c0x0000 (---------------)  + I alesund
+	0x00219046, // n0x169d c0x0000 (---------------)  + I algard
+	0x00204e09, // n0x169e c0x0000 (---------------)  + I alstahaug
+	0x0023adc4, // n0x169f c0x0000 (---------------)  + I alta
+	0x002bbf06, // n0x16a0 c0x0000 (---------------)  + I alvdal
+	0x002bb884, // n0x16a1 c0x0000 (---------------)  + I amli
+	0x00278604, // n0x16a2 c0x0000 (---------------)  + I amot
+	0x00259c09, // n0x16a3 c0x0000 (---------------)  + I andasuolo
+	0x0022c086, // n0x16a4 c0x0000 (---------------)  + I andebu
+	0x00259645, // n0x16a5 c0x0000 (---------------)  + I andoy
+	0x00267dc5, // n0x16a6 c0x0000 (---------------)  + I ardal
+	0x00234b07, // n0x16a7 c0x0000 (---------------)  + I aremark
+	0x002b87c7, // n0x16a8 c0x0000 (---------------)  + I arendal
+	0x0032fec4, // n0x16a9 c0x0000 (---------------)  + I arna
+	0x00222f46, // n0x16aa c0x0000 (---------------)  + I aseral
+	0x002e2b85, // n0x16ab c0x0000 (---------------)  + I asker
+	0x00230345, // n0x16ac c0x0000 (---------------)  + I askim
+	0x002f58c5, // n0x16ad c0x0000 (---------------)  + I askoy
+	0x00389107, // n0x16ae c0x0000 (---------------)  + I askvoll
+	0x00331105, // n0x16af c0x0000 (---------------)  + I asnes
+	0x00309f89, // n0x16b0 c0x0000 (---------------)  + I audnedaln
+	0x00255485, // n0x16b1 c0x0000 (---------------)  + I aukra
+	0x002fadc4, // n0x16b2 c0x0000 (---------------)  + I aure
+	0x00323447, // n0x16b3 c0x0000 (---------------)  + I aurland
+	0x0025de0e, // n0x16b4 c0x0000 (---------------)  + I aurskog-holand
+	0x00272489, // n0x16b5 c0x0000 (---------------)  + I austevoll
+	0x0030f789, // n0x16b6 c0x0000 (---------------)  + I austrheim
+	0x00326bc6, // n0x16b7 c0x0000 (---------------)  + I averoy
+	0x002f2388, // n0x16b8 c0x0000 (---------------)  + I badaddja
+	0x002ade0b, // n0x16b9 c0x0000 (---------------)  + I bahcavuotna
+	0x002d13cc, // n0x16ba c0x0000 (---------------)  + I bahccavuotna
+	0x0026a446, // n0x16bb c0x0000 (---------------)  + I baidar
+	0x00372147, // n0x16bc c0x0000 (---------------)  + I bajddar
+	0x0025ef05, // n0x16bd c0x0000 (---------------)  + I balat
+	0x00228a8a, // n0x16be c0x0000 (---------------)  + I balestrand
+	0x00306f89, // n0x16bf c0x0000 (---------------)  + I ballangen
+	0x00254b89, // n0x16c0 c0x0000 (---------------)  + I balsfjord
+	0x00271906, // n0x16c1 c0x0000 (---------------)  + I bamble
+	0x002ef785, // n0x16c2 c0x0000 (---------------)  + I bardu
+	0x0027f705, // n0x16c3 c0x0000 (---------------)  + I barum
+	0x00354549, // n0x16c4 c0x0000 (---------------)  + I batsfjord
+	0x002f5a4b, // n0x16c5 c0x0000 (---------------)  + I bearalvahki
+	0x0027c686, // n0x16c6 c0x0000 (---------------)  + I beardu
+	0x0032e046, // n0x16c7 c0x0000 (---------------)  + I beiarn
+	0x0020d144, // n0x16c8 c0x0000 (---------------)  + I berg
+	0x0028b146, // n0x16c9 c0x0000 (---------------)  + I bergen
+	0x003223c8, // n0x16ca c0x0000 (---------------)  + I berlevag
+	0x00200006, // n0x16cb c0x0000 (---------------)  + I bievat
+	0x00398d86, // n0x16cc c0x0000 (---------------)  + I bindal
+	0x002054c8, // n0x16cd c0x0000 (---------------)  + I birkenes
+	0x00206507, // n0x16ce c0x0000 (---------------)  + I bjarkoy
+	0x00206ec9, // n0x16cf c0x0000 (---------------)  + I bjerkreim
+	0x0020c285, // n0x16d0 c0x0000 (---------------)  + I bjugn
+	0x000ffa08, // n0x16d1 c0x0000 (---------------)  +   blogspot
+	0x00213204, // n0x16d2 c0x0000 (---------------)  + I bodo
+	0x003a4004, // n0x16d3 c0x0000 (---------------)  + I bokn
+	0x00210ac5, // n0x16d4 c0x0000 (---------------)  + I bomlo
+	0x0038c589, // n0x16d5 c0x0000 (---------------)  + I bremanger
+	0x00221247, // n0x16d6 c0x0000 (---------------)  + I bronnoy
+	0x0022124b, // n0x16d7 c0x0000 (---------------)  + I bronnoysund
+	0x0022260a, // n0x16d8 c0x0000 (---------------)  + I brumunddal
+	0x00228785, // n0x16d9 c0x0000 (---------------)  + I bryne
+	0x3d208642, // n0x16da c0x00f4 (n0x196a-n0x196b)  + I bu
+	0x00351247, // n0x16db c0x0000 (---------------)  + I budejju
+	0x3d62a108, // n0x16dc c0x00f5 (n0x196b-n0x196c)  o I buskerud
+	0x002b8007, // n0x16dd c0x0000 (---------------)  + I bygland
+	0x0022c3c5, // n0x16de c0x0000 (---------------)  + I bykle
+	0x00356fca, // n0x16df c0x0000 (---------------)  + I cahcesuolo
+	0x00000742, // n0x16e0 c0x0000 (---------------)  +   co
+	0x002b70cb, // n0x16e1 c0x0000 (---------------)  + I davvenjarga
+	0x0021490a, // n0x16e2 c0x0000 (---------------)  + I davvesiida
+	0x0039c006, // n0x16e3 c0x0000 (---------------)  + I deatnu
+	0x00274143, // n0x16e4 c0x0000 (---------------)  + I dep
+	0x002381cd, // n0x16e5 c0x0000 (---------------)  + I dielddanuorri
+	0x00271f0c, // n0x16e6 c0x0000 (---------------)  + I divtasvuodna
+	0x003079cd, // n0x16e7 c0x0000 (---------------)  + I divttasvuotna
+	0x00365c05, // n0x16e8 c0x0000 (---------------)  + I donna
+	0x00243885, // n0x16e9 c0x0000 (---------------)  + I dovre
+	0x002edd47, // n0x16ea c0x0000 (---------------)  + I drammen
+	0x003458c9, // n0x16eb c0x0000 (---------------)  + I drangedal
+	0x00354946, // n0x16ec c0x0000 (---------------)  + I drobak
+	0x00311885, // n0x16ed c0x0000 (---------------)  + I dyroy
+	0x0022e2c8, // n0x16ee c0x0000 (---------------)  + I egersund
+	0x0028b043, // n0x16ef c0x0000 (---------------)  + I eid
+	0x003116c8, // n0x16f0 c0x0000 (---------------)  + I eidfjord
+	0x0028b048, // n0x16f1 c0x0000 (---------------)  + I eidsberg
+	0x002bce07, // n0x16f2 c0x0000 (---------------)  + I eidskog
+	0x002d8248, // n0x16f3 c0x0000 (---------------)  + I eidsvoll
+	0x003a6609, // n0x16f4 c0x0000 (---------------)  + I eigersund
+	0x0023c547, // n0x16f5 c0x0000 (---------------)  + I elverum
+	0x00209807, // n0x16f6 c0x0000 (---------------)  + I enebakk
+	0x00279a48, // n0x16f7 c0x0000 (---------------)  + I engerdal
+	0x002fecc4, // n0x16f8 c0x0000 (---------------)  + I etne
+	0x002fecc7, // n0x16f9 c0x0000 (---------------)  + I etnedal
+	0x00251f48, // n0x16fa c0x0000 (---------------)  + I evenassi
+	0x00202b46, // n0x16fb c0x0000 (---------------)  + I evenes
+	0x003a03cf, // n0x16fc c0x0000 (---------------)  + I evje-og-hornnes
+	0x00212987, // n0x16fd c0x0000 (---------------)  + I farsund
+	0x0024cc06, // n0x16fe c0x0000 (---------------)  + I fauske
+	0x002d77c5, // n0x16ff c0x0000 (---------------)  + I fedje
+	0x002159c3, // n0x1700 c0x0000 (---------------)  + I fet
+	0x0034b7c7, // n0x1701 c0x0000 (---------------)  + I fetsund
+	0x0023f343, // n0x1702 c0x0000 (---------------)  + I fhs
+	0x0024c546, // n0x1703 c0x0000 (---------------)  + I finnoy
+	0x0024f086, // n0x1704 c0x0000 (---------------)  + I fitjar
+	0x00250506, // n0x1705 c0x0000 (---------------)  + I fjaler
+	0x0028f845, // n0x1706 c0x0000 (---------------)  + I fjell
+	0x00267683, // n0x1707 c0x0000 (---------------)  + I fla
+	0x00380648, // n0x1708 c0x0000 (---------------)  + I flakstad
+	0x0036ce89, // n0x1709 c0x0000 (---------------)  + I flatanger
+	0x00364c8b, // n0x170a c0x0000 (---------------)  + I flekkefjord
+	0x00377308, // n0x170b c0x0000 (---------------)  + I flesberg
+	0x00252605, // n0x170c c0x0000 (---------------)  + I flora
+	0x00253105, // n0x170d c0x0000 (---------------)  + I floro
+	0x3da42902, // n0x170e c0x00f6 (n0x196c-n0x196d)  + I fm
+	0x0037be09, // n0x170f c0x0000 (---------------)  + I folkebibl
+	0x002558c7, // n0x1710 c0x0000 (---------------)  + I folldal
+	0x0039bf45, // n0x1711 c0x0000 (---------------)  + I forde
+	0x00259b07, // n0x1712 c0x0000 (---------------)  + I forsand
+	0x0025b746, // n0x1713 c0x0000 (---------------)  + I fosnes
+	0x0035dfc5, // n0x1714 c0x0000 (---------------)  + I frana
+	0x0036420b, // n0x1715 c0x0000 (---------------)  + I fredrikstad
+	0x0025c484, // n0x1716 c0x0000 (---------------)  + I frei
+	0x00263a85, // n0x1717 c0x0000 (---------------)  + I frogn
+	0x00263bc7, // n0x1718 c0x0000 (---------------)  + I froland
+	0x00276a06, // n0x1719 c0x0000 (---------------)  + I frosta
+	0x00276e45, // n0x171a c0x0000 (---------------)  + I froya
+	0x00283e87, // n0x171b c0x0000 (---------------)  + I fuoisku
+	0x00284ec7, // n0x171c c0x0000 (---------------)  + I fuossko
+	0x0028db04, // n0x171d c0x0000 (---------------)  + I fusa
+	0x00288cca, // n0x171e c0x0000 (---------------)  + I fylkesbibl
+	0x00289188, // n0x171f c0x0000 (---------------)  + I fyresdal
+	0x002cdcc9, // n0x1720 c0x0000 (---------------)  + I gaivuotna
+	0x0021dd45, // n0x1721 c0x0000 (---------------)  + I galsa
+	0x002b7306, // n0x1722 c0x0000 (---------------)  + I gamvik
+	0x0032258a, // n0x1723 c0x0000 (---------------)  + I gangaviika
+	0x00267cc6, // n0x1724 c0x0000 (---------------)  + I gaular
+	0x002b6187, // n0x1725 c0x0000 (---------------)  + I gausdal
+	0x002cd98d, // n0x1726 c0x0000 (---------------)  + I giehtavuoatna
+	0x00226cc9, // n0x1727 c0x0000 (---------------)  + I gildeskal
+	0x00328b05, // n0x1728 c0x0000 (---------------)  + I giske
+	0x00310047, // n0x1729 c0x0000 (---------------)  + I gjemnes
+	0x003279c8, // n0x172a c0x0000 (---------------)  + I gjerdrum
+	0x0032f588, // n0x172b c0x0000 (---------------)  + I gjerstad
+	0x00249607, // n0x172c c0x0000 (---------------)  + I gjesdal
+	0x00249e46, // n0x172d c0x0000 (---------------)  + I gjovik
+	0x00212b87, // n0x172e c0x0000 (---------------)  + I gloppen
+	0x0024dbc3, // n0x172f c0x0000 (---------------)  + I gol
+	0x00334544, // n0x1730 c0x0000 (---------------)  + I gran
+	0x0035bc85, // n0x1731 c0x0000 (---------------)  + I grane
+	0x00384e47, // n0x1732 c0x0000 (---------------)  + I granvin
+	0x00388b09, // n0x1733 c0x0000 (---------------)  + I gratangen
+	0x0022d248, // n0x1734 c0x0000 (---------------)  + I grimstad
+	0x002b6085, // n0x1735 c0x0000 (---------------)  + I grong
+	0x0039a744, // n0x1736 c0x0000 (---------------)  + I grue
+	0x0035d2c5, // n0x1737 c0x0000 (---------------)  + I gulen
+	0x0025334d, // n0x1738 c0x0000 (---------------)  + I guovdageaidnu
+	0x00202442, // n0x1739 c0x0000 (---------------)  + I ha
+	0x002c9b86, // n0x173a c0x0000 (---------------)  + I habmer
+	0x0026b9c6, // n0x173b c0x0000 (---------------)  + I hadsel
+	0x002a5e4a, // n0x173c c0x0000 (---------------)  + I hagebostad
+	0x0035f386, // n0x173d c0x0000 (---------------)  + I halden
+	0x0036d3c5, // n0x173e c0x0000 (---------------)  + I halsa
+	0x0025e745, // n0x173f c0x0000 (---------------)  + I hamar
+	0x0025e747, // n0x1740 c0x0000 (---------------)  + I hamaroy
+	0x0037558c, // n0x1741 c0x0000 (---------------)  + I hammarfeasta
+	0x0033c28a, // n0x1742 c0x0000 (---------------)  + I hammerfest
+	0x0028aa06, // n0x1743 c0x0000 (---------------)  + I hapmir
+	0x002cfb05, // n0x1744 c0x0000 (---------------)  + I haram
+	0x0028af86, // n0x1745 c0x0000 (---------------)  + I hareid
+	0x0028b2c7, // n0x1746 c0x0000 (---------------)  + I harstad
+	0x0028c606, // n0x1747 c0x0000 (---------------)  + I hasvik
+	0x0028f74c, // n0x1748 c0x0000 (---------------)  + I hattfjelldal
+	0x00204f49, // n0x1749 c0x0000 (---------------)  + I haugesund
+	0x3de36587, // n0x174a c0x00f7 (n0x196d-n0x1970)  o I hedmark
+	0x002910c5, // n0x174b c0x0000 (---------------)  + I hemne
+	0x002910c6, // n0x174c c0x0000 (---------------)  + I hemnes
+	0x00291d48, // n0x174d c0x0000 (---------------)  + I hemsedal
+	0x00232305, // n0x174e c0x0000 (---------------)  + I herad
+	0x002a4585, // n0x174f c0x0000 (---------------)  + I hitra
+	0x002a47c8, // n0x1750 c0x0000 (---------------)  + I hjartdal
+	0x002a49ca, // n0x1751 c0x0000 (---------------)  + I hjelmeland
+	0x3e248fc2, // n0x1752 c0x00f8 (n0x1970-n0x1971)  + I hl
+	0x3e60e942, // n0x1753 c0x00f9 (n0x1971-n0x1972)  + I hm
+	0x00378245, // n0x1754 c0x0000 (---------------)  + I hobol
+	0x002d7743, // n0x1755 c0x0000 (---------------)  + I hof
+	0x003a4508, // n0x1756 c0x0000 (---------------)  + I hokksund
+	0x0023ce83, // n0x1757 c0x0000 (---------------)  + I hol
+	0x002a4c44, // n0x1758 c0x0000 (---------------)  + I hole
+	0x002a814b, // n0x1759 c0x0000 (---------------)  + I holmestrand
+	0x002ae1c8, // n0x175a c0x0000 (---------------)  + I holtalen
+	0x002a7ac8, // n0x175b c0x0000 (---------------)  + I honefoss
+	0x3eb1a749, // n0x175c c0x00fa (n0x1972-n0x1973)  o I hordaland
+	0x002a8f89, // n0x175d c0x0000 (---------------)  + I hornindal
+	0x002a9406, // n0x175e c0x0000 (---------------)  + I horten
+	0x002aa188, // n0x175f c0x0000 (---------------)  + I hoyanger
+	0x002aa389, // n0x1760 c0x0000 (---------------)  + I hoylandet
+	0x002ab246, // n0x1761 c0x0000 (---------------)  + I hurdal
+	0x002ab3c5, // n0x1762 c0x0000 (---------------)  + I hurum
+	0x00363586, // n0x1763 c0x0000 (---------------)  + I hvaler
+	0x002ab849, // n0x1764 c0x0000 (---------------)  + I hyllestad
+	0x00229187, // n0x1765 c0x0000 (---------------)  + I ibestad
+	0x0026dd46, // n0x1766 c0x0000 (---------------)  + I idrett
+	0x002e7747, // n0x1767 c0x0000 (---------------)  + I inderoy
+	0x003547c7, // n0x1768 c0x0000 (---------------)  + I iveland
+	0x0023fcc4, // n0x1769 c0x0000 (---------------)  + I ivgu
+	0x3ee1cfc9, // n0x176a c0x00fb (n0x1973-n0x1974)  + I jan-mayen
+	0x002c57c8, // n0x176b c0x0000 (---------------)  + I jessheim
+	0x00358388, // n0x176c c0x0000 (---------------)  + I jevnaker
+	0x00343c87, // n0x176d c0x0000 (---------------)  + I jolster
+	0x002c1046, // n0x176e c0x0000 (---------------)  + I jondal
+	0x002fc709, // n0x176f c0x0000 (---------------)  + I jorpeland
+	0x002bc3c7, // n0x1770 c0x0000 (---------------)  + I kafjord
+	0x0024fd0a, // n0x1771 c0x0000 (---------------)  + I karasjohka
+	0x0037dbc8, // n0x1772 c0x0000 (---------------)  + I karasjok
+	0x00330887, // n0x1773 c0x0000 (---------------)  + I karlsoy
+	0x00229586, // n0x1774 c0x0000 (---------------)  + I karmoy
+	0x002650ca, // n0x1775 c0x0000 (---------------)  + I kautokeino
+	0x0027e3c8, // n0x1776 c0x0000 (---------------)  + I kirkenes
+	0x0026b445, // n0x1777 c0x0000 (---------------)  + I klabu
+	0x00374f05, // n0x1778 c0x0000 (---------------)  + I klepp
+	0x00387dc7, // n0x1779 c0x0000 (---------------)  + I kommune
+	0x002bfb09, // n0x177a c0x0000 (---------------)  + I kongsberg
+	0x002c478b, // n0x177b c0x0000 (---------------)  + I kongsvinger
+	0x002d6808, // n0x177c c0x0000 (---------------)  + I kopervik
+	0x00255509, // n0x177d c0x0000 (---------------)  + I kraanghke
+	0x00250787, // n0x177e c0x0000 (---------------)  + I kragero
+	0x002af50c, // n0x177f c0x0000 (---------------)  + I kristiansand
+	0x002b01cc, // n0x1780 c0x0000 (---------------)  + I kristiansund
+	0x002b04ca, // n0x1781 c0x0000 (---------------)  + I krodsherad
+	0x002b074c, // n0x1782 c0x0000 (---------------)  + I krokstadelva
+	0x002bb408, // n0x1783 c0x0000 (---------------)  + I kvafjord
+	0x002bb608, // n0x1784 c0x0000 (---------------)  + I kvalsund
+	0x002bb804, // n0x1785 c0x0000 (---------------)  + I kvam
+	0x002bc589, // n0x1786 c0x0000 (---------------)  + I kvanangen
+	0x002bc7c9, // n0x1787 c0x0000 (---------------)  + I kvinesdal
+	0x002bca0a, // n0x1788 c0x0000 (---------------)  + I kvinnherad
+	0x002bcc89, // n0x1789 c0x0000 (---------------)  + I kviteseid
+	0x002bcfc7, // n0x178a c0x0000 (---------------)  + I kvitsoy
+	0x003a4dcc, // n0x178b c0x0000 (---------------)  + I laakesvuemie
+	0x00338186, // n0x178c c0x0000 (---------------)  + I lahppi
+	0x00258008, // n0x178d c0x0000 (---------------)  + I langevag
+	0x00267d86, // n0x178e c0x0000 (---------------)  + I lardal
+	0x0037f706, // n0x178f c0x0000 (---------------)  + I larvik
+	0x00328a07, // n0x1790 c0x0000 (---------------)  + I lavagis
+	0x00272688, // n0x1791 c0x0000 (---------------)  + I lavangen
+	0x00331a4b, // n0x1792 c0x0000 (---------------)  + I leangaviika
+	0x002b7ec7, // n0x1793 c0x0000 (---------------)  + I lebesby
+	0x002598c9, // n0x1794 c0x0000 (---------------)  + I leikanger
+	0x0035e489, // n0x1795 c0x0000 (---------------)  + I leirfjord
+	0x00296d87, // n0x1796 c0x0000 (---------------)  + I leirvik
+	0x002bbac4, // n0x1797 c0x0000 (---------------)  + I leka
+	0x002bf987, // n0x1798 c0x0000 (---------------)  + I leksvik
+	0x003562c6, // n0x1799 c0x0000 (---------------)  + I lenvik
+	0x00217606, // n0x179a c0x0000 (---------------)  + I lerdal
+	0x0031f845, // n0x179b c0x0000 (---------------)  + I lesja
+	0x00219f88, // n0x179c c0x0000 (---------------)  + I levanger
+	0x002ddf44, // n0x179d c0x0000 (---------------)  + I lier
+	0x002ddf46, // n0x179e c0x0000 (---------------)  + I lierne
+	0x0033c14b, // n0x179f c0x0000 (---------------)  + I lillehammer
+	0x00330089, // n0x17a0 c0x0000 (---------------)  + I lillesand
+	0x00322dc6, // n0x17a1 c0x0000 (---------------)  + I lindas
+	0x00345ac9, // n0x17a2 c0x0000 (---------------)  + I lindesnes
+	0x00389286, // n0x17a3 c0x0000 (---------------)  + I loabat
+	0x00259dc8, // n0x17a4 c0x0000 (---------------)  + I lodingen
+	0x00214303, // n0x17a5 c0x0000 (---------------)  + I lom
+	0x00390905, // n0x17a6 c0x0000 (---------------)  + I loppa
+	0x00216209, // n0x17a7 c0x0000 (---------------)  + I lorenskog
+	0x00217745, // n0x17a8 c0x0000 (---------------)  + I loten
+	0x002fb344, // n0x17a9 c0x0000 (---------------)  + I lund
+	0x00275306, // n0x17aa c0x0000 (---------------)  + I lunner
+	0x00378ec5, // n0x17ab c0x0000 (---------------)  + I luroy
+	0x002dcb06, // n0x17ac c0x0000 (---------------)  + I luster
+	0x002fccc7, // n0x17ad c0x0000 (---------------)  + I lyngdal
+	0x00213606, // n0x17ae c0x0000 (---------------)  + I lyngen
+	0x00298bcb, // n0x17af c0x0000 (---------------)  + I malatvuopmi
+	0x002e4e47, // n0x17b0 c0x0000 (---------------)  + I malselv
+	0x00205c86, // n0x17b1 c0x0000 (---------------)  + I malvik
+	0x0034fcc6, // n0x17b2 c0x0000 (---------------)  + I mandal
+	0x00234bc6, // n0x17b3 c0x0000 (---------------)  + I marker
+	0x0032fe89, // n0x17b4 c0x0000 (---------------)  + I marnardal
+	0x0021ed8a, // n0x17b5 c0x0000 (---------------)  + I masfjorden
+	0x0032a985, // n0x17b6 c0x0000 (---------------)  + I masoy
+	0x0022080d, // n0x17b7 c0x0000 (---------------)  + I matta-varjjat
+	0x002a4ac6, // n0x17b8 c0x0000 (---------------)  + I meland
+	0x002160c6, // n0x17b9 c0x0000 (---------------)  + I meldal
+	0x00291886, // n0x17ba c0x0000 (---------------)  + I melhus
+	0x002a7e05, // n0x17bb c0x0000 (---------------)  + I meloy
+	0x0037c7c7, // n0x17bc c0x0000 (---------------)  + I meraker
+	0x0029d687, // n0x17bd c0x0000 (---------------)  + I midsund
+	0x002e5e0e, // n0x17be c0x0000 (---------------)  + I midtre-gauldal
+	0x00209003, // n0x17bf c0x0000 (---------------)  + I mil
+	0x002c1009, // n0x17c0 c0x0000 (---------------)  + I mjondalen
+	0x00239209, // n0x17c1 c0x0000 (---------------)  + I mo-i-rana
+	0x00228e87, // n0x17c2 c0x0000 (---------------)  + I moareke
+	0x0026c087, // n0x17c3 c0x0000 (---------------)  + I modalen
+	0x002a67c5, // n0x17c4 c0x0000 (---------------)  + I modum
+	0x00325445, // n0x17c5 c0x0000 (---------------)  + I molde
+	0x3f25d3cf, // n0x17c6 c0x00fc (n0x1974-n0x1976)  o I more-og-romsdal
+	0x002c7f87, // n0x17c7 c0x0000 (---------------)  + I mosjoen
+	0x002c8148, // n0x17c8 c0x0000 (---------------)  + I moskenes
+	0x002c8884, // n0x17c9 c0x0000 (---------------)  + I moss
+	0x002c8c46, // n0x17ca c0x0000 (---------------)  + I mosvik
+	0x3f64aa02, // n0x17cb c0x00fd (n0x1976-n0x1977)  + I mr
+	0x002cc2c6, // n0x17cc c0x0000 (---------------)  + I muosat
+	0x002d0106, // n0x17cd c0x0000 (---------------)  + I museum
+	0x00331d8e, // n0x17ce c0x0000 (---------------)  + I naamesjevuemie
+	0x0031150a, // n0x17cf c0x0000 (---------------)  + I namdalseid
+	0x002b57c6, // n0x17d0 c0x0000 (---------------)  + I namsos
+	0x002261ca, // n0x17d1 c0x0000 (---------------)  + I namsskogan
+	0x002c3349, // n0x17d2 c0x0000 (---------------)  + I nannestad
+	0x00315d45, // n0x17d3 c0x0000 (---------------)  + I naroy
+	0x0038ac08, // n0x17d4 c0x0000 (---------------)  + I narviika
+	0x003a29c6, // n0x17d5 c0x0000 (---------------)  + I narvik
+	0x00255008, // n0x17d6 c0x0000 (---------------)  + I naustdal
+	0x0031a1c8, // n0x17d7 c0x0000 (---------------)  + I navuotna
+	0x0030930b, // n0x17d8 c0x0000 (---------------)  + I nedre-eiker
+	0x00222e05, // n0x17d9 c0x0000 (---------------)  + I nesna
+	0x00331188, // n0x17da c0x0000 (---------------)  + I nesodden
+	0x0020560c, // n0x17db c0x0000 (---------------)  + I nesoddtangen
+	0x0022c287, // n0x17dc c0x0000 (---------------)  + I nesseby
+	0x0024f8c6, // n0x17dd c0x0000 (---------------)  + I nesset
+	0x00230048, // n0x17de c0x0000 (---------------)  + I nissedal
+	0x00279d48, // n0x17df c0x0000 (---------------)  + I nittedal
+	0x3fa47802, // n0x17e0 c0x00fe (n0x1977-n0x1978)  + I nl
+	0x002bbccb, // n0x17e1 c0x0000 (---------------)  + I nord-aurdal
+	0x00397f89, // n0x17e2 c0x0000 (---------------)  + I nord-fron
+	0x0034c449, // n0x17e3 c0x0000 (---------------)  + I nord-odal
+	0x00328887, // n0x17e4 c0x0000 (---------------)  + I norddal
+	0x00249408, // n0x17e5 c0x0000 (---------------)  + I nordkapp
+	0x3ff45708, // n0x17e6 c0x00ff (n0x1978-n0x197c)  o I nordland
+	0x0025f08b, // n0x17e7 c0x0000 (---------------)  + I nordre-land
+	0x0028e409, // n0x17e8 c0x0000 (---------------)  + I nordreisa
+	0x0021000d, // n0x17e9 c0x0000 (---------------)  + I nore-og-uvdal
+	0x002547c8, // n0x17ea c0x0000 (---------------)  + I notodden
+	0x0032c588, // n0x17eb c0x0000 (---------------)  + I notteroy
+	0x402009c2, // n0x17ec c0x0100 (n0x197c-n0x197d)  + I nt
+	0x00202d84, // n0x17ed c0x0000 (---------------)  + I odda
+	0x4060b282, // n0x17ee c0x0101 (n0x197d-n0x197e)  + I of
+	0x0037dd46, // n0x17ef c0x0000 (---------------)  + I oksnes
+	0x40a02242, // n0x17f0 c0x0102 (n0x197e-n0x197f)  + I ol
+	0x0037a0ca, // n0x17f1 c0x0000 (---------------)  + I omasvuotna
+	0x00352086, // n0x17f2 c0x0000 (---------------)  + I oppdal
+	0x00225388, // n0x17f3 c0x0000 (---------------)  + I oppegard
+	0x00255c88, // n0x17f4 c0x0000 (---------------)  + I orkanger
+	0x002f2686, // n0x17f5 c0x0000 (---------------)  + I orkdal
+	0x00338a46, // n0x17f6 c0x0000 (---------------)  + I orland
+	0x002e5306, // n0x17f7 c0x0000 (---------------)  + I orskog
+	0x0027b0c5, // n0x17f8 c0x0000 (---------------)  + I orsta
+	0x00240e44, // n0x17f9 c0x0000 (---------------)  + I osen
+	0x40ec40c4, // n0x17fa c0x0103 (n0x197f-n0x1980)  + I oslo
+	0x00334ec6, // n0x17fb c0x0000 (---------------)  + I osoyro
+	0x002510c7, // n0x17fc c0x0000 (---------------)  + I osteroy
+	0x4139f9c7, // n0x17fd c0x0104 (n0x1980-n0x1981)  o I ostfold
+	0x002d968b, // n0x17fe c0x0000 (---------------)  + I ostre-toten
+	0x0025e1c9, // n0x17ff c0x0000 (---------------)  + I overhalla
+	0x002438ca, // n0x1800 c0x0000 (---------------)  + I ovre-eiker
+	0x003173c4, // n0x1801 c0x0000 (---------------)  + I oyer
+	0x0025e888, // n0x1802 c0x0000 (---------------)  + I oygarden
+	0x0026db0d, // n0x1803 c0x0000 (---------------)  + I oystre-slidre
+	0x002e0209, // n0x1804 c0x0000 (---------------)  + I porsanger
+	0x002e0448, // n0x1805 c0x0000 (---------------)  + I porsangu
+	0x002e06c9, // n0x1806 c0x0000 (---------------)  + I porsgrunn
+	0x002e1c44, // n0x1807 c0x0000 (---------------)  + I priv
+	0x00204d04, // n0x1808 c0x0000 (---------------)  + I rade
+	0x0027ec05, // n0x1809 c0x0000 (---------------)  + I radoy
+	0x0027720b, // n0x180a c0x0000 (---------------)  + I rahkkeravju
+	0x002ae146, // n0x180b c0x0000 (---------------)  + I raholt
+	0x00334d05, // n0x180c c0x0000 (---------------)  + I raisa
+	0x0037c0c9, // n0x180d c0x0000 (---------------)  + I rakkestad
+	0x00223008, // n0x180e c0x0000 (---------------)  + I ralingen
+	0x00239344, // n0x180f c0x0000 (---------------)  + I rana
+	0x00228c09, // n0x1810 c0x0000 (---------------)  + I randaberg
+	0x00248c45, // n0x1811 c0x0000 (---------------)  + I rauma
+	0x002b8808, // n0x1812 c0x0000 (---------------)  + I rendalen
+	0x00209ec7, // n0x1813 c0x0000 (---------------)  + I rennebu
+	0x0030fb88, // n0x1814 c0x0000 (---------------)  + I rennesoy
+	0x0027f1c6, // n0x1815 c0x0000 (---------------)  + I rindal
+	0x00351107, // n0x1816 c0x0000 (---------------)  + I ringebu
+	0x0020e509, // n0x1817 c0x0000 (---------------)  + I ringerike
+	0x0023a189, // n0x1818 c0x0000 (---------------)  + I ringsaker
+	0x00277985, // n0x1819 c0x0000 (---------------)  + I risor
+	0x00238845, // n0x181a c0x0000 (---------------)  + I rissa
+	0x4162b682, // n0x181b c0x0105 (n0x1981-n0x1982)  + I rl
+	0x002fab84, // n0x181c c0x0000 (---------------)  + I roan
+	0x0029d105, // n0x181d c0x0000 (---------------)  + I rodoy
+	0x002cd3c6, // n0x181e c0x0000 (---------------)  + I rollag
+	0x00318545, // n0x181f c0x0000 (---------------)  + I romsa
+	0x002531c7, // n0x1820 c0x0000 (---------------)  + I romskog
+	0x00296bc5, // n0x1821 c0x0000 (---------------)  + I roros
+	0x00276a44, // n0x1822 c0x0000 (---------------)  + I rost
+	0x00326c86, // n0x1823 c0x0000 (---------------)  + I royken
+	0x00311907, // n0x1824 c0x0000 (---------------)  + I royrvik
+	0x0024aa46, // n0x1825 c0x0000 (---------------)  + I ruovat
+	0x003305c5, // n0x1826 c0x0000 (---------------)  + I rygge
+	0x00321248, // n0x1827 c0x0000 (---------------)  + I salangen
+	0x00223585, // n0x1828 c0x0000 (---------------)  + I salat
+	0x00322c47, // n0x1829 c0x0000 (---------------)  + I saltdal
+	0x0038ec09, // n0x182a c0x0000 (---------------)  + I samnanger
+	0x003301ca, // n0x182b c0x0000 (---------------)  + I sandefjord
+	0x0022e9c7, // n0x182c c0x0000 (---------------)  + I sandnes
+	0x0022e9cc, // n0x182d c0x0000 (---------------)  + I sandnessjoen
+	0x00259606, // n0x182e c0x0000 (---------------)  + I sandoy
+	0x0022d049, // n0x182f c0x0000 (---------------)  + I sarpsborg
+	0x002314c5, // n0x1830 c0x0000 (---------------)  + I sauda
+	0x00232248, // n0x1831 c0x0000 (---------------)  + I sauherad
+	0x00210703, // n0x1832 c0x0000 (---------------)  + I sel
+	0x00210705, // n0x1833 c0x0000 (---------------)  + I selbu
+	0x00329905, // n0x1834 c0x0000 (---------------)  + I selje
+	0x0024d147, // n0x1835 c0x0000 (---------------)  + I seljord
+	0x41a11cc2, // n0x1836 c0x0106 (n0x1982-n0x1983)  + I sf
+	0x002434c7, // n0x1837 c0x0000 (---------------)  + I siellak
+	0x002cb986, // n0x1838 c0x0000 (---------------)  + I sigdal
+	0x0021cf06, // n0x1839 c0x0000 (---------------)  + I siljan
+	0x0034d886, // n0x183a c0x0000 (---------------)  + I sirdal
+	0x00279c86, // n0x183b c0x0000 (---------------)  + I skanit
+	0x00307808, // n0x183c c0x0000 (---------------)  + I skanland
+	0x002d8085, // n0x183d c0x0000 (---------------)  + I skaun
+	0x0024ccc7, // n0x183e c0x0000 (---------------)  + I skedsmo
+	0x0024cccd, // n0x183f c0x0000 (---------------)  + I skedsmokorset
+	0x00209743, // n0x1840 c0x0000 (---------------)  + I ski
+	0x00209745, // n0x1841 c0x0000 (---------------)  + I skien
+	0x002279c7, // n0x1842 c0x0000 (---------------)  + I skierva
+	0x002d1b48, // n0x1843 c0x0000 (---------------)  + I skiptvet
+	0x00227585, // n0x1844 c0x0000 (---------------)  + I skjak
+	0x00230ec8, // n0x1845 c0x0000 (---------------)  + I skjervoy
+	0x00266946, // n0x1846 c0x0000 (---------------)  + I skodje
+	0x0023e487, // n0x1847 c0x0000 (---------------)  + I slattum
+	0x002c0645, // n0x1848 c0x0000 (---------------)  + I smola
+	0x00222e86, // n0x1849 c0x0000 (---------------)  + I snaase
+	0x003604c5, // n0x184a c0x0000 (---------------)  + I snasa
+	0x002bae0a, // n0x184b c0x0000 (---------------)  + I snillfjord
+	0x002d9146, // n0x184c c0x0000 (---------------)  + I snoasa
+	0x0023c8c7, // n0x184d c0x0000 (---------------)  + I sogndal
+	0x002af145, // n0x184e c0x0000 (---------------)  + I sogne
+	0x002e2f47, // n0x184f c0x0000 (---------------)  + I sokndal
+	0x00359f04, // n0x1850 c0x0000 (---------------)  + I sola
+	0x002fb2c6, // n0x1851 c0x0000 (---------------)  + I solund
+	0x0037de85, // n0x1852 c0x0000 (---------------)  + I somna
+	0x0022be8b, // n0x1853 c0x0000 (---------------)  + I sondre-land
+	0x00356149, // n0x1854 c0x0000 (---------------)  + I songdalen
+	0x00378c8a, // n0x1855 c0x0000 (---------------)  + I sor-aurdal
+	0x00277a08, // n0x1856 c0x0000 (---------------)  + I sor-fron
+	0x002f43c8, // n0x1857 c0x0000 (---------------)  + I sor-odal
+	0x002f69cc, // n0x1858 c0x0000 (---------------)  + I sor-varanger
+	0x002fbfc7, // n0x1859 c0x0000 (---------------)  + I sorfold
+	0x002fd8c8, // n0x185a c0x0000 (---------------)  + I sorreisa
+	0x00301f88, // n0x185b c0x0000 (---------------)  + I sortland
+	0x003057c5, // n0x185c c0x0000 (---------------)  + I sorum
+	0x002bd24a, // n0x185d c0x0000 (---------------)  + I spjelkavik
+	0x003347c9, // n0x185e c0x0000 (---------------)  + I spydeberg
+	0x41e02742, // n0x185f c0x0107 (n0x1983-n0x1984)  + I st
+	0x00202746, // n0x1860 c0x0000 (---------------)  + I stange
+	0x0020f204, // n0x1861 c0x0000 (---------------)  + I stat
+	0x002ded49, // n0x1862 c0x0000 (---------------)  + I stathelle
+	0x002f35c9, // n0x1863 c0x0000 (---------------)  + I stavanger
+	0x00225047, // n0x1864 c0x0000 (---------------)  + I stavern
+	0x00251a47, // n0x1865 c0x0000 (---------------)  + I steigen
+	0x002833c9, // n0x1866 c0x0000 (---------------)  + I steinkjer
+	0x0038e808, // n0x1867 c0x0000 (---------------)  + I stjordal
+	0x0038e80f, // n0x1868 c0x0000 (---------------)  + I stjordalshalsen
+	0x00275e46, // n0x1869 c0x0000 (---------------)  + I stokke
+	0x0024688b, // n0x186a c0x0000 (---------------)  + I stor-elvdal
+	0x0037d0c5, // n0x186b c0x0000 (---------------)  + I stord
+	0x0037d0c7, // n0x186c c0x0000 (---------------)  + I stordal
+	0x002e6f89, // n0x186d c0x0000 (---------------)  + I storfjord
+	0x00228b86, // n0x186e c0x0000 (---------------)  + I strand
+	0x00228b87, // n0x186f c0x0000 (---------------)  + I stranda
+	0x0039e5c5, // n0x1870 c0x0000 (---------------)  + I stryn
+	0x00237304, // n0x1871 c0x0000 (---------------)  + I sula
+	0x002402c6, // n0x1872 c0x0000 (---------------)  + I suldal
+	0x00205084, // n0x1873 c0x0000 (---------------)  + I sund
+	0x0030a587, // n0x1874 c0x0000 (---------------)  + I sunndal
+	0x002e8fc8, // n0x1875 c0x0000 (---------------)  + I surnadal
+	0x422ef688, // n0x1876 c0x0108 (n0x1984-n0x1985)  + I svalbard
+	0x002efc85, // n0x1877 c0x0000 (---------------)  + I sveio
+	0x002efdc7, // n0x1878 c0x0000 (---------------)  + I svelvik
+	0x00375cc9, // n0x1879 c0x0000 (---------------)  + I sykkylven
+	0x00206cc4, // n0x187a c0x0000 (---------------)  + I tana
+	0x00206cc8, // n0x187b c0x0000 (---------------)  + I tananger
+	0x42664f08, // n0x187c c0x0109 (n0x1985-n0x1987)  o I telemark
+	0x00269804, // n0x187d c0x0000 (---------------)  + I time
+	0x00237e88, // n0x187e c0x0000 (---------------)  + I tingvoll
+	0x002ea3c4, // n0x187f c0x0000 (---------------)  + I tinn
+	0x00226789, // n0x1880 c0x0000 (---------------)  + I tjeldsund
+	0x0026cec5, // n0x1881 c0x0000 (---------------)  + I tjome
+	0x42a00142, // n0x1882 c0x010a (n0x1987-n0x1988)  + I tm
+	0x00275e85, // n0x1883 c0x0000 (---------------)  + I tokke
+	0x0021dc85, // n0x1884 c0x0000 (---------------)  + I tolga
+	0x003661c8, // n0x1885 c0x0000 (---------------)  + I tonsberg
+	0x0023b587, // n0x1886 c0x0000 (---------------)  + I torsken
+	0x42e03002, // n0x1887 c0x010b (n0x1988-n0x1989)  + I tr
+	0x002c9d45, // n0x1888 c0x0000 (---------------)  + I trana
+	0x00274dc6, // n0x1889 c0x0000 (---------------)  + I tranby
+	0x00292546, // n0x188a c0x0000 (---------------)  + I tranoy
+	0x002fab48, // n0x188b c0x0000 (---------------)  + I troandin
+	0x002ffbc8, // n0x188c c0x0000 (---------------)  + I trogstad
+	0x00318506, // n0x188d c0x0000 (---------------)  + I tromsa
+	0x00323bc6, // n0x188e c0x0000 (---------------)  + I tromso
+	0x00352589, // n0x188f c0x0000 (---------------)  + I trondheim
+	0x00341ec6, // n0x1890 c0x0000 (---------------)  + I trysil
+	0x00356ccb, // n0x1891 c0x0000 (---------------)  + I tvedestrand
+	0x0024f6c5, // n0x1892 c0x0000 (---------------)  + I tydal
+	0x00219b46, // n0x1893 c0x0000 (---------------)  + I tynset
+	0x00215a48, // n0x1894 c0x0000 (---------------)  + I tysfjord
+	0x002336c6, // n0x1895 c0x0000 (---------------)  + I tysnes
+	0x00235ec6, // n0x1896 c0x0000 (---------------)  + I tysvar
+	0x0021518a, // n0x1897 c0x0000 (---------------)  + I ullensaker
+	0x0034440a, // n0x1898 c0x0000 (---------------)  + I ullensvang
+	0x0028acc5, // n0x1899 c0x0000 (---------------)  + I ulvik
+	0x002c7a87, // n0x189a c0x0000 (---------------)  + I unjarga
+	0x00341946, // n0x189b c0x0000 (---------------)  + I utsira
+	0x432000c2, // n0x189c c0x010c (n0x1989-n0x198a)  + I va
+	0x00227b07, // n0x189d c0x0000 (---------------)  + I vaapste
+	0x00274745, // n0x189e c0x0000 (---------------)  + I vadso
+	0x00322504, // n0x189f c0x0000 (---------------)  + I vaga
+	0x00322505, // n0x18a0 c0x0000 (---------------)  + I vagan
+	0x003172c6, // n0x18a1 c0x0000 (---------------)  + I vagsoy
+	0x0032cec7, // n0x18a2 c0x0000 (---------------)  + I vaksdal
+	0x00217105, // n0x18a3 c0x0000 (---------------)  + I valle
+	0x0021a004, // n0x18a4 c0x0000 (---------------)  + I vang
+	0x0026f108, // n0x18a5 c0x0000 (---------------)  + I vanylven
+	0x00235f85, // n0x18a6 c0x0000 (---------------)  + I vardo
+	0x002923c7, // n0x18a7 c0x0000 (---------------)  + I varggat
+	0x002f0545, // n0x18a8 c0x0000 (---------------)  + I varoy
+	0x002140c5, // n0x18a9 c0x0000 (---------------)  + I vefsn
+	0x00230284, // n0x18aa c0x0000 (---------------)  + I vega
+	0x0028a309, // n0x18ab c0x0000 (---------------)  + I vegarshei
+	0x002e29c8, // n0x18ac c0x0000 (---------------)  + I vennesla
+	0x00374106, // n0x18ad c0x0000 (---------------)  + I verdal
+	0x0033f346, // n0x18ae c0x0000 (---------------)  + I verran
+	0x00269506, // n0x18af c0x0000 (---------------)  + I vestby
+	0x4379aa48, // n0x18b0 c0x010d (n0x198a-n0x198b)  o I vestfold
+	0x002f3807, // n0x18b1 c0x0000 (---------------)  + I vestnes
+	0x002f3e8d, // n0x18b2 c0x0000 (---------------)  + I vestre-slidre
+	0x002f45cc, // n0x18b3 c0x0000 (---------------)  + I vestre-toten
+	0x002f4bc9, // n0x18b4 c0x0000 (---------------)  + I vestvagoy
+	0x002f4e09, // n0x18b5 c0x0000 (---------------)  + I vevelstad
+	0x43b4f482, // n0x18b6 c0x010e (n0x198b-n0x198c)  + I vf
+	0x00399d43, // n0x18b7 c0x0000 (---------------)  + I vgs
+	0x00205d43, // n0x18b8 c0x0000 (---------------)  + I vik
+	0x00356385, // n0x18b9 c0x0000 (---------------)  + I vikna
+	0x00384f4a, // n0x18ba c0x0000 (---------------)  + I vindafjord
+	0x003183c6, // n0x18bb c0x0000 (---------------)  + I voagat
+	0x002f9845, // n0x18bc c0x0000 (---------------)  + I volda
+	0x002fd204, // n0x18bd c0x0000 (---------------)  + I voss
+	0x002fd20b, // n0x18be c0x0000 (---------------)  + I vossevangen
+	0x0030d90c, // n0x18bf c0x0000 (---------------)  + I xn--andy-ira
+	0x0030e14c, // n0x18c0 c0x0000 (---------------)  + I xn--asky-ira
+	0x0030e455, // n0x18c1 c0x0000 (---------------)  + I xn--aurskog-hland-jnb
+	0x003104cd, // n0x18c2 c0x0000 (---------------)  + I xn--avery-yua
+	0x003128cf, // n0x18c3 c0x0000 (---------------)  + I xn--bdddj-mrabd
+	0x00312c92, // n0x18c4 c0x0000 (---------------)  + I xn--bearalvhki-y4a
+	0x0031310f, // n0x18c5 c0x0000 (---------------)  + I xn--berlevg-jxa
+	0x003134d2, // n0x18c6 c0x0000 (---------------)  + I xn--bhcavuotna-s4a
+	0x00313953, // n0x18c7 c0x0000 (---------------)  + I xn--bhccavuotna-k7a
+	0x00313e0d, // n0x18c8 c0x0000 (---------------)  + I xn--bidr-5nac
+	0x003143cd, // n0x18c9 c0x0000 (---------------)  + I xn--bievt-0qa
+	0x0031474e, // n0x18ca c0x0000 (---------------)  + I xn--bjarky-fya
+	0x00314c0e, // n0x18cb c0x0000 (---------------)  + I xn--bjddar-pta
+	0x0031534c, // n0x18cc c0x0000 (---------------)  + I xn--blt-elab
+	0x003156cc, // n0x18cd c0x0000 (---------------)  + I xn--bmlo-gra
+	0x00315b0b, // n0x18ce c0x0000 (---------------)  + I xn--bod-2na
+	0x00315e8e, // n0x18cf c0x0000 (---------------)  + I xn--brnny-wuac
+	0x003178d2, // n0x18d0 c0x0000 (---------------)  + I xn--brnnysund-m8ac
+	0x0031818c, // n0x18d1 c0x0000 (---------------)  + I xn--brum-voa
+	0x003188d0, // n0x18d2 c0x0000 (---------------)  + I xn--btsfjord-9za
+	0x00329d52, // n0x18d3 c0x0000 (---------------)  + I xn--davvenjrga-y4a
+	0x0032aacc, // n0x18d4 c0x0000 (---------------)  + I xn--dnna-gra
+	0x0032b18d, // n0x18d5 c0x0000 (---------------)  + I xn--drbak-wua
+	0x0032b4cc, // n0x18d6 c0x0000 (---------------)  + I xn--dyry-ira
+	0x0032d351, // n0x18d7 c0x0000 (---------------)  + I xn--eveni-0qa01ga
+	0x0032e1cd, // n0x18d8 c0x0000 (---------------)  + I xn--finny-yua
+	0x0033318d, // n0x18d9 c0x0000 (---------------)  + I xn--fjord-lra
+	0x0033378a, // n0x18da c0x0000 (---------------)  + I xn--fl-zia
+	0x00333a0c, // n0x18db c0x0000 (---------------)  + I xn--flor-jra
+	0x0033430c, // n0x18dc c0x0000 (---------------)  + I xn--frde-gra
+	0x00334a0c, // n0x18dd c0x0000 (---------------)  + I xn--frna-woa
+	0x0033528c, // n0x18de c0x0000 (---------------)  + I xn--frya-hra
+	0x00338bd3, // n0x18df c0x0000 (---------------)  + I xn--ggaviika-8ya47h
+	0x003391d0, // n0x18e0 c0x0000 (---------------)  + I xn--gildeskl-g0a
+	0x003395d0, // n0x18e1 c0x0000 (---------------)  + I xn--givuotna-8ya
+	0x0033a24d, // n0x18e2 c0x0000 (---------------)  + I xn--gjvik-wua
+	0x0033a84c, // n0x18e3 c0x0000 (---------------)  + I xn--gls-elac
+	0x0033b449, // n0x18e4 c0x0000 (---------------)  + I xn--h-2fa
+	0x0033da4d, // n0x18e5 c0x0000 (---------------)  + I xn--hbmer-xqa
+	0x0033dd93, // n0x18e6 c0x0000 (---------------)  + I xn--hcesuolo-7ya35b
+	0x0033e991, // n0x18e7 c0x0000 (---------------)  + I xn--hgebostad-g3a
+	0x0033edd3, // n0x18e8 c0x0000 (---------------)  + I xn--hmmrfeasta-s4ac
+	0x0033f58f, // n0x18e9 c0x0000 (---------------)  + I xn--hnefoss-q1a
+	0x0033f94c, // n0x18ea c0x0000 (---------------)  + I xn--hobl-ira
+	0x0033fc4f, // n0x18eb c0x0000 (---------------)  + I xn--holtlen-hxa
+	0x0034000d, // n0x18ec c0x0000 (---------------)  + I xn--hpmir-xqa
+	0x0034060f, // n0x18ed c0x0000 (---------------)  + I xn--hyanger-q1a
+	0x003409d0, // n0x18ee c0x0000 (---------------)  + I xn--hylandet-54a
+	0x0034144e, // n0x18ef c0x0000 (---------------)  + I xn--indery-fya
+	0x00346c4e, // n0x18f0 c0x0000 (---------------)  + I xn--jlster-bya
+	0x00347390, // n0x18f1 c0x0000 (---------------)  + I xn--jrpeland-54a
+	0x0034860d, // n0x18f2 c0x0000 (---------------)  + I xn--karmy-yua
+	0x00348f8e, // n0x18f3 c0x0000 (---------------)  + I xn--kfjord-iua
+	0x0034930c, // n0x18f4 c0x0000 (---------------)  + I xn--klbu-woa
+	0x0034a2d3, // n0x18f5 c0x0000 (---------------)  + I xn--koluokta-7ya57h
+	0x0034c68e, // n0x18f6 c0x0000 (---------------)  + I xn--krager-gya
+	0x0034da10, // n0x18f7 c0x0000 (---------------)  + I xn--kranghke-b0a
+	0x0034de11, // n0x18f8 c0x0000 (---------------)  + I xn--krdsherad-m8a
+	0x0034e24f, // n0x18f9 c0x0000 (---------------)  + I xn--krehamn-dxa
+	0x0034e613, // n0x18fa c0x0000 (---------------)  + I xn--krjohka-hwab49j
+	0x0034f00d, // n0x18fb c0x0000 (---------------)  + I xn--ksnes-uua
+	0x0034f34f, // n0x18fc c0x0000 (---------------)  + I xn--kvfjord-nxa
+	0x0034f70e, // n0x18fd c0x0000 (---------------)  + I xn--kvitsy-fya
+	0x0034fe50, // n0x18fe c0x0000 (---------------)  + I xn--kvnangen-k0a
+	0x00350249, // n0x18ff c0x0000 (---------------)  + I xn--l-1fa
+	0x00353090, // n0x1900 c0x0000 (---------------)  + I xn--laheadju-7ya
+	0x003536cf, // n0x1901 c0x0000 (---------------)  + I xn--langevg-jxa
+	0x00353d4f, // n0x1902 c0x0000 (---------------)  + I xn--ldingen-q1a
+	0x00354112, // n0x1903 c0x0000 (---------------)  + I xn--leagaviika-52b
+	0x00357c8e, // n0x1904 c0x0000 (---------------)  + I xn--lesund-hua
+	0x0035858d, // n0x1905 c0x0000 (---------------)  + I xn--lgrd-poac
+	0x0035930d, // n0x1906 c0x0000 (---------------)  + I xn--lhppi-xqa
+	0x0035964d, // n0x1907 c0x0000 (---------------)  + I xn--linds-pra
+	0x0035aa0d, // n0x1908 c0x0000 (---------------)  + I xn--loabt-0qa
+	0x0035ad4d, // n0x1909 c0x0000 (---------------)  + I xn--lrdal-sra
+	0x0035b090, // n0x190a c0x0000 (---------------)  + I xn--lrenskog-54a
+	0x0035b48b, // n0x190b c0x0000 (---------------)  + I xn--lt-liac
+	0x0035ba4c, // n0x190c c0x0000 (---------------)  + I xn--lten-gra
+	0x0035bdcc, // n0x190d c0x0000 (---------------)  + I xn--lury-ira
+	0x0035c0cc, // n0x190e c0x0000 (---------------)  + I xn--mely-ira
+	0x0035c3ce, // n0x190f c0x0000 (---------------)  + I xn--merker-kua
+	0x00366c50, // n0x1910 c0x0000 (---------------)  + I xn--mjndalen-64a
+	0x00368512, // n0x1911 c0x0000 (---------------)  + I xn--mlatvuopmi-s4a
+	0x0036898b, // n0x1912 c0x0000 (---------------)  + I xn--mli-tla
+	0x0036940e, // n0x1913 c0x0000 (---------------)  + I xn--mlselv-iua
+	0x0036978e, // n0x1914 c0x0000 (---------------)  + I xn--moreke-jua
+	0x0036a48e, // n0x1915 c0x0000 (---------------)  + I xn--mosjen-eya
+	0x0036c0cb, // n0x1916 c0x0000 (---------------)  + I xn--mot-tla
+	0x43f6c696, // n0x1917 c0x010f (n0x198c-n0x198e)  o I xn--mre-og-romsdal-qqb
+	0x0036d0cd, // n0x1918 c0x0000 (---------------)  + I xn--msy-ula0h
+	0x0036e814, // n0x1919 c0x0000 (---------------)  + I xn--mtta-vrjjat-k7af
+	0x0036f70d, // n0x191a c0x0000 (---------------)  + I xn--muost-0qa
+	0x00371c95, // n0x191b c0x0000 (---------------)  + I xn--nmesjevuemie-tcba
+	0x0037308d, // n0x191c c0x0000 (---------------)  + I xn--nry-yla5g
+	0x00373a0f, // n0x191d c0x0000 (---------------)  + I xn--nttery-byae
+	0x0037428f, // n0x191e c0x0000 (---------------)  + I xn--nvuotna-hwa
+	0x0037750f, // n0x191f c0x0000 (---------------)  + I xn--oppegrd-ixa
+	0x003778ce, // n0x1920 c0x0000 (---------------)  + I xn--ostery-fya
+	0x0037900d, // n0x1921 c0x0000 (---------------)  + I xn--osyro-wua
+	0x0037a891, // n0x1922 c0x0000 (---------------)  + I xn--porsgu-sta26f
+	0x0037eecc, // n0x1923 c0x0000 (---------------)  + I xn--rady-ira
+	0x0037f1cc, // n0x1924 c0x0000 (---------------)  + I xn--rdal-poa
+	0x0037f4cb, // n0x1925 c0x0000 (---------------)  + I xn--rde-ula
+	0x0037fa8c, // n0x1926 c0x0000 (---------------)  + I xn--rdy-0nab
+	0x0037fe4f, // n0x1927 c0x0000 (---------------)  + I xn--rennesy-v1a
+	0x00380212, // n0x1928 c0x0000 (---------------)  + I xn--rhkkervju-01af
+	0x00380bcd, // n0x1929 c0x0000 (---------------)  + I xn--rholt-mra
+	0x00381b8c, // n0x192a c0x0000 (---------------)  + I xn--risa-5na
+	0x0038200c, // n0x192b c0x0000 (---------------)  + I xn--risr-ira
+	0x0038230d, // n0x192c c0x0000 (---------------)  + I xn--rland-uua
+	0x0038264f, // n0x192d c0x0000 (---------------)  + I xn--rlingen-mxa
+	0x00382a0e, // n0x192e c0x0000 (---------------)  + I xn--rmskog-bya
+	0x00384c0c, // n0x192f c0x0000 (---------------)  + I xn--rros-gra
+	0x003851cd, // n0x1930 c0x0000 (---------------)  + I xn--rskog-uua
+	0x0038550b, // n0x1931 c0x0000 (---------------)  + I xn--rst-0na
+	0x00385acc, // n0x1932 c0x0000 (---------------)  + I xn--rsta-fra
+	0x0038604d, // n0x1933 c0x0000 (---------------)  + I xn--ryken-vua
+	0x0038638e, // n0x1934 c0x0000 (---------------)  + I xn--ryrvik-bya
+	0x00386809, // n0x1935 c0x0000 (---------------)  + I xn--s-1fa
+	0x00387513, // n0x1936 c0x0000 (---------------)  + I xn--sandnessjen-ogb
+	0x00387f8d, // n0x1937 c0x0000 (---------------)  + I xn--sandy-yua
+	0x003882cd, // n0x1938 c0x0000 (---------------)  + I xn--seral-lra
+	0x003888cc, // n0x1939 c0x0000 (---------------)  + I xn--sgne-gra
+	0x00388d4e, // n0x193a c0x0000 (---------------)  + I xn--skierv-uta
+	0x00389bcf, // n0x193b c0x0000 (---------------)  + I xn--skjervy-v1a
+	0x00389f8c, // n0x193c c0x0000 (---------------)  + I xn--skjk-soa
+	0x0038a28d, // n0x193d c0x0000 (---------------)  + I xn--sknit-yqa
+	0x0038a5cf, // n0x193e c0x0000 (---------------)  + I xn--sknland-fxa
+	0x0038a98c, // n0x193f c0x0000 (---------------)  + I xn--slat-5na
+	0x0038b08c, // n0x1940 c0x0000 (---------------)  + I xn--slt-elab
+	0x0038b44c, // n0x1941 c0x0000 (---------------)  + I xn--smla-hra
+	0x0038b74c, // n0x1942 c0x0000 (---------------)  + I xn--smna-gra
+	0x0038be0d, // n0x1943 c0x0000 (---------------)  + I xn--snase-nra
+	0x0038c152, // n0x1944 c0x0000 (---------------)  + I xn--sndre-land-0cb
+	0x0038c7cc, // n0x1945 c0x0000 (---------------)  + I xn--snes-poa
+	0x0038cacc, // n0x1946 c0x0000 (---------------)  + I xn--snsa-roa
+	0x0038cdd1, // n0x1947 c0x0000 (---------------)  + I xn--sr-aurdal-l8a
+	0x0038d20f, // n0x1948 c0x0000 (---------------)  + I xn--sr-fron-q1a
+	0x0038d5cf, // n0x1949 c0x0000 (---------------)  + I xn--sr-odal-q1a
+	0x0038d993, // n0x194a c0x0000 (---------------)  + I xn--sr-varanger-ggb
+	0x0038ee4e, // n0x194b c0x0000 (---------------)  + I xn--srfold-bya
+	0x0038f3cf, // n0x194c c0x0000 (---------------)  + I xn--srreisa-q1a
+	0x0038f78c, // n0x194d c0x0000 (---------------)  + I xn--srum-gra
+	0x4438face, // n0x194e c0x0110 (n0x198e-n0x198f)  o I xn--stfold-9xa
+	0x0038fe4f, // n0x194f c0x0000 (---------------)  + I xn--stjrdal-s1a
+	0x00390216, // n0x1950 c0x0000 (---------------)  + I xn--stjrdalshalsen-sqb
+	0x00390d12, // n0x1951 c0x0000 (---------------)  + I xn--stre-toten-zcb
+	0x0039230c, // n0x1952 c0x0000 (---------------)  + I xn--tjme-hra
+	0x00392acf, // n0x1953 c0x0000 (---------------)  + I xn--tnsberg-q1a
+	0x0039314d, // n0x1954 c0x0000 (---------------)  + I xn--trany-yua
+	0x0039348f, // n0x1955 c0x0000 (---------------)  + I xn--trgstad-r1a
+	0x0039384c, // n0x1956 c0x0000 (---------------)  + I xn--trna-woa
+	0x00393b4d, // n0x1957 c0x0000 (---------------)  + I xn--troms-zua
+	0x00393e8d, // n0x1958 c0x0000 (---------------)  + I xn--tysvr-vra
+	0x0039570e, // n0x1959 c0x0000 (---------------)  + I xn--unjrga-rta
+	0x00396a8c, // n0x195a c0x0000 (---------------)  + I xn--vads-jra
+	0x00396d8c, // n0x195b c0x0000 (---------------)  + I xn--vard-jra
+	0x00397090, // n0x195c c0x0000 (---------------)  + I xn--vegrshei-c0a
+	0x003991d1, // n0x195d c0x0000 (---------------)  + I xn--vestvgy-ixa6o
+	0x0039960b, // n0x195e c0x0000 (---------------)  + I xn--vg-yiab
+	0x0039994c, // n0x195f c0x0000 (---------------)  + I xn--vgan-qoa
+	0x00399c4e, // n0x1960 c0x0000 (---------------)  + I xn--vgsy-qoa0j
+	0x0039af51, // n0x1961 c0x0000 (---------------)  + I xn--vre-eiker-k8a
+	0x0039b38e, // n0x1962 c0x0000 (---------------)  + I xn--vrggt-xqad
+	0x0039b70d, // n0x1963 c0x0000 (---------------)  + I xn--vry-yla5g
+	0x003a278b, // n0x1964 c0x0000 (---------------)  + I xn--yer-zna
+	0x003a308f, // n0x1965 c0x0000 (---------------)  + I xn--ygarden-p1a
+	0x003a4814, // n0x1966 c0x0000 (---------------)  + I xn--ystre-slidre-ujb
+	0x0023a242, // n0x1967 c0x0000 (---------------)  + I gs
+	0x0023a242, // n0x1968 c0x0000 (---------------)  + I gs
+	0x00202c03, // n0x1969 c0x0000 (---------------)  + I nes
+	0x0023a242, // n0x196a c0x0000 (---------------)  + I gs
+	0x00202c03, // n0x196b c0x0000 (---------------)  + I nes
+	0x0023a242, // n0x196c c0x0000 (---------------)  + I gs
+	0x0020a802, // n0x196d c0x0000 (---------------)  + I os
+	0x003635c5, // n0x196e c0x0000 (---------------)  + I valer
+	0x0039ac4c, // n0x196f c0x0000 (---------------)  + I xn--vler-qoa
+	0x0023a242, // n0x1970 c0x0000 (---------------)  + I gs
+	0x0023a242, // n0x1971 c0x0000 (---------------)  + I gs
+	0x0020a802, // n0x1972 c0x0000 (---------------)  + I os
+	0x0023a242, // n0x1973 c0x0000 (---------------)  + I gs
+	0x002921c5, // n0x1974 c0x0000 (---------------)  + I heroy
+	0x003301c5, // n0x1975 c0x0000 (---------------)  + I sande
+	0x0023a242, // n0x1976 c0x0000 (---------------)  + I gs
+	0x0023a242, // n0x1977 c0x0000 (---------------)  + I gs
+	0x0020e402, // n0x1978 c0x0000 (---------------)  + I bo
+	0x002921c5, // n0x1979 c0x0000 (---------------)  + I heroy
+	0x00310a09, // n0x197a c0x0000 (---------------)  + I xn--b-5ga
+	0x0033e68c, // n0x197b c0x0000 (---------------)  + I xn--hery-ira
+	0x0023a242, // n0x197c c0x0000 (---------------)  + I gs
+	0x0023a242, // n0x197d c0x0000 (---------------)  + I gs
+	0x0023a242, // n0x197e c0x0000 (---------------)  + I gs
+	0x0023a242, // n0x197f c0x0000 (---------------)  + I gs
+	0x003635c5, // n0x1980 c0x0000 (---------------)  + I valer
+	0x0023a242, // n0x1981 c0x0000 (---------------)  + I gs
+	0x0023a242, // n0x1982 c0x0000 (---------------)  + I gs
+	0x0023a242, // n0x1983 c0x0000 (---------------)  + I gs
+	0x0023a242, // n0x1984 c0x0000 (---------------)  + I gs
+	0x0020e402, // n0x1985 c0x0000 (---------------)  + I bo
+	0x00310a09, // n0x1986 c0x0000 (---------------)  + I xn--b-5ga
+	0x0023a242, // n0x1987 c0x0000 (---------------)  + I gs
+	0x0023a242, // n0x1988 c0x0000 (---------------)  + I gs
+	0x0023a242, // n0x1989 c0x0000 (---------------)  + I gs
+	0x003301c5, // n0x198a c0x0000 (---------------)  + I sande
+	0x0023a242, // n0x198b c0x0000 (---------------)  + I gs
+	0x003301c5, // n0x198c c0x0000 (---------------)  + I sande
+	0x0033e68c, // n0x198d c0x0000 (---------------)  + I xn--hery-ira
+	0x0039ac4c, // n0x198e c0x0000 (---------------)  + I xn--vler-qoa
+	0x00330b83, // n0x198f c0x0000 (---------------)  + I biz
+	0x00233503, // n0x1990 c0x0000 (---------------)  + I com
+	0x0023a783, // n0x1991 c0x0000 (---------------)  + I edu
+	0x0026cc83, // n0x1992 c0x0000 (---------------)  + I gov
+	0x003a1244, // n0x1993 c0x0000 (---------------)  + I info
+	0x0021fe03, // n0x1994 c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x1995 c0x0000 (---------------)  + I org
+	0x000ecf48, // n0x1996 c0x0000 (---------------)  +   merseine
+	0x000a9304, // n0x1997 c0x0000 (---------------)  +   mine
+	0x000feb48, // n0x1998 c0x0000 (---------------)  +   shacknet
+	0x00201542, // n0x1999 c0x0000 (---------------)  + I ac
+	0x45200742, // n0x199a c0x0114 (n0x19a9-n0x19aa)  + I co
+	0x00245b43, // n0x199b c0x0000 (---------------)  + I cri
+	0x0024eac4, // n0x199c c0x0000 (---------------)  + I geek
+	0x00205843, // n0x199d c0x0000 (---------------)  + I gen
+	0x00341e04, // n0x199e c0x0000 (---------------)  + I govt
+	0x0036b386, // n0x199f c0x0000 (---------------)  + I health
+	0x0020cec3, // n0x19a0 c0x0000 (---------------)  + I iwi
+	0x002eed84, // n0x19a1 c0x0000 (---------------)  + I kiwi
+	0x002703c5, // n0x19a2 c0x0000 (---------------)  + I maori
+	0x00209003, // n0x19a3 c0x0000 (---------------)  + I mil
+	0x0021fe03, // n0x19a4 c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x19a5 c0x0000 (---------------)  + I org
+	0x0028440a, // n0x19a6 c0x0000 (---------------)  + I parliament
+	0x0023d0c6, // n0x19a7 c0x0000 (---------------)  + I school
+	0x00369b0c, // n0x19a8 c0x0000 (---------------)  + I xn--mori-qsa
+	0x000ffa08, // n0x19a9 c0x0000 (---------------)  +   blogspot
+	0x00200742, // n0x19aa c0x0000 (---------------)  + I co
+	0x00233503, // n0x19ab c0x0000 (---------------)  + I com
+	0x0023a783, // n0x19ac c0x0000 (---------------)  + I edu
+	0x0026cc83, // n0x19ad c0x0000 (---------------)  + I gov
+	0x00213ac3, // n0x19ae c0x0000 (---------------)  + I med
+	0x002d0106, // n0x19af c0x0000 (---------------)  + I museum
+	0x0021fe03, // n0x19b0 c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x19b1 c0x0000 (---------------)  + I org
+	0x00220e43, // n0x19b2 c0x0000 (---------------)  + I pro
+	0x000035c2, // n0x19b3 c0x0000 (---------------)  +   ae
+	0x000fb147, // n0x19b4 c0x0000 (---------------)  +   blogdns
+	0x000d3588, // n0x19b5 c0x0000 (---------------)  +   blogsite
+	0x0000e74e, // n0x19b6 c0x0000 (---------------)  +   bmoattachments
+	0x000878d2, // n0x19b7 c0x0000 (---------------)  +   boldlygoingnowhere
+	0x45e3e2c5, // n0x19b8 c0x0117 (n0x19f0-n0x19f2)  o I cdn77
+	0x4631c4cc, // n0x19b9 c0x0118 (n0x19f2-n0x19f3)  o I cdn77-secure
+	0x0014c048, // n0x19ba c0x0000 (---------------)  +   dnsalias
+	0x0007c9c7, // n0x19bb c0x0000 (---------------)  +   dnsdojo
+	0x00014e0b, // n0x19bc c0x0000 (---------------)  +   doesntexist
+	0x0016a009, // n0x19bd c0x0000 (---------------)  +   dontexist
+	0x0014bf47, // n0x19be c0x0000 (---------------)  +   doomdns
+	0x0008cdc7, // n0x19bf c0x0000 (---------------)  +   dsmynas
+	0x0007c8c7, // n0x19c0 c0x0000 (---------------)  +   duckdns
+	0x00011046, // n0x19c1 c0x0000 (---------------)  +   dvrdns
+	0x00197b48, // n0x19c2 c0x0000 (---------------)  +   dynalias
+	0x46813886, // n0x19c3 c0x011a (n0x19f4-n0x19f6)  +   dyndns
+	0x000a950d, // n0x19c4 c0x0000 (---------------)  +   endofinternet
+	0x0005ea10, // n0x19c5 c0x0000 (---------------)  +   endoftheinternet
+	0x46c04b82, // n0x19c6 c0x011b (n0x19f6-n0x1a2d)  +   eu
+	0x00008f88, // n0x19c7 c0x0000 (---------------)  +   familyds
+	0x0006ac47, // n0x19c8 c0x0000 (---------------)  +   from-me
+	0x00097cc9, // n0x19c9 c0x0000 (---------------)  +   game-host
+	0x00057d06, // n0x19ca c0x0000 (---------------)  +   gotdns
+	0x0000a882, // n0x19cb c0x0000 (---------------)  +   hk
+	0x0014cfca, // n0x19cc c0x0000 (---------------)  +   hobby-site
+	0x00013a47, // n0x19cd c0x0000 (---------------)  +   homedns
+	0x00146347, // n0x19ce c0x0000 (---------------)  +   homeftp
+	0x000a59c9, // n0x19cf c0x0000 (---------------)  +   homelinux
+	0x000a6fc8, // n0x19d0 c0x0000 (---------------)  +   homeunix
+	0x000e0c0e, // n0x19d1 c0x0000 (---------------)  +   is-a-bruinsfan
+	0x0000c54e, // n0x19d2 c0x0000 (---------------)  +   is-a-candidate
+	0x00011a0f, // n0x19d3 c0x0000 (---------------)  +   is-a-celticsfan
+	0x00012789, // n0x19d4 c0x0000 (---------------)  +   is-a-chef
+	0x0004e989, // n0x19d5 c0x0000 (---------------)  +   is-a-geek
+	0x000704cb, // n0x19d6 c0x0000 (---------------)  +   is-a-knight
+	0x0007fa4f, // n0x19d7 c0x0000 (---------------)  +   is-a-linux-user
+	0x0008a50c, // n0x19d8 c0x0000 (---------------)  +   is-a-patsfan
+	0x000ab58b, // n0x19d9 c0x0000 (---------------)  +   is-a-soxfan
+	0x000b9e88, // n0x19da c0x0000 (---------------)  +   is-found
+	0x000d9587, // n0x19db c0x0000 (---------------)  +   is-lost
+	0x000fe008, // n0x19dc c0x0000 (---------------)  +   is-saved
+	0x000f218b, // n0x19dd c0x0000 (---------------)  +   is-very-bad
+	0x000f8d0c, // n0x19de c0x0000 (---------------)  +   is-very-evil
+	0x0011b8cc, // n0x19df c0x0000 (---------------)  +   is-very-good
+	0x0013aecc, // n0x19e0 c0x0000 (---------------)  +   is-very-nice
+	0x00142a4d, // n0x19e1 c0x0000 (---------------)  +   is-very-sweet
+	0x0008e588, // n0x19e2 c0x0000 (---------------)  +   isa-geek
+	0x00150c09, // n0x19e3 c0x0000 (---------------)  +   kicks-ass
+	0x001a24cb, // n0x19e4 c0x0000 (---------------)  +   misconfused
+	0x000dcd47, // n0x19e5 c0x0000 (---------------)  +   podzone
+	0x000d340a, // n0x19e6 c0x0000 (---------------)  +   readmyblog
+	0x0006ba86, // n0x19e7 c0x0000 (---------------)  +   selfip
+	0x00099a8d, // n0x19e8 c0x0000 (---------------)  +   sellsyourhome
+	0x000cb7c8, // n0x19e9 c0x0000 (---------------)  +   servebbs
+	0x000895c8, // n0x19ea c0x0000 (---------------)  +   serveftp
+	0x00173dc9, // n0x19eb c0x0000 (---------------)  +   servegame
+	0x000e868c, // n0x19ec c0x0000 (---------------)  +   stuff-4-sale
+	0x00002382, // n0x19ed c0x0000 (---------------)  +   us
+	0x000eadc6, // n0x19ee c0x0000 (---------------)  +   webhop
+	0x00005f82, // n0x19ef c0x0000 (---------------)  +   za
+	0x00000301, // n0x19f0 c0x0000 (---------------)  +   c
+	0x0003cdc3, // n0x19f1 c0x0000 (---------------)  +   rsc
+	0x46783486, // n0x19f2 c0x0119 (n0x19f3-n0x19f4)  o I origin
+	0x0003e443, // n0x19f3 c0x0000 (---------------)  +   ssl
+	0x00002d42, // n0x19f4 c0x0000 (---------------)  +   go
+	0x00013a44, // n0x19f5 c0x0000 (---------------)  +   home
+	0x000001c2, // n0x19f6 c0x0000 (---------------)  +   al
+	0x000d4884, // n0x19f7 c0x0000 (---------------)  +   asso
+	0x00000102, // n0x19f8 c0x0000 (---------------)  +   at
+	0x00004f82, // n0x19f9 c0x0000 (---------------)  +   au
+	0x00003302, // n0x19fa c0x0000 (---------------)  +   be
+	0x000ee482, // n0x19fb c0x0000 (---------------)  +   bg
+	0x00000302, // n0x19fc c0x0000 (---------------)  +   ca
+	0x0003e2c2, // n0x19fd c0x0000 (---------------)  +   cd
+	0x00001582, // n0x19fe c0x0000 (---------------)  +   ch
+	0x0001ba42, // n0x19ff c0x0000 (---------------)  +   cn
+	0x0003e082, // n0x1a00 c0x0000 (---------------)  +   cy
+	0x00029ec2, // n0x1a01 c0x0000 (---------------)  +   cz
+	0x00004d82, // n0x1a02 c0x0000 (---------------)  +   de
+	0x000494c2, // n0x1a03 c0x0000 (---------------)  +   dk
+	0x0003a783, // n0x1a04 c0x0000 (---------------)  +   edu
+	0x0000b342, // n0x1a05 c0x0000 (---------------)  +   ee
+	0x00000482, // n0x1a06 c0x0000 (---------------)  +   es
+	0x00007502, // n0x1a07 c0x0000 (---------------)  +   fi
+	0x00000582, // n0x1a08 c0x0000 (---------------)  +   fr
+	0x00000c82, // n0x1a09 c0x0000 (---------------)  +   gr
+	0x0000e4c2, // n0x1a0a c0x0000 (---------------)  +   hr
+	0x000195c2, // n0x1a0b c0x0000 (---------------)  +   hu
+	0x00000042, // n0x1a0c c0x0000 (---------------)  +   ie
+	0x00002902, // n0x1a0d c0x0000 (---------------)  +   il
+	0x000013c2, // n0x1a0e c0x0000 (---------------)  +   in
+	0x00001603, // n0x1a0f c0x0000 (---------------)  +   int
+	0x000006c2, // n0x1a10 c0x0000 (---------------)  +   is
+	0x00001e42, // n0x1a11 c0x0000 (---------------)  +   it
+	0x000ae3c2, // n0x1a12 c0x0000 (---------------)  +   jp
+	0x00006fc2, // n0x1a13 c0x0000 (---------------)  +   kr
+	0x00009e02, // n0x1a14 c0x0000 (---------------)  +   lt
+	0x00002f42, // n0x1a15 c0x0000 (---------------)  +   lu
+	0x00005d02, // n0x1a16 c0x0000 (---------------)  +   lv
+	0x0002ac02, // n0x1a17 c0x0000 (---------------)  +   mc
+	0x00003e82, // n0x1a18 c0x0000 (---------------)  +   me
+	0x00167142, // n0x1a19 c0x0000 (---------------)  +   mk
+	0x00004c02, // n0x1a1a c0x0000 (---------------)  +   mt
+	0x00026f02, // n0x1a1b c0x0000 (---------------)  +   my
+	0x0001fe03, // n0x1a1c c0x0000 (---------------)  +   net
+	0x00002802, // n0x1a1d c0x0000 (---------------)  +   ng
+	0x00047802, // n0x1a1e c0x0000 (---------------)  +   nl
+	0x00000c02, // n0x1a1f c0x0000 (---------------)  +   no
+	0x000094c2, // n0x1a20 c0x0000 (---------------)  +   nz
+	0x00077905, // n0x1a21 c0x0000 (---------------)  +   paris
+	0x000063c2, // n0x1a22 c0x0000 (---------------)  +   pl
+	0x0008c9c2, // n0x1a23 c0x0000 (---------------)  +   pt
+	0x00043b83, // n0x1a24 c0x0000 (---------------)  +   q-a
+	0x00002202, // n0x1a25 c0x0000 (---------------)  +   ro
+	0x00011302, // n0x1a26 c0x0000 (---------------)  +   ru
+	0x000046c2, // n0x1a27 c0x0000 (---------------)  +   se
+	0x0000a402, // n0x1a28 c0x0000 (---------------)  +   si
+	0x00007842, // n0x1a29 c0x0000 (---------------)  +   sk
+	0x00003002, // n0x1a2a c0x0000 (---------------)  +   tr
+	0x00000f82, // n0x1a2b c0x0000 (---------------)  +   uk
+	0x00002382, // n0x1a2c c0x0000 (---------------)  +   us
+	0x00210f43, // n0x1a2d c0x0000 (---------------)  + I abo
+	0x00201542, // n0x1a2e c0x0000 (---------------)  + I ac
+	0x00233503, // n0x1a2f c0x0000 (---------------)  + I com
+	0x0023a783, // n0x1a30 c0x0000 (---------------)  + I edu
+	0x00213183, // n0x1a31 c0x0000 (---------------)  + I gob
+	0x0020e2c3, // n0x1a32 c0x0000 (---------------)  + I ing
+	0x00213ac3, // n0x1a33 c0x0000 (---------------)  + I med
+	0x0021fe03, // n0x1a34 c0x0000 (---------------)  + I net
+	0x00201483, // n0x1a35 c0x0000 (---------------)  + I nom
+	0x0022d1c3, // n0x1a36 c0x0000 (---------------)  + I org
+	0x00292103, // n0x1a37 c0x0000 (---------------)  + I sld
+	0x000ffa08, // n0x1a38 c0x0000 (---------------)  +   blogspot
+	0x00233503, // n0x1a39 c0x0000 (---------------)  + I com
+	0x0023a783, // n0x1a3a c0x0000 (---------------)  + I edu
+	0x00213183, // n0x1a3b c0x0000 (---------------)  + I gob
+	0x00209003, // n0x1a3c c0x0000 (---------------)  + I mil
+	0x0021fe03, // n0x1a3d c0x0000 (---------------)  + I net
+	0x00201483, // n0x1a3e c0x0000 (---------------)  + I nom
+	0x0022d1c3, // n0x1a3f c0x0000 (---------------)  + I org
+	0x00233503, // n0x1a40 c0x0000 (---------------)  + I com
+	0x0023a783, // n0x1a41 c0x0000 (---------------)  + I edu
+	0x0022d1c3, // n0x1a42 c0x0000 (---------------)  + I org
+	0x00233503, // n0x1a43 c0x0000 (---------------)  + I com
+	0x0023a783, // n0x1a44 c0x0000 (---------------)  + I edu
+	0x0026cc83, // n0x1a45 c0x0000 (---------------)  + I gov
+	0x00200041, // n0x1a46 c0x0000 (---------------)  + I i
+	0x00209003, // n0x1a47 c0x0000 (---------------)  + I mil
+	0x0021fe03, // n0x1a48 c0x0000 (---------------)  + I net
+	0x00202d03, // n0x1a49 c0x0000 (---------------)  + I ngo
+	0x0022d1c3, // n0x1a4a c0x0000 (---------------)  + I org
+	0x00330b83, // n0x1a4b c0x0000 (---------------)  + I biz
+	0x00233503, // n0x1a4c c0x0000 (---------------)  + I com
+	0x0023a783, // n0x1a4d c0x0000 (---------------)  + I edu
+	0x00208f83, // n0x1a4e c0x0000 (---------------)  + I fam
+	0x00213183, // n0x1a4f c0x0000 (---------------)  + I gob
+	0x00337283, // n0x1a50 c0x0000 (---------------)  + I gok
+	0x00282e03, // n0x1a51 c0x0000 (---------------)  + I gon
+	0x002a36c3, // n0x1a52 c0x0000 (---------------)  + I gop
+	0x00276203, // n0x1a53 c0x0000 (---------------)  + I gos
+	0x0026cc83, // n0x1a54 c0x0000 (---------------)  + I gov
+	0x003a1244, // n0x1a55 c0x0000 (---------------)  + I info
+	0x0021fe03, // n0x1a56 c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x1a57 c0x0000 (---------------)  + I org
+	0x00221a03, // n0x1a58 c0x0000 (---------------)  + I web
+	0x002ebac4, // n0x1a59 c0x0000 (---------------)  + I agro
+	0x00253543, // n0x1a5a c0x0000 (---------------)  + I aid
+	0x000011c3, // n0x1a5b c0x0000 (---------------)  +   art
+	0x00200103, // n0x1a5c c0x0000 (---------------)  + I atm
+	0x0024a188, // n0x1a5d c0x0000 (---------------)  + I augustow
+	0x00265104, // n0x1a5e c0x0000 (---------------)  + I auto
+	0x0022404a, // n0x1a5f c0x0000 (---------------)  + I babia-gora
+	0x00207a06, // n0x1a60 c0x0000 (---------------)  + I bedzin
+	0x00397a07, // n0x1a61 c0x0000 (---------------)  + I beskidy
+	0x0021e20a, // n0x1a62 c0x0000 (---------------)  + I bialowieza
+	0x00275d09, // n0x1a63 c0x0000 (---------------)  + I bialystok
+	0x0039dd47, // n0x1a64 c0x0000 (---------------)  + I bielawa
+	0x003a604a, // n0x1a65 c0x0000 (---------------)  + I bieszczady
+	0x00330b83, // n0x1a66 c0x0000 (---------------)  + I biz
+	0x003782cb, // n0x1a67 c0x0000 (---------------)  + I boleslawiec
+	0x002ce249, // n0x1a68 c0x0000 (---------------)  + I bydgoszcz
+	0x00269605, // n0x1a69 c0x0000 (---------------)  + I bytom
+	0x002cc107, // n0x1a6a c0x0000 (---------------)  + I cieszyn
+	0x00000742, // n0x1a6b c0x0000 (---------------)  +   co
+	0x00233503, // n0x1a6c c0x0000 (---------------)  + I com
+	0x00229ec7, // n0x1a6d c0x0000 (---------------)  + I czeladz
+	0x003522c5, // n0x1a6e c0x0000 (---------------)  + I czest
+	0x002bb989, // n0x1a6f c0x0000 (---------------)  + I dlugoleka
+	0x0023a783, // n0x1a70 c0x0000 (---------------)  + I edu
+	0x00222c06, // n0x1a71 c0x0000 (---------------)  + I elblag
+	0x002baac3, // n0x1a72 c0x0000 (---------------)  + I elk
+	0x000cba03, // n0x1a73 c0x0000 (---------------)  +   gda
+	0x000fc286, // n0x1a74 c0x0000 (---------------)  +   gdansk
+	0x000ee0c6, // n0x1a75 c0x0000 (---------------)  +   gdynia
+	0x0000ce47, // n0x1a76 c0x0000 (---------------)  +   gliwice
+	0x00210886, // n0x1a77 c0x0000 (---------------)  + I glogow
+	0x00216405, // n0x1a78 c0x0000 (---------------)  + I gmina
+	0x00328747, // n0x1a79 c0x0000 (---------------)  + I gniezno
+	0x003350c7, // n0x1a7a c0x0000 (---------------)  + I gorlice
+	0x48a6cc83, // n0x1a7b c0x0122 (n0x1afe-n0x1b2d)  + I gov
+	0x0032ad07, // n0x1a7c c0x0000 (---------------)  + I grajewo
+	0x0035e383, // n0x1a7d c0x0000 (---------------)  + I gsm
+	0x003205c5, // n0x1a7e c0x0000 (---------------)  + I ilawa
+	0x003a1244, // n0x1a7f c0x0000 (---------------)  + I info
+	0x0036f508, // n0x1a80 c0x0000 (---------------)  + I jaworzno
+	0x002ad88c, // n0x1a81 c0x0000 (---------------)  + I jelenia-gora
+	0x002ac505, // n0x1a82 c0x0000 (---------------)  + I jgora
+	0x00345486, // n0x1a83 c0x0000 (---------------)  + I kalisz
+	0x00229d87, // n0x1a84 c0x0000 (---------------)  + I karpacz
+	0x0038e2c7, // n0x1a85 c0x0000 (---------------)  + I kartuzy
+	0x0020f847, // n0x1a86 c0x0000 (---------------)  + I kaszuby
+	0x00217ac8, // n0x1a87 c0x0000 (---------------)  + I katowice
+	0x002acd4f, // n0x1a88 c0x0000 (---------------)  + I kazimierz-dolny
+	0x00249345, // n0x1a89 c0x0000 (---------------)  + I kepno
+	0x00245c47, // n0x1a8a c0x0000 (---------------)  + I ketrzyn
+	0x0039c507, // n0x1a8b c0x0000 (---------------)  + I klodzko
+	0x002a4d8a, // n0x1a8c c0x0000 (---------------)  + I kobierzyce
+	0x0028c749, // n0x1a8d c0x0000 (---------------)  + I kolobrzeg
+	0x002c8d85, // n0x1a8e c0x0000 (---------------)  + I konin
+	0x002c970a, // n0x1a8f c0x0000 (---------------)  + I konskowola
+	0x000eac86, // n0x1a90 c0x0000 (---------------)  +   krakow
+	0x002bab45, // n0x1a91 c0x0000 (---------------)  + I kutno
+	0x00368bc4, // n0x1a92 c0x0000 (---------------)  + I lapy
+	0x00271a06, // n0x1a93 c0x0000 (---------------)  + I lebork
+	0x0037c607, // n0x1a94 c0x0000 (---------------)  + I legnica
+	0x00251647, // n0x1a95 c0x0000 (---------------)  + I lezajsk
+	0x002551c8, // n0x1a96 c0x0000 (---------------)  + I limanowa
+	0x00214305, // n0x1a97 c0x0000 (---------------)  + I lomza
+	0x003521c6, // n0x1a98 c0x0000 (---------------)  + I lowicz
+	0x00398d05, // n0x1a99 c0x0000 (---------------)  + I lubin
+	0x003a42c5, // n0x1a9a c0x0000 (---------------)  + I lukow
+	0x0021b5c4, // n0x1a9b c0x0000 (---------------)  + I mail
+	0x002f2587, // n0x1a9c c0x0000 (---------------)  + I malbork
+	0x0030764a, // n0x1a9d c0x0000 (---------------)  + I malopolska
+	0x0020b848, // n0x1a9e c0x0000 (---------------)  + I mazowsze
+	0x002ee9c6, // n0x1a9f c0x0000 (---------------)  + I mazury
+	0x00013ac3, // n0x1aa0 c0x0000 (---------------)  +   med
+	0x003025c5, // n0x1aa1 c0x0000 (---------------)  + I media
+	0x00232006, // n0x1aa2 c0x0000 (---------------)  + I miasta
+	0x003a5006, // n0x1aa3 c0x0000 (---------------)  + I mielec
+	0x00332046, // n0x1aa4 c0x0000 (---------------)  + I mielno
+	0x00209003, // n0x1aa5 c0x0000 (---------------)  + I mil
+	0x00380e47, // n0x1aa6 c0x0000 (---------------)  + I mragowo
+	0x0039c485, // n0x1aa7 c0x0000 (---------------)  + I naklo
+	0x0021fe03, // n0x1aa8 c0x0000 (---------------)  + I net
+	0x0039dfcd, // n0x1aa9 c0x0000 (---------------)  + I nieruchomosci
+	0x00201483, // n0x1aaa c0x0000 (---------------)  + I nom
+	0x002552c8, // n0x1aab c0x0000 (---------------)  + I nowaruda
+	0x002158c4, // n0x1aac c0x0000 (---------------)  + I nysa
+	0x00276d05, // n0x1aad c0x0000 (---------------)  + I olawa
+	0x002a4c86, // n0x1aae c0x0000 (---------------)  + I olecko
+	0x0023d406, // n0x1aaf c0x0000 (---------------)  + I olkusz
+	0x00219a47, // n0x1ab0 c0x0000 (---------------)  + I olsztyn
+	0x0023d707, // n0x1ab1 c0x0000 (---------------)  + I opoczno
+	0x00251585, // n0x1ab2 c0x0000 (---------------)  + I opole
+	0x0022d1c3, // n0x1ab3 c0x0000 (---------------)  + I org
+	0x00384947, // n0x1ab4 c0x0000 (---------------)  + I ostroda
+	0x002c7689, // n0x1ab5 c0x0000 (---------------)  + I ostroleka
+	0x0020ad49, // n0x1ab6 c0x0000 (---------------)  + I ostrowiec
+	0x0020d58a, // n0x1ab7 c0x0000 (---------------)  + I ostrowwlkp
+	0x00248182, // n0x1ab8 c0x0000 (---------------)  + I pc
+	0x00320584, // n0x1ab9 c0x0000 (---------------)  + I pila
+	0x002d7404, // n0x1aba c0x0000 (---------------)  + I pisz
+	0x00219e47, // n0x1abb c0x0000 (---------------)  + I podhale
+	0x00243388, // n0x1abc c0x0000 (---------------)  + I podlasie
+	0x002de7c9, // n0x1abd c0x0000 (---------------)  + I polkowice
+	0x00209609, // n0x1abe c0x0000 (---------------)  + I pomorskie
+	0x002df1c7, // n0x1abf c0x0000 (---------------)  + I pomorze
+	0x00248e46, // n0x1ac0 c0x0000 (---------------)  + I powiat
+	0x000e0986, // n0x1ac1 c0x0000 (---------------)  +   poznan
+	0x002e1c44, // n0x1ac2 c0x0000 (---------------)  + I priv
+	0x002e1dca, // n0x1ac3 c0x0000 (---------------)  + I prochowice
+	0x002e4548, // n0x1ac4 c0x0000 (---------------)  + I pruszkow
+	0x002e51c9, // n0x1ac5 c0x0000 (---------------)  + I przeworsk
+	0x00296686, // n0x1ac6 c0x0000 (---------------)  + I pulawy
+	0x00339e45, // n0x1ac7 c0x0000 (---------------)  + I radom
+	0x0020b708, // n0x1ac8 c0x0000 (---------------)  + I rawa-maz
+	0x002c238a, // n0x1ac9 c0x0000 (---------------)  + I realestate
+	0x00285b43, // n0x1aca c0x0000 (---------------)  + I rel
+	0x0033cf06, // n0x1acb c0x0000 (---------------)  + I rybnik
+	0x002df2c7, // n0x1acc c0x0000 (---------------)  + I rzeszow
+	0x0020f745, // n0x1acd c0x0000 (---------------)  + I sanok
+	0x002224c5, // n0x1ace c0x0000 (---------------)  + I sejny
+	0x00247603, // n0x1acf c0x0000 (---------------)  + I sex
+	0x00352004, // n0x1ad0 c0x0000 (---------------)  + I shop
+	0x00374ec5, // n0x1ad1 c0x0000 (---------------)  + I sklep
+	0x00284fc7, // n0x1ad2 c0x0000 (---------------)  + I skoczow
+	0x002e2b05, // n0x1ad3 c0x0000 (---------------)  + I slask
+	0x002d51c6, // n0x1ad4 c0x0000 (---------------)  + I slupsk
+	0x000f3985, // n0x1ad5 c0x0000 (---------------)  +   sopot
+	0x0021f483, // n0x1ad6 c0x0000 (---------------)  + I sos
+	0x002b5889, // n0x1ad7 c0x0000 (---------------)  + I sosnowiec
+	0x00276acc, // n0x1ad8 c0x0000 (---------------)  + I stalowa-wola
+	0x002a11cc, // n0x1ad9 c0x0000 (---------------)  + I starachowice
+	0x002c92c8, // n0x1ada c0x0000 (---------------)  + I stargard
+	0x0027b447, // n0x1adb c0x0000 (---------------)  + I suwalki
+	0x002f0a08, // n0x1adc c0x0000 (---------------)  + I swidnica
+	0x002f100a, // n0x1add c0x0000 (---------------)  + I swiebodzin
+	0x002f198b, // n0x1ade c0x0000 (---------------)  + I swinoujscie
+	0x002ce388, // n0x1adf c0x0000 (---------------)  + I szczecin
+	0x00345588, // n0x1ae0 c0x0000 (---------------)  + I szczytno
+	0x00293346, // n0x1ae1 c0x0000 (---------------)  + I szkola
+	0x00357a85, // n0x1ae2 c0x0000 (---------------)  + I targi
+	0x00249c0a, // n0x1ae3 c0x0000 (---------------)  + I tarnobrzeg
+	0x00220b05, // n0x1ae4 c0x0000 (---------------)  + I tgory
+	0x00200142, // n0x1ae5 c0x0000 (---------------)  + I tm
+	0x002c0507, // n0x1ae6 c0x0000 (---------------)  + I tourism
+	0x0029bec6, // n0x1ae7 c0x0000 (---------------)  + I travel
+	0x00352bc5, // n0x1ae8 c0x0000 (---------------)  + I turek
+	0x0037da09, // n0x1ae9 c0x0000 (---------------)  + I turystyka
+	0x0031fd85, // n0x1aea c0x0000 (---------------)  + I tychy
+	0x00291985, // n0x1aeb c0x0000 (---------------)  + I ustka
+	0x00320189, // n0x1aec c0x0000 (---------------)  + I walbrzych
+	0x00231e86, // n0x1aed c0x0000 (---------------)  + I warmia
+	0x0023ee48, // n0x1aee c0x0000 (---------------)  + I warszawa
+	0x0025a843, // n0x1aef c0x0000 (---------------)  + I waw
+	0x0020fcc6, // n0x1af0 c0x0000 (---------------)  + I wegrow
+	0x00275246, // n0x1af1 c0x0000 (---------------)  + I wielun
+	0x002fff45, // n0x1af2 c0x0000 (---------------)  + I wlocl
+	0x002fff49, // n0x1af3 c0x0000 (---------------)  + I wloclawek
+	0x002b0d09, // n0x1af4 c0x0000 (---------------)  + I wodzislaw
+	0x0024e547, // n0x1af5 c0x0000 (---------------)  + I wolomin
+	0x000ffdc4, // n0x1af6 c0x0000 (---------------)  +   wroc
+	0x002ffdc7, // n0x1af7 c0x0000 (---------------)  + I wroclaw
+	0x00209509, // n0x1af8 c0x0000 (---------------)  + I zachpomor
+	0x0021e405, // n0x1af9 c0x0000 (---------------)  + I zagan
+	0x00138408, // n0x1afa c0x0000 (---------------)  +   zakopane
+	0x0032f305, // n0x1afb c0x0000 (---------------)  + I zarow
+	0x0021fec5, // n0x1afc c0x0000 (---------------)  + I zgora
+	0x0022df89, // n0x1afd c0x0000 (---------------)  + I zgorzelec
+	0x00200d02, // n0x1afe c0x0000 (---------------)  + I ap
+	0x00351ac4, // n0x1aff c0x0000 (---------------)  + I griw
+	0x00206902, // n0x1b00 c0x0000 (---------------)  + I ic
+	0x002006c2, // n0x1b01 c0x0000 (---------------)  + I is
+	0x002717c5, // n0x1b02 c0x0000 (---------------)  + I kmpsp
+	0x002cc908, // n0x1b03 c0x0000 (---------------)  + I konsulat
+	0x00371a05, // n0x1b04 c0x0000 (---------------)  + I kppsp
+	0x002bd183, // n0x1b05 c0x0000 (---------------)  + I kwp
+	0x002bd185, // n0x1b06 c0x0000 (---------------)  + I kwpsp
+	0x002cc4c3, // n0x1b07 c0x0000 (---------------)  + I mup
+	0x0020fc82, // n0x1b08 c0x0000 (---------------)  + I mw
+	0x00268444, // n0x1b09 c0x0000 (---------------)  + I oirm
+	0x002e6d03, // n0x1b0a c0x0000 (---------------)  + I oum
+	0x0020ac42, // n0x1b0b c0x0000 (---------------)  + I pa
+	0x002dd7c4, // n0x1b0c c0x0000 (---------------)  + I pinb
+	0x002d8443, // n0x1b0d c0x0000 (---------------)  + I piw
+	0x00200942, // n0x1b0e c0x0000 (---------------)  + I po
+	0x00209343, // n0x1b0f c0x0000 (---------------)  + I psp
+	0x0028be44, // n0x1b10 c0x0000 (---------------)  + I psse
+	0x002b4bc3, // n0x1b11 c0x0000 (---------------)  + I pup
+	0x00242684, // n0x1b12 c0x0000 (---------------)  + I rzgw
+	0x002004c2, // n0x1b13 c0x0000 (---------------)  + I sa
+	0x00271443, // n0x1b14 c0x0000 (---------------)  + I sdn
+	0x00216343, // n0x1b15 c0x0000 (---------------)  + I sko
+	0x00205682, // n0x1b16 c0x0000 (---------------)  + I so
+	0x0033b802, // n0x1b17 c0x0000 (---------------)  + I sr
+	0x002b0b49, // n0x1b18 c0x0000 (---------------)  + I starostwo
+	0x00201cc2, // n0x1b19 c0x0000 (---------------)  + I ug
+	0x00288444, // n0x1b1a c0x0000 (---------------)  + I ugim
+	0x00204bc2, // n0x1b1b c0x0000 (---------------)  + I um
+	0x0020b584, // n0x1b1c c0x0000 (---------------)  + I umig
+	0x00248e04, // n0x1b1d c0x0000 (---------------)  + I upow
+	0x002e3944, // n0x1b1e c0x0000 (---------------)  + I uppo
+	0x00202382, // n0x1b1f c0x0000 (---------------)  + I us
+	0x00243e82, // n0x1b20 c0x0000 (---------------)  + I uw
+	0x00211343, // n0x1b21 c0x0000 (---------------)  + I uzs
+	0x002f1603, // n0x1b22 c0x0000 (---------------)  + I wif
+	0x00245244, // n0x1b23 c0x0000 (---------------)  + I wiih
+	0x0025d1c4, // n0x1b24 c0x0000 (---------------)  + I winb
+	0x002c7604, // n0x1b25 c0x0000 (---------------)  + I wios
+	0x002c9604, // n0x1b26 c0x0000 (---------------)  + I witd
+	0x002ff443, // n0x1b27 c0x0000 (---------------)  + I wiw
+	0x002f65c3, // n0x1b28 c0x0000 (---------------)  + I wsa
+	0x002eac04, // n0x1b29 c0x0000 (---------------)  + I wskr
+	0x003009c4, // n0x1b2a c0x0000 (---------------)  + I wuoz
+	0x00300cc6, // n0x1b2b c0x0000 (---------------)  + I wzmiuw
+	0x00264682, // n0x1b2c c0x0000 (---------------)  + I zp
+	0x00200742, // n0x1b2d c0x0000 (---------------)  + I co
+	0x0023a783, // n0x1b2e c0x0000 (---------------)  + I edu
+	0x0026cc83, // n0x1b2f c0x0000 (---------------)  + I gov
+	0x0021fe03, // n0x1b30 c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x1b31 c0x0000 (---------------)  + I org
+	0x00201542, // n0x1b32 c0x0000 (---------------)  + I ac
+	0x00330b83, // n0x1b33 c0x0000 (---------------)  + I biz
+	0x00233503, // n0x1b34 c0x0000 (---------------)  + I com
+	0x0023a783, // n0x1b35 c0x0000 (---------------)  + I edu
+	0x00202703, // n0x1b36 c0x0000 (---------------)  + I est
+	0x0026cc83, // n0x1b37 c0x0000 (---------------)  + I gov
+	0x003a1244, // n0x1b38 c0x0000 (---------------)  + I info
+	0x002b0e04, // n0x1b39 c0x0000 (---------------)  + I isla
+	0x00205284, // n0x1b3a c0x0000 (---------------)  + I name
+	0x0021fe03, // n0x1b3b c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x1b3c c0x0000 (---------------)  + I org
+	0x00220e43, // n0x1b3d c0x0000 (---------------)  + I pro
+	0x002e2484, // n0x1b3e c0x0000 (---------------)  + I prof
+	0x00355603, // n0x1b3f c0x0000 (---------------)  + I aaa
+	0x002b3e43, // n0x1b40 c0x0000 (---------------)  + I aca
+	0x0033f204, // n0x1b41 c0x0000 (---------------)  + I acct
+	0x0032f106, // n0x1b42 c0x0000 (---------------)  + I avocat
+	0x00202003, // n0x1b43 c0x0000 (---------------)  + I bar
+	0x00216d43, // n0x1b44 c0x0000 (---------------)  + I cpa
+	0x00213703, // n0x1b45 c0x0000 (---------------)  + I eng
+	0x002af443, // n0x1b46 c0x0000 (---------------)  + I jur
+	0x00274483, // n0x1b47 c0x0000 (---------------)  + I law
+	0x00213ac3, // n0x1b48 c0x0000 (---------------)  + I med
+	0x0022a5c5, // n0x1b49 c0x0000 (---------------)  + I recht
+	0x00233503, // n0x1b4a c0x0000 (---------------)  + I com
+	0x0023a783, // n0x1b4b c0x0000 (---------------)  + I edu
+	0x0026cc83, // n0x1b4c c0x0000 (---------------)  + I gov
+	0x0021fe03, // n0x1b4d c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x1b4e c0x0000 (---------------)  + I org
+	0x002db8c3, // n0x1b4f c0x0000 (---------------)  + I plo
+	0x00235d43, // n0x1b50 c0x0000 (---------------)  + I sec
+	0x000ffa08, // n0x1b51 c0x0000 (---------------)  +   blogspot
+	0x00233503, // n0x1b52 c0x0000 (---------------)  + I com
+	0x0023a783, // n0x1b53 c0x0000 (---------------)  + I edu
+	0x0026cc83, // n0x1b54 c0x0000 (---------------)  + I gov
+	0x00201603, // n0x1b55 c0x0000 (---------------)  + I int
+	0x0021fe03, // n0x1b56 c0x0000 (---------------)  + I net
+	0x00242044, // n0x1b57 c0x0000 (---------------)  + I nome
+	0x0022d1c3, // n0x1b58 c0x0000 (---------------)  + I org
+	0x0029f744, // n0x1b59 c0x0000 (---------------)  + I publ
+	0x002b7cc5, // n0x1b5a c0x0000 (---------------)  + I belau
+	0x00200742, // n0x1b5b c0x0000 (---------------)  + I co
+	0x00202602, // n0x1b5c c0x0000 (---------------)  + I ed
+	0x00202d42, // n0x1b5d c0x0000 (---------------)  + I go
+	0x00202c02, // n0x1b5e c0x0000 (---------------)  + I ne
+	0x00200282, // n0x1b5f c0x0000 (---------------)  + I or
+	0x00233503, // n0x1b60 c0x0000 (---------------)  + I com
+	0x0023d684, // n0x1b61 c0x0000 (---------------)  + I coop
+	0x0023a783, // n0x1b62 c0x0000 (---------------)  + I edu
+	0x0026cc83, // n0x1b63 c0x0000 (---------------)  + I gov
+	0x00209003, // n0x1b64 c0x0000 (---------------)  + I mil
+	0x0021fe03, // n0x1b65 c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x1b66 c0x0000 (---------------)  + I org
+	0x000ffa08, // n0x1b67 c0x0000 (---------------)  +   blogspot
+	0x00233503, // n0x1b68 c0x0000 (---------------)  + I com
+	0x0023a783, // n0x1b69 c0x0000 (---------------)  + I edu
+	0x0026cc83, // n0x1b6a c0x0000 (---------------)  + I gov
+	0x00209003, // n0x1b6b c0x0000 (---------------)  + I mil
+	0x00205284, // n0x1b6c c0x0000 (---------------)  + I name
+	0x0021fe03, // n0x1b6d c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x1b6e c0x0000 (---------------)  + I org
+	0x00217443, // n0x1b6f c0x0000 (---------------)  + I sch
+	0x002d4884, // n0x1b70 c0x0000 (---------------)  + I asso
+	0x000ffa08, // n0x1b71 c0x0000 (---------------)  +   blogspot
+	0x00233503, // n0x1b72 c0x0000 (---------------)  + I com
+	0x00201483, // n0x1b73 c0x0000 (---------------)  + I nom
+	0x0024bf84, // n0x1b74 c0x0000 (---------------)  + I arts
+	0x000ffa08, // n0x1b75 c0x0000 (---------------)  +   blogspot
+	0x00233503, // n0x1b76 c0x0000 (---------------)  + I com
+	0x0024d9c4, // n0x1b77 c0x0000 (---------------)  + I firm
+	0x003a1244, // n0x1b78 c0x0000 (---------------)  + I info
+	0x00201483, // n0x1b79 c0x0000 (---------------)  + I nom
+	0x002009c2, // n0x1b7a c0x0000 (---------------)  + I nt
+	0x0022d1c3, // n0x1b7b c0x0000 (---------------)  + I org
+	0x0022a5c3, // n0x1b7c c0x0000 (---------------)  + I rec
+	0x00391185, // n0x1b7d c0x0000 (---------------)  + I store
+	0x00200142, // n0x1b7e c0x0000 (---------------)  + I tm
+	0x00300b03, // n0x1b7f c0x0000 (---------------)  + I www
+	0x00201542, // n0x1b80 c0x0000 (---------------)  + I ac
+	0x000ffa08, // n0x1b81 c0x0000 (---------------)  +   blogspot
+	0x00200742, // n0x1b82 c0x0000 (---------------)  + I co
+	0x0023a783, // n0x1b83 c0x0000 (---------------)  + I edu
+	0x0026cc83, // n0x1b84 c0x0000 (---------------)  + I gov
+	0x002013c2, // n0x1b85 c0x0000 (---------------)  + I in
+	0x0022d1c3, // n0x1b86 c0x0000 (---------------)  + I org
+	0x00201542, // n0x1b87 c0x0000 (---------------)  + I ac
+	0x003a6207, // n0x1b88 c0x0000 (---------------)  + I adygeya
+	0x00289d85, // n0x1b89 c0x0000 (---------------)  + I altai
+	0x002937c4, // n0x1b8a c0x0000 (---------------)  + I amur
+	0x002e75c6, // n0x1b8b c0x0000 (---------------)  + I amursk
+	0x0023668b, // n0x1b8c c0x0000 (---------------)  + I arkhangelsk
+	0x0025a5c9, // n0x1b8d c0x0000 (---------------)  + I astrakhan
+	0x003453c6, // n0x1b8e c0x0000 (---------------)  + I baikal
+	0x003269c9, // n0x1b8f c0x0000 (---------------)  + I bashkiria
+	0x002d2e48, // n0x1b90 c0x0000 (---------------)  + I belgorod
+	0x002042c3, // n0x1b91 c0x0000 (---------------)  + I bir
+	0x000ffa08, // n0x1b92 c0x0000 (---------------)  +   blogspot
+	0x00227447, // n0x1b93 c0x0000 (---------------)  + I bryansk
+	0x0034d388, // n0x1b94 c0x0000 (---------------)  + I buryatia
+	0x002ee443, // n0x1b95 c0x0000 (---------------)  + I cbg
+	0x002648c4, // n0x1b96 c0x0000 (---------------)  + I chel
+	0x0026670b, // n0x1b97 c0x0000 (---------------)  + I chelyabinsk
+	0x002ac6c5, // n0x1b98 c0x0000 (---------------)  + I chita
+	0x002bc248, // n0x1b99 c0x0000 (---------------)  + I chukotka
+	0x00335889, // n0x1b9a c0x0000 (---------------)  + I chuvashia
+	0x0025d143, // n0x1b9b c0x0000 (---------------)  + I cmw
+	0x00233503, // n0x1b9c c0x0000 (---------------)  + I com
+	0x00202648, // n0x1b9d c0x0000 (---------------)  + I dagestan
+	0x002ef847, // n0x1b9e c0x0000 (---------------)  + I dudinka
+	0x002eccc6, // n0x1b9f c0x0000 (---------------)  + I e-burg
+	0x0023a783, // n0x1ba0 c0x0000 (---------------)  + I edu
+	0x003869c7, // n0x1ba1 c0x0000 (---------------)  + I fareast
+	0x0026cc83, // n0x1ba2 c0x0000 (---------------)  + I gov
+	0x00312746, // n0x1ba3 c0x0000 (---------------)  + I grozny
+	0x00201603, // n0x1ba4 c0x0000 (---------------)  + I int
+	0x00230d87, // n0x1ba5 c0x0000 (---------------)  + I irkutsk
+	0x0027d407, // n0x1ba6 c0x0000 (---------------)  + I ivanovo
+	0x003879c7, // n0x1ba7 c0x0000 (---------------)  + I izhevsk
+	0x002f2505, // n0x1ba8 c0x0000 (---------------)  + I jamal
+	0x00206543, // n0x1ba9 c0x0000 (---------------)  + I jar
+	0x0020a7cb, // n0x1baa c0x0000 (---------------)  + I joshkar-ola
+	0x00309908, // n0x1bab c0x0000 (---------------)  + I k-uralsk
+	0x00226e48, // n0x1bac c0x0000 (---------------)  + I kalmykia
+	0x002509c6, // n0x1bad c0x0000 (---------------)  + I kaluga
+	0x0022ab89, // n0x1bae c0x0000 (---------------)  + I kamchatka
+	0x00327ec7, // n0x1baf c0x0000 (---------------)  + I karelia
+	0x002f9b85, // n0x1bb0 c0x0000 (---------------)  + I kazan
+	0x00379b44, // n0x1bb1 c0x0000 (---------------)  + I kchr
+	0x00275f48, // n0x1bb2 c0x0000 (---------------)  + I kemerovo
+	0x0023f40a, // n0x1bb3 c0x0000 (---------------)  + I khabarovsk
+	0x0023f649, // n0x1bb4 c0x0000 (---------------)  + I khakassia
+	0x002517c3, // n0x1bb5 c0x0000 (---------------)  + I khv
+	0x0027ea45, // n0x1bb6 c0x0000 (---------------)  + I kirov
+	0x0033bcc3, // n0x1bb7 c0x0000 (---------------)  + I kms
+	0x002ab0c6, // n0x1bb8 c0x0000 (---------------)  + I koenig
+	0x0039a004, // n0x1bb9 c0x0000 (---------------)  + I komi
+	0x002fc3c8, // n0x1bba c0x0000 (---------------)  + I kostroma
+	0x00387b4b, // n0x1bbb c0x0000 (---------------)  + I krasnoyarsk
+	0x0033bb85, // n0x1bbc c0x0000 (---------------)  + I kuban
+	0x002b7a46, // n0x1bbd c0x0000 (---------------)  + I kurgan
+	0x002b9785, // n0x1bbe c0x0000 (---------------)  + I kursk
+	0x002b9cc8, // n0x1bbf c0x0000 (---------------)  + I kustanai
+	0x002bac87, // n0x1bc0 c0x0000 (---------------)  + I kuzbass
+	0x00207707, // n0x1bc1 c0x0000 (---------------)  + I lipetsk
+	0x00223c47, // n0x1bc2 c0x0000 (---------------)  + I magadan
+	0x0021e6c4, // n0x1bc3 c0x0000 (---------------)  + I mari
+	0x0021e6c7, // n0x1bc4 c0x0000 (---------------)  + I mari-el
+	0x0027bc46, // n0x1bc5 c0x0000 (---------------)  + I marine
+	0x00209003, // n0x1bc6 c0x0000 (---------------)  + I mil
+	0x002c55c8, // n0x1bc7 c0x0000 (---------------)  + I mordovia
+	0x00253243, // n0x1bc8 c0x0000 (---------------)  + I msk
+	0x002ccc88, // n0x1bc9 c0x0000 (---------------)  + I murmansk
+	0x002d2485, // n0x1bca c0x0000 (---------------)  + I mytis
+	0x0031a348, // n0x1bcb c0x0000 (---------------)  + I nakhodka
+	0x0023a987, // n0x1bcc c0x0000 (---------------)  + I nalchik
+	0x0021fe03, // n0x1bcd c0x0000 (---------------)  + I net
+	0x00392a03, // n0x1bce c0x0000 (---------------)  + I nkz
+	0x00289404, // n0x1bcf c0x0000 (---------------)  + I nnov
+	0x00374d87, // n0x1bd0 c0x0000 (---------------)  + I norilsk
+	0x002058c3, // n0x1bd1 c0x0000 (---------------)  + I nov
+	0x0027d4cb, // n0x1bd2 c0x0000 (---------------)  + I novosibirsk
+	0x00216303, // n0x1bd3 c0x0000 (---------------)  + I nsk
+	0x00253204, // n0x1bd4 c0x0000 (---------------)  + I omsk
+	0x00391208, // n0x1bd5 c0x0000 (---------------)  + I orenburg
+	0x0022d1c3, // n0x1bd6 c0x0000 (---------------)  + I org
+	0x002d6e85, // n0x1bd7 c0x0000 (---------------)  + I oryol
+	0x00296c85, // n0x1bd8 c0x0000 (---------------)  + I oskol
+	0x0039c386, // n0x1bd9 c0x0000 (---------------)  + I palana
+	0x00212c85, // n0x1bda c0x0000 (---------------)  + I penza
+	0x002d2844, // n0x1bdb c0x0000 (---------------)  + I perm
+	0x00209302, // n0x1bdc c0x0000 (---------------)  + I pp
+	0x002e5483, // n0x1bdd c0x0000 (---------------)  + I ptz
+	0x00368c4a, // n0x1bde c0x0000 (---------------)  + I pyatigorsk
+	0x003907c3, // n0x1bdf c0x0000 (---------------)  + I rnd
+	0x002d1989, // n0x1be0 c0x0000 (---------------)  + I rubtsovsk
+	0x00357446, // n0x1be1 c0x0000 (---------------)  + I ryazan
+	0x0021ac48, // n0x1be2 c0x0000 (---------------)  + I sakhalin
+	0x0028b986, // n0x1be3 c0x0000 (---------------)  + I samara
+	0x002257c7, // n0x1be4 c0x0000 (---------------)  + I saratov
+	0x002cc748, // n0x1be5 c0x0000 (---------------)  + I simbirsk
+	0x002d6648, // n0x1be6 c0x0000 (---------------)  + I smolensk
+	0x002e0f83, // n0x1be7 c0x0000 (---------------)  + I snz
+	0x00271883, // n0x1be8 c0x0000 (---------------)  + I spb
+	0x00225b89, // n0x1be9 c0x0000 (---------------)  + I stavropol
+	0x002f4c43, // n0x1bea c0x0000 (---------------)  + I stv
+	0x00341846, // n0x1beb c0x0000 (---------------)  + I surgut
+	0x00289a06, // n0x1bec c0x0000 (---------------)  + I syzran
+	0x00314f06, // n0x1bed c0x0000 (---------------)  + I tambov
+	0x0036cc49, // n0x1bee c0x0000 (---------------)  + I tatarstan
+	0x002ff844, // n0x1bef c0x0000 (---------------)  + I test
+	0x0020bf43, // n0x1bf0 c0x0000 (---------------)  + I tom
+	0x00309805, // n0x1bf1 c0x0000 (---------------)  + I tomsk
+	0x0030b209, // n0x1bf2 c0x0000 (---------------)  + I tsaritsyn
+	0x00207803, // n0x1bf3 c0x0000 (---------------)  + I tsk
+	0x00359bc4, // n0x1bf4 c0x0000 (---------------)  + I tula
+	0x002f3304, // n0x1bf5 c0x0000 (---------------)  + I tuva
+	0x00360784, // n0x1bf6 c0x0000 (---------------)  + I tver
+	0x0031ac06, // n0x1bf7 c0x0000 (---------------)  + I tyumen
+	0x0020fa43, // n0x1bf8 c0x0000 (---------------)  + I udm
+	0x0020fa48, // n0x1bf9 c0x0000 (---------------)  + I udmurtia
+	0x0025a208, // n0x1bfa c0x0000 (---------------)  + I ulan-ude
+	0x0035ca86, // n0x1bfb c0x0000 (---------------)  + I vdonsk
+	0x002f998b, // n0x1bfc c0x0000 (---------------)  + I vladikavkaz
+	0x002f9cc8, // n0x1bfd c0x0000 (---------------)  + I vladimir
+	0x002f9ecb, // n0x1bfe c0x0000 (---------------)  + I vladivostok
+	0x002fca09, // n0x1bff c0x0000 (---------------)  + I volgograd
+	0x002fc187, // n0x1c00 c0x0000 (---------------)  + I vologda
+	0x002fce88, // n0x1c01 c0x0000 (---------------)  + I voronezh
+	0x002fee83, // n0x1c02 c0x0000 (---------------)  + I vrn
+	0x0039fc06, // n0x1c03 c0x0000 (---------------)  + I vyatka
+	0x0020f507, // n0x1c04 c0x0000 (---------------)  + I yakutia
+	0x00298b45, // n0x1c05 c0x0000 (---------------)  + I yamal
+	0x00346f49, // n0x1c06 c0x0000 (---------------)  + I yaroslavl
+	0x0030fd4d, // n0x1c07 c0x0000 (---------------)  + I yekaterinburg
+	0x0021aa91, // n0x1c08 c0x0000 (---------------)  + I yuzhno-sakhalinsk
+	0x0023d545, // n0x1c09 c0x0000 (---------------)  + I zgrad
+	0x00201542, // n0x1c0a c0x0000 (---------------)  + I ac
+	0x00200742, // n0x1c0b c0x0000 (---------------)  + I co
+	0x00233503, // n0x1c0c c0x0000 (---------------)  + I com
+	0x0023a783, // n0x1c0d c0x0000 (---------------)  + I edu
+	0x0033d7c4, // n0x1c0e c0x0000 (---------------)  + I gouv
+	0x0026cc83, // n0x1c0f c0x0000 (---------------)  + I gov
+	0x00201603, // n0x1c10 c0x0000 (---------------)  + I int
+	0x00209003, // n0x1c11 c0x0000 (---------------)  + I mil
+	0x0021fe03, // n0x1c12 c0x0000 (---------------)  + I net
+	0x00233503, // n0x1c13 c0x0000 (---------------)  + I com
+	0x0023a783, // n0x1c14 c0x0000 (---------------)  + I edu
+	0x0026cc83, // n0x1c15 c0x0000 (---------------)  + I gov
+	0x00213ac3, // n0x1c16 c0x0000 (---------------)  + I med
+	0x0021fe03, // n0x1c17 c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x1c18 c0x0000 (---------------)  + I org
+	0x00297403, // n0x1c19 c0x0000 (---------------)  + I pub
+	0x00217443, // n0x1c1a c0x0000 (---------------)  + I sch
+	0x00233503, // n0x1c1b c0x0000 (---------------)  + I com
+	0x0023a783, // n0x1c1c c0x0000 (---------------)  + I edu
+	0x0026cc83, // n0x1c1d c0x0000 (---------------)  + I gov
+	0x0021fe03, // n0x1c1e c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x1c1f c0x0000 (---------------)  + I org
+	0x00233503, // n0x1c20 c0x0000 (---------------)  + I com
+	0x0023a783, // n0x1c21 c0x0000 (---------------)  + I edu
+	0x0026cc83, // n0x1c22 c0x0000 (---------------)  + I gov
+	0x0021fe03, // n0x1c23 c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x1c24 c0x0000 (---------------)  + I org
+	0x00233503, // n0x1c25 c0x0000 (---------------)  + I com
+	0x0023a783, // n0x1c26 c0x0000 (---------------)  + I edu
+	0x0026cc83, // n0x1c27 c0x0000 (---------------)  + I gov
+	0x003a1244, // n0x1c28 c0x0000 (---------------)  + I info
+	0x00213ac3, // n0x1c29 c0x0000 (---------------)  + I med
+	0x0021fe03, // n0x1c2a c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x1c2b c0x0000 (---------------)  + I org
+	0x00224e42, // n0x1c2c c0x0000 (---------------)  + I tv
+	0x00200101, // n0x1c2d c0x0000 (---------------)  + I a
+	0x00201542, // n0x1c2e c0x0000 (---------------)  + I ac
+	0x00200001, // n0x1c2f c0x0000 (---------------)  + I b
+	0x003129c2, // n0x1c30 c0x0000 (---------------)  + I bd
+	0x000ffa08, // n0x1c31 c0x0000 (---------------)  +   blogspot
+	0x0021ca45, // n0x1c32 c0x0000 (---------------)  + I brand
+	0x00200301, // n0x1c33 c0x0000 (---------------)  + I c
+	0x00033503, // n0x1c34 c0x0000 (---------------)  +   com
+	0x00200381, // n0x1c35 c0x0000 (---------------)  + I d
+	0x00200081, // n0x1c36 c0x0000 (---------------)  + I e
+	0x00200581, // n0x1c37 c0x0000 (---------------)  + I f
+	0x0023f342, // n0x1c38 c0x0000 (---------------)  + I fh
+	0x0023f344, // n0x1c39 c0x0000 (---------------)  + I fhsk
+	0x00363543, // n0x1c3a c0x0000 (---------------)  + I fhv
+	0x00200c81, // n0x1c3b c0x0000 (---------------)  + I g
+	0x00200d81, // n0x1c3c c0x0000 (---------------)  + I h
+	0x00200041, // n0x1c3d c0x0000 (---------------)  + I i
+	0x00200fc1, // n0x1c3e c0x0000 (---------------)  + I k
+	0x002e9647, // n0x1c3f c0x0000 (---------------)  + I komforb
+	0x002d69cf, // n0x1c40 c0x0000 (---------------)  + I kommunalforbund
+	0x002da946, // n0x1c41 c0x0000 (---------------)  + I komvux
+	0x00200201, // n0x1c42 c0x0000 (---------------)  + I l
+	0x0026a306, // n0x1c43 c0x0000 (---------------)  + I lanbib
+	0x00200181, // n0x1c44 c0x0000 (---------------)  + I m
+	0x00200541, // n0x1c45 c0x0000 (---------------)  + I n
+	0x00325ace, // n0x1c46 c0x0000 (---------------)  + I naturbruksgymn
+	0x00200281, // n0x1c47 c0x0000 (---------------)  + I o
+	0x0022d1c3, // n0x1c48 c0x0000 (---------------)  + I org
+	0x00200941, // n0x1c49 c0x0000 (---------------)  + I p
+	0x002a3745, // n0x1c4a c0x0000 (---------------)  + I parti
+	0x00209302, // n0x1c4b c0x0000 (---------------)  + I pp
+	0x00247505, // n0x1c4c c0x0000 (---------------)  + I press
+	0x002002c1, // n0x1c4d c0x0000 (---------------)  + I r
+	0x002004c1, // n0x1c4e c0x0000 (---------------)  + I s
+	0x00200141, // n0x1c4f c0x0000 (---------------)  + I t
+	0x00200142, // n0x1c50 c0x0000 (---------------)  + I tm
+	0x00200441, // n0x1c51 c0x0000 (---------------)  + I u
+	0x002010c1, // n0x1c52 c0x0000 (---------------)  + I w
+	0x00205381, // n0x1c53 c0x0000 (---------------)  + I x
+	0x00201841, // n0x1c54 c0x0000 (---------------)  + I y
+	0x00205f81, // n0x1c55 c0x0000 (---------------)  + I z
+	0x000ffa08, // n0x1c56 c0x0000 (---------------)  +   blogspot
+	0x00233503, // n0x1c57 c0x0000 (---------------)  + I com
+	0x0023a783, // n0x1c58 c0x0000 (---------------)  + I edu
+	0x0026cc83, // n0x1c59 c0x0000 (---------------)  + I gov
+	0x0021fe03, // n0x1c5a c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x1c5b c0x0000 (---------------)  + I org
+	0x00220f03, // n0x1c5c c0x0000 (---------------)  + I per
+	0x00233503, // n0x1c5d c0x0000 (---------------)  + I com
+	0x0026cc83, // n0x1c5e c0x0000 (---------------)  + I gov
+	0x0008c288, // n0x1c5f c0x0000 (---------------)  +   hashbang
+	0x00209003, // n0x1c60 c0x0000 (---------------)  + I mil
+	0x0021fe03, // n0x1c61 c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x1c62 c0x0000 (---------------)  + I org
+	0x014da508, // n0x1c63 c0x0005 (---------------)* o   platform
+	0x000ffa08, // n0x1c64 c0x0000 (---------------)  +   blogspot
+	0x000ffa08, // n0x1c65 c0x0000 (---------------)  +   blogspot
+	0x00233503, // n0x1c66 c0x0000 (---------------)  + I com
+	0x0023a783, // n0x1c67 c0x0000 (---------------)  + I edu
+	0x0026cc83, // n0x1c68 c0x0000 (---------------)  + I gov
+	0x0021fe03, // n0x1c69 c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x1c6a c0x0000 (---------------)  + I org
+	0x002011c3, // n0x1c6b c0x0000 (---------------)  + I art
+	0x000ffa08, // n0x1c6c c0x0000 (---------------)  +   blogspot
+	0x00233503, // n0x1c6d c0x0000 (---------------)  + I com
+	0x0023a783, // n0x1c6e c0x0000 (---------------)  + I edu
+	0x0033d7c4, // n0x1c6f c0x0000 (---------------)  + I gouv
+	0x0022d1c3, // n0x1c70 c0x0000 (---------------)  + I org
+	0x00295005, // n0x1c71 c0x0000 (---------------)  + I perso
+	0x00320a04, // n0x1c72 c0x0000 (---------------)  + I univ
+	0x00233503, // n0x1c73 c0x0000 (---------------)  + I com
+	0x0021fe03, // n0x1c74 c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x1c75 c0x0000 (---------------)  + I org
+	0x00200742, // n0x1c76 c0x0000 (---------------)  + I co
+	0x00233503, // n0x1c77 c0x0000 (---------------)  + I com
+	0x00237249, // n0x1c78 c0x0000 (---------------)  + I consulado
+	0x0023a783, // n0x1c79 c0x0000 (---------------)  + I edu
+	0x00242d89, // n0x1c7a c0x0000 (---------------)  + I embaixada
+	0x0026cc83, // n0x1c7b c0x0000 (---------------)  + I gov
+	0x00209003, // n0x1c7c c0x0000 (---------------)  + I mil
+	0x0021fe03, // n0x1c7d c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x1c7e c0x0000 (---------------)  + I org
+	0x002e1a48, // n0x1c7f c0x0000 (---------------)  + I principe
+	0x00215f87, // n0x1c80 c0x0000 (---------------)  + I saotome
+	0x00391185, // n0x1c81 c0x0000 (---------------)  + I store
+	0x003a6207, // n0x1c82 c0x0000 (---------------)  + I adygeya
+	0x0023668b, // n0x1c83 c0x0000 (---------------)  + I arkhangelsk
+	0x0020d908, // n0x1c84 c0x0000 (---------------)  + I balashov
+	0x003269c9, // n0x1c85 c0x0000 (---------------)  + I bashkiria
+	0x00227447, // n0x1c86 c0x0000 (---------------)  + I bryansk
+	0x00202648, // n0x1c87 c0x0000 (---------------)  + I dagestan
+	0x00312746, // n0x1c88 c0x0000 (---------------)  + I grozny
+	0x0027d407, // n0x1c89 c0x0000 (---------------)  + I ivanovo
+	0x00226e48, // n0x1c8a c0x0000 (---------------)  + I kalmykia
+	0x002509c6, // n0x1c8b c0x0000 (---------------)  + I kaluga
+	0x00327ec7, // n0x1c8c c0x0000 (---------------)  + I karelia
+	0x0023f649, // n0x1c8d c0x0000 (---------------)  + I khakassia
+	0x0037f849, // n0x1c8e c0x0000 (---------------)  + I krasnodar
+	0x002b7a46, // n0x1c8f c0x0000 (---------------)  + I kurgan
+	0x002b8945, // n0x1c90 c0x0000 (---------------)  + I lenug
+	0x002c55c8, // n0x1c91 c0x0000 (---------------)  + I mordovia
+	0x00253243, // n0x1c92 c0x0000 (---------------)  + I msk
+	0x002ccc88, // n0x1c93 c0x0000 (---------------)  + I murmansk
+	0x0023a987, // n0x1c94 c0x0000 (---------------)  + I nalchik
+	0x002058c3, // n0x1c95 c0x0000 (---------------)  + I nov
+	0x00229c07, // n0x1c96 c0x0000 (---------------)  + I obninsk
+	0x00212c85, // n0x1c97 c0x0000 (---------------)  + I penza
+	0x002dd148, // n0x1c98 c0x0000 (---------------)  + I pokrovsk
+	0x00274805, // n0x1c99 c0x0000 (---------------)  + I sochi
+	0x00271883, // n0x1c9a c0x0000 (---------------)  + I spb
+	0x0033d1c9, // n0x1c9b c0x0000 (---------------)  + I togliatti
+	0x002aa587, // n0x1c9c c0x0000 (---------------)  + I troitsk
+	0x00359bc4, // n0x1c9d c0x0000 (---------------)  + I tula
+	0x002f3304, // n0x1c9e c0x0000 (---------------)  + I tuva
+	0x002f998b, // n0x1c9f c0x0000 (---------------)  + I vladikavkaz
+	0x002f9cc8, // n0x1ca0 c0x0000 (---------------)  + I vladimir
+	0x002fc187, // n0x1ca1 c0x0000 (---------------)  + I vologda
+	0x00233503, // n0x1ca2 c0x0000 (---------------)  + I com
+	0x0023a783, // n0x1ca3 c0x0000 (---------------)  + I edu
+	0x00213183, // n0x1ca4 c0x0000 (---------------)  + I gob
+	0x0022d1c3, // n0x1ca5 c0x0000 (---------------)  + I org
+	0x00244803, // n0x1ca6 c0x0000 (---------------)  + I red
+	0x0026cc83, // n0x1ca7 c0x0000 (---------------)  + I gov
+	0x00233503, // n0x1ca8 c0x0000 (---------------)  + I com
+	0x0023a783, // n0x1ca9 c0x0000 (---------------)  + I edu
+	0x0026cc83, // n0x1caa c0x0000 (---------------)  + I gov
+	0x00209003, // n0x1cab c0x0000 (---------------)  + I mil
+	0x0021fe03, // n0x1cac c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x1cad c0x0000 (---------------)  + I org
+	0x00201542, // n0x1cae c0x0000 (---------------)  + I ac
+	0x00200742, // n0x1caf c0x0000 (---------------)  + I co
+	0x0022d1c3, // n0x1cb0 c0x0000 (---------------)  + I org
+	0x000ffa08, // n0x1cb1 c0x0000 (---------------)  +   blogspot
+	0x00201542, // n0x1cb2 c0x0000 (---------------)  + I ac
+	0x00200742, // n0x1cb3 c0x0000 (---------------)  + I co
+	0x00202d42, // n0x1cb4 c0x0000 (---------------)  + I go
+	0x002013c2, // n0x1cb5 c0x0000 (---------------)  + I in
+	0x00209002, // n0x1cb6 c0x0000 (---------------)  + I mi
+	0x0021fe03, // n0x1cb7 c0x0000 (---------------)  + I net
+	0x00200282, // n0x1cb8 c0x0000 (---------------)  + I or
+	0x00201542, // n0x1cb9 c0x0000 (---------------)  + I ac
+	0x00330b83, // n0x1cba c0x0000 (---------------)  + I biz
+	0x00200742, // n0x1cbb c0x0000 (---------------)  + I co
+	0x00233503, // n0x1cbc c0x0000 (---------------)  + I com
+	0x0023a783, // n0x1cbd c0x0000 (---------------)  + I edu
+	0x00202d42, // n0x1cbe c0x0000 (---------------)  + I go
+	0x0026cc83, // n0x1cbf c0x0000 (---------------)  + I gov
+	0x00201603, // n0x1cc0 c0x0000 (---------------)  + I int
+	0x00209003, // n0x1cc1 c0x0000 (---------------)  + I mil
+	0x00205284, // n0x1cc2 c0x0000 (---------------)  + I name
+	0x0021fe03, // n0x1cc3 c0x0000 (---------------)  + I net
+	0x00218f83, // n0x1cc4 c0x0000 (---------------)  + I nic
+	0x0022d1c3, // n0x1cc5 c0x0000 (---------------)  + I org
+	0x002ff844, // n0x1cc6 c0x0000 (---------------)  + I test
+	0x00221a03, // n0x1cc7 c0x0000 (---------------)  + I web
+	0x0026cc83, // n0x1cc8 c0x0000 (---------------)  + I gov
+	0x00200742, // n0x1cc9 c0x0000 (---------------)  + I co
+	0x00233503, // n0x1cca c0x0000 (---------------)  + I com
+	0x0023a783, // n0x1ccb c0x0000 (---------------)  + I edu
+	0x0026cc83, // n0x1ccc c0x0000 (---------------)  + I gov
+	0x00209003, // n0x1ccd c0x0000 (---------------)  + I mil
+	0x0021fe03, // n0x1cce c0x0000 (---------------)  + I net
+	0x00201483, // n0x1ccf c0x0000 (---------------)  + I nom
+	0x0022d1c3, // n0x1cd0 c0x0000 (---------------)  + I org
+	0x003927c7, // n0x1cd1 c0x0000 (---------------)  + I agrinet
+	0x00233503, // n0x1cd2 c0x0000 (---------------)  + I com
+	0x00222387, // n0x1cd3 c0x0000 (---------------)  + I defense
+	0x0025d886, // n0x1cd4 c0x0000 (---------------)  + I edunet
+	0x00215243, // n0x1cd5 c0x0000 (---------------)  + I ens
+	0x00207503, // n0x1cd6 c0x0000 (---------------)  + I fin
+	0x0026cc83, // n0x1cd7 c0x0000 (---------------)  + I gov
+	0x0021d883, // n0x1cd8 c0x0000 (---------------)  + I ind
+	0x003a1244, // n0x1cd9 c0x0000 (---------------)  + I info
+	0x0036d504, // n0x1cda c0x0000 (---------------)  + I intl
+	0x002da6c6, // n0x1cdb c0x0000 (---------------)  + I mincom
+	0x0022b143, // n0x1cdc c0x0000 (---------------)  + I nat
+	0x0021fe03, // n0x1cdd c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x1cde c0x0000 (---------------)  + I org
+	0x00295005, // n0x1cdf c0x0000 (---------------)  + I perso
+	0x0020d344, // n0x1ce0 c0x0000 (---------------)  + I rnrt
+	0x00266ec3, // n0x1ce1 c0x0000 (---------------)  + I rns
+	0x00351883, // n0x1ce2 c0x0000 (---------------)  + I rnu
+	0x002c0507, // n0x1ce3 c0x0000 (---------------)  + I tourism
+	0x00209e45, // n0x1ce4 c0x0000 (---------------)  + I turen
+	0x00233503, // n0x1ce5 c0x0000 (---------------)  + I com
+	0x0023a783, // n0x1ce6 c0x0000 (---------------)  + I edu
+	0x0026cc83, // n0x1ce7 c0x0000 (---------------)  + I gov
+	0x00209003, // n0x1ce8 c0x0000 (---------------)  + I mil
+	0x0021fe03, // n0x1ce9 c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x1cea c0x0000 (---------------)  + I org
+	0x00203402, // n0x1ceb c0x0000 (---------------)  + I av
+	0x002cb903, // n0x1cec c0x0000 (---------------)  + I bbs
+	0x0028e2c3, // n0x1ced c0x0000 (---------------)  + I bel
+	0x00330b83, // n0x1cee c0x0000 (---------------)  + I biz
+	0x52a33503, // n0x1cef c0x014a (n0x1d00-n0x1d01)  + I com
+	0x0022bf42, // n0x1cf0 c0x0000 (---------------)  + I dr
+	0x0023a783, // n0x1cf1 c0x0000 (---------------)  + I edu
+	0x00205843, // n0x1cf2 c0x0000 (---------------)  + I gen
+	0x0026cc83, // n0x1cf3 c0x0000 (---------------)  + I gov
+	0x003a1244, // n0x1cf4 c0x0000 (---------------)  + I info
+	0x00309ac3, // n0x1cf5 c0x0000 (---------------)  + I k12
+	0x00249343, // n0x1cf6 c0x0000 (---------------)  + I kep
+	0x00209003, // n0x1cf7 c0x0000 (---------------)  + I mil
+	0x00205284, // n0x1cf8 c0x0000 (---------------)  + I name
+	0x52e00642, // n0x1cf9 c0x014b (n0x1d01-n0x1d02)  + I nc
+	0x0021fe03, // n0x1cfa c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x1cfb c0x0000 (---------------)  + I org
+	0x00208103, // n0x1cfc c0x0000 (---------------)  + I pol
+	0x0022f7c3, // n0x1cfd c0x0000 (---------------)  + I tel
+	0x00224e42, // n0x1cfe c0x0000 (---------------)  + I tv
+	0x00221a03, // n0x1cff c0x0000 (---------------)  + I web
+	0x000ffa08, // n0x1d00 c0x0000 (---------------)  +   blogspot
+	0x0026cc83, // n0x1d01 c0x0000 (---------------)  + I gov
+	0x002389c4, // n0x1d02 c0x0000 (---------------)  + I aero
+	0x00330b83, // n0x1d03 c0x0000 (---------------)  + I biz
+	0x00200742, // n0x1d04 c0x0000 (---------------)  + I co
+	0x00233503, // n0x1d05 c0x0000 (---------------)  + I com
+	0x0023d684, // n0x1d06 c0x0000 (---------------)  + I coop
+	0x0023a783, // n0x1d07 c0x0000 (---------------)  + I edu
+	0x0026cc83, // n0x1d08 c0x0000 (---------------)  + I gov
+	0x003a1244, // n0x1d09 c0x0000 (---------------)  + I info
+	0x00201603, // n0x1d0a c0x0000 (---------------)  + I int
+	0x002ddc44, // n0x1d0b c0x0000 (---------------)  + I jobs
+	0x00207104, // n0x1d0c c0x0000 (---------------)  + I mobi
+	0x002d0106, // n0x1d0d c0x0000 (---------------)  + I museum
+	0x00205284, // n0x1d0e c0x0000 (---------------)  + I name
+	0x0021fe03, // n0x1d0f c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x1d10 c0x0000 (---------------)  + I org
+	0x00220e43, // n0x1d11 c0x0000 (---------------)  + I pro
+	0x0029bec6, // n0x1d12 c0x0000 (---------------)  + I travel
+	0x00055f8b, // n0x1d13 c0x0000 (---------------)  +   better-than
+	0x00013886, // n0x1d14 c0x0000 (---------------)  +   dyndns
+	0x0002184a, // n0x1d15 c0x0000 (---------------)  +   on-the-web
+	0x000fef4a, // n0x1d16 c0x0000 (---------------)  +   worse-than
+	0x000ffa08, // n0x1d17 c0x0000 (---------------)  +   blogspot
+	0x00238ac4, // n0x1d18 c0x0000 (---------------)  + I club
+	0x00233503, // n0x1d19 c0x0000 (---------------)  + I com
+	0x00330b44, // n0x1d1a c0x0000 (---------------)  + I ebiz
+	0x0023a783, // n0x1d1b c0x0000 (---------------)  + I edu
+	0x00297cc4, // n0x1d1c c0x0000 (---------------)  + I game
+	0x0026cc83, // n0x1d1d c0x0000 (---------------)  + I gov
+	0x00317243, // n0x1d1e c0x0000 (---------------)  + I idv
+	0x00209003, // n0x1d1f c0x0000 (---------------)  + I mil
+	0x0021fe03, // n0x1d20 c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x1d21 c0x0000 (---------------)  + I org
+	0x0032444b, // n0x1d22 c0x0000 (---------------)  + I xn--czrw28b
+	0x003941ca, // n0x1d23 c0x0000 (---------------)  + I xn--uc0atv
+	0x003a54cc, // n0x1d24 c0x0000 (---------------)  + I xn--zf0ao64a
+	0x00201542, // n0x1d25 c0x0000 (---------------)  + I ac
+	0x00200742, // n0x1d26 c0x0000 (---------------)  + I co
+	0x00202d42, // n0x1d27 c0x0000 (---------------)  + I go
+	0x00234dc5, // n0x1d28 c0x0000 (---------------)  + I hotel
+	0x003a1244, // n0x1d29 c0x0000 (---------------)  + I info
+	0x00203e82, // n0x1d2a c0x0000 (---------------)  + I me
+	0x00209003, // n0x1d2b c0x0000 (---------------)  + I mil
+	0x00207104, // n0x1d2c c0x0000 (---------------)  + I mobi
+	0x00202c02, // n0x1d2d c0x0000 (---------------)  + I ne
+	0x00200282, // n0x1d2e c0x0000 (---------------)  + I or
+	0x00200702, // n0x1d2f c0x0000 (---------------)  + I sc
+	0x00224e42, // n0x1d30 c0x0000 (---------------)  + I tv
+	0x00130b83, // n0x1d31 c0x0000 (---------------)  +   biz
+	0x002d5d89, // n0x1d32 c0x0000 (---------------)  + I cherkassy
+	0x00289888, // n0x1d33 c0x0000 (---------------)  + I cherkasy
+	0x0026cb09, // n0x1d34 c0x0000 (---------------)  + I chernigov
+	0x0027d249, // n0x1d35 c0x0000 (---------------)  + I chernihiv
+	0x0036e44a, // n0x1d36 c0x0000 (---------------)  + I chernivtsi
+	0x00375aca, // n0x1d37 c0x0000 (---------------)  + I chernovtsy
+	0x0020b482, // n0x1d38 c0x0000 (---------------)  + I ck
+	0x0021ba42, // n0x1d39 c0x0000 (---------------)  + I cn
+	0x00000742, // n0x1d3a c0x0000 (---------------)  +   co
+	0x00233503, // n0x1d3b c0x0000 (---------------)  + I com
+	0x002049c2, // n0x1d3c c0x0000 (---------------)  + I cr
+	0x00245e06, // n0x1d3d c0x0000 (---------------)  + I crimea
+	0x00353bc2, // n0x1d3e c0x0000 (---------------)  + I cv
+	0x00211102, // n0x1d3f c0x0000 (---------------)  + I dn
+	0x002276ce, // n0x1d40 c0x0000 (---------------)  + I dnepropetrovsk
+	0x0027148e, // n0x1d41 c0x0000 (---------------)  + I dnipropetrovsk
+	0x0027d0c7, // n0x1d42 c0x0000 (---------------)  + I dominic
+	0x003219c7, // n0x1d43 c0x0000 (---------------)  + I donetsk
+	0x0024dc82, // n0x1d44 c0x0000 (---------------)  + I dp
+	0x0023a783, // n0x1d45 c0x0000 (---------------)  + I edu
+	0x0026cc83, // n0x1d46 c0x0000 (---------------)  + I gov
+	0x00200f02, // n0x1d47 c0x0000 (---------------)  + I if
+	0x002013c2, // n0x1d48 c0x0000 (---------------)  + I in
+	0x0024048f, // n0x1d49 c0x0000 (---------------)  + I ivano-frankivsk
+	0x0021acc2, // n0x1d4a c0x0000 (---------------)  + I kh
+	0x0023fb87, // n0x1d4b c0x0000 (---------------)  + I kharkiv
+	0x00240807, // n0x1d4c c0x0000 (---------------)  + I kharkov
+	0x0024b387, // n0x1d4d c0x0000 (---------------)  + I kherson
+	0x0024eb8c, // n0x1d4e c0x0000 (---------------)  + I khmelnitskiy
+	0x00250bcc, // n0x1d4f c0x0000 (---------------)  + I khmelnytskyi
+	0x00202ac4, // n0x1d50 c0x0000 (---------------)  + I kiev
+	0x0027ea4a, // n0x1d51 c0x0000 (---------------)  + I kirovograd
+	0x002316c2, // n0x1d52 c0x0000 (---------------)  + I km
+	0x00206fc2, // n0x1d53 c0x0000 (---------------)  + I kr
+	0x002b1504, // n0x1d54 c0x0000 (---------------)  + I krym
+	0x00254e42, // n0x1d55 c0x0000 (---------------)  + I ks
+	0x002bb402, // n0x1d56 c0x0000 (---------------)  + I kv
+	0x00250e04, // n0x1d57 c0x0000 (---------------)  + I kyiv
+	0x00219082, // n0x1d58 c0x0000 (---------------)  + I lg
+	0x00209e02, // n0x1d59 c0x0000 (---------------)  + I lt
+	0x00250a47, // n0x1d5a c0x0000 (---------------)  + I lugansk
+	0x00238045, // n0x1d5b c0x0000 (---------------)  + I lutsk
+	0x00205d02, // n0x1d5c c0x0000 (---------------)  + I lv
+	0x00240404, // n0x1d5d c0x0000 (---------------)  + I lviv
+	0x00367142, // n0x1d5e c0x0000 (---------------)  + I mk
+	0x002f0388, // n0x1d5f c0x0000 (---------------)  + I mykolaiv
+	0x0021fe03, // n0x1d60 c0x0000 (---------------)  + I net
+	0x00203488, // n0x1d61 c0x0000 (---------------)  + I nikolaev
+	0x00202d82, // n0x1d62 c0x0000 (---------------)  + I od
+	0x0023bac5, // n0x1d63 c0x0000 (---------------)  + I odesa
+	0x00372946, // n0x1d64 c0x0000 (---------------)  + I odessa
+	0x0022d1c3, // n0x1d65 c0x0000 (---------------)  + I org
+	0x002063c2, // n0x1d66 c0x0000 (---------------)  + I pl
+	0x002dea07, // n0x1d67 c0x0000 (---------------)  + I poltava
+	0x00009302, // n0x1d68 c0x0000 (---------------)  +   pp
+	0x002e1c85, // n0x1d69 c0x0000 (---------------)  + I rivne
+	0x0038af45, // n0x1d6a c0x0000 (---------------)  + I rovno
+	0x00206882, // n0x1d6b c0x0000 (---------------)  + I rv
+	0x0022d142, // n0x1d6c c0x0000 (---------------)  + I sb
+	0x00207f4a, // n0x1d6d c0x0000 (---------------)  + I sebastopol
+	0x0025140a, // n0x1d6e c0x0000 (---------------)  + I sevastopol
+	0x0024cdc2, // n0x1d6f c0x0000 (---------------)  + I sm
+	0x002f0304, // n0x1d70 c0x0000 (---------------)  + I sumy
+	0x002012c2, // n0x1d71 c0x0000 (---------------)  + I te
+	0x00320448, // n0x1d72 c0x0000 (---------------)  + I ternopil
+	0x00211342, // n0x1d73 c0x0000 (---------------)  + I uz
+	0x0029cfc8, // n0x1d74 c0x0000 (---------------)  + I uzhgorod
+	0x002f6cc7, // n0x1d75 c0x0000 (---------------)  + I vinnica
+	0x002f7889, // n0x1d76 c0x0000 (---------------)  + I vinnytsia
+	0x00203442, // n0x1d77 c0x0000 (---------------)  + I vn
+	0x002fcc45, // n0x1d78 c0x0000 (---------------)  + I volyn
+	0x00289d45, // n0x1d79 c0x0000 (---------------)  + I yalta
+	0x002c300b, // n0x1d7a c0x0000 (---------------)  + I zaporizhzhe
+	0x002c3a4c, // n0x1d7b c0x0000 (---------------)  + I zaporizhzhia
+	0x00230c08, // n0x1d7c c0x0000 (---------------)  + I zhitomir
+	0x002fd008, // n0x1d7d c0x0000 (---------------)  + I zhytomyr
+	0x00264682, // n0x1d7e c0x0000 (---------------)  + I zp
+	0x00219b02, // n0x1d7f c0x0000 (---------------)  + I zt
+	0x00201542, // n0x1d80 c0x0000 (---------------)  + I ac
+	0x000ffa08, // n0x1d81 c0x0000 (---------------)  +   blogspot
+	0x00200742, // n0x1d82 c0x0000 (---------------)  + I co
+	0x00233503, // n0x1d83 c0x0000 (---------------)  + I com
+	0x00202d42, // n0x1d84 c0x0000 (---------------)  + I go
+	0x00202c02, // n0x1d85 c0x0000 (---------------)  + I ne
+	0x00200282, // n0x1d86 c0x0000 (---------------)  + I or
+	0x0022d1c3, // n0x1d87 c0x0000 (---------------)  + I org
+	0x00200702, // n0x1d88 c0x0000 (---------------)  + I sc
+	0x00201542, // n0x1d89 c0x0000 (---------------)  + I ac
+	0x54e00742, // n0x1d8a c0x0153 (n0x1d94-n0x1d95)  + I co
+	0x5526cc83, // n0x1d8b c0x0154 (n0x1d95-n0x1d96)  + I gov
+	0x00322cc3, // n0x1d8c c0x0000 (---------------)  + I ltd
+	0x00203e82, // n0x1d8d c0x0000 (---------------)  + I me
+	0x0021fe03, // n0x1d8e c0x0000 (---------------)  + I net
+	0x0038eb83, // n0x1d8f c0x0000 (---------------)  + I nhs
+	0x0022d1c3, // n0x1d90 c0x0000 (---------------)  + I org
+	0x002db143, // n0x1d91 c0x0000 (---------------)  + I plc
+	0x00225d06, // n0x1d92 c0x0000 (---------------)  + I police
+	0x01617443, // n0x1d93 c0x0005 (---------------)* o I sch
+	0x000ffa08, // n0x1d94 c0x0000 (---------------)  +   blogspot
+	0x00006807, // n0x1d95 c0x0000 (---------------)  +   service
+	0x55a01dc2, // n0x1d96 c0x0156 (n0x1dd5-n0x1dd8)  + I ak
+	0x55e001c2, // n0x1d97 c0x0157 (n0x1dd8-n0x1ddb)  + I al
+	0x56200a42, // n0x1d98 c0x0158 (n0x1ddb-n0x1dde)  + I ar
+	0x56601d42, // n0x1d99 c0x0159 (n0x1dde-n0x1de1)  + I as
+	0x56a05f42, // n0x1d9a c0x015a (n0x1de1-n0x1de4)  + I az
+	0x56e00302, // n0x1d9b c0x015b (n0x1de4-n0x1de7)  + I ca
+	0x57200742, // n0x1d9c c0x015c (n0x1de7-n0x1dea)  + I co
+	0x57631382, // n0x1d9d c0x015d (n0x1dea-n0x1ded)  + I ct
+	0x57a1fb42, // n0x1d9e c0x015e (n0x1ded-n0x1df0)  + I dc
+	0x57e04d82, // n0x1d9f c0x015f (n0x1df0-n0x1df3)  + I de
+	0x00271483, // n0x1da0 c0x0000 (---------------)  + I dni
+	0x00211503, // n0x1da1 c0x0000 (---------------)  + I fed
+	0x582175c2, // n0x1da2 c0x0160 (n0x1df3-n0x1df6)  + I fl
+	0x58601042, // n0x1da3 c0x0161 (n0x1df6-n0x1df9)  + I ga
+	0x58a0dd42, // n0x1da4 c0x0162 (n0x1df9-n0x1dfc)  + I gu
+	0x58e00d82, // n0x1da5 c0x0163 (n0x1dfc-n0x1dfe)  + I hi
+	0x59207682, // n0x1da6 c0x0164 (n0x1dfe-n0x1e01)  + I ia
+	0x5960c782, // n0x1da7 c0x0165 (n0x1e01-n0x1e04)  + I id
+	0x59a02902, // n0x1da8 c0x0166 (n0x1e04-n0x1e07)  + I il
+	0x59e013c2, // n0x1da9 c0x0167 (n0x1e07-n0x1e0a)  + I in
+	0x000b8d45, // n0x1daa c0x0000 (---------------)  +   is-by
+	0x00223543, // n0x1dab c0x0000 (---------------)  + I isa
+	0x0028cd44, // n0x1dac c0x0000 (---------------)  + I kids
+	0x5a254e42, // n0x1dad c0x0168 (n0x1e0a-n0x1e0d)  + I ks
+	0x5a636902, // n0x1dae c0x0169 (n0x1e0d-n0x1e10)  + I ky
+	0x5aa00802, // n0x1daf c0x016a (n0x1e10-n0x1e13)  + I la
+	0x0007958b, // n0x1db0 c0x0000 (---------------)  +   land-4-sale
+	0x5ae00182, // n0x1db1 c0x016b (n0x1e13-n0x1e16)  + I ma
+	0x5b64da82, // n0x1db2 c0x016d (n0x1e19-n0x1e1c)  + I md
+	0x5ba03e82, // n0x1db3 c0x016e (n0x1e1c-n0x1e1f)  + I me
+	0x5be09002, // n0x1db4 c0x016f (n0x1e1f-n0x1e22)  + I mi
+	0x5c21fdc2, // n0x1db5 c0x0170 (n0x1e22-n0x1e25)  + I mn
+	0x5c607102, // n0x1db6 c0x0171 (n0x1e25-n0x1e28)  + I mo
+	0x5ca0f702, // n0x1db7 c0x0172 (n0x1e28-n0x1e2b)  + I ms
+	0x5ce04c02, // n0x1db8 c0x0173 (n0x1e2b-n0x1e2e)  + I mt
+	0x5d200642, // n0x1db9 c0x0174 (n0x1e2e-n0x1e31)  + I nc
+	0x5d600882, // n0x1dba c0x0175 (n0x1e31-n0x1e33)  + I nd
+	0x5da02c02, // n0x1dbb c0x0176 (n0x1e33-n0x1e36)  + I ne
+	0x5de03382, // n0x1dbc c0x0177 (n0x1e36-n0x1e39)  + I nh
+	0x5e204002, // n0x1dbd c0x0178 (n0x1e39-n0x1e3c)  + I nj
+	0x5e63db02, // n0x1dbe c0x0179 (n0x1e3c-n0x1e3f)  + I nm
+	0x002e0f43, // n0x1dbf c0x0000 (---------------)  + I nsn
+	0x5ea03d42, // n0x1dc0 c0x017a (n0x1e3f-n0x1e42)  + I nv
+	0x5ee15842, // n0x1dc1 c0x017b (n0x1e42-n0x1e45)  + I ny
+	0x5f207382, // n0x1dc2 c0x017c (n0x1e45-n0x1e48)  + I oh
+	0x5f601b82, // n0x1dc3 c0x017d (n0x1e48-n0x1e4b)  + I ok
+	0x5fa00282, // n0x1dc4 c0x017e (n0x1e4b-n0x1e4e)  + I or
+	0x5fe0ac42, // n0x1dc5 c0x017f (n0x1e4e-n0x1e51)  + I pa
+	0x60204602, // n0x1dc6 c0x0180 (n0x1e51-n0x1e54)  + I pr
+	0x60600a82, // n0x1dc7 c0x0181 (n0x1e54-n0x1e57)  + I ri
+	0x60a00702, // n0x1dc8 c0x0182 (n0x1e57-n0x1e5a)  + I sc
+	0x60e496c2, // n0x1dc9 c0x0183 (n0x1e5a-n0x1e5c)  + I sd
+	0x000e868c, // n0x1dca c0x0000 (---------------)  +   stuff-4-sale
+	0x6124f882, // n0x1dcb c0x0184 (n0x1e5c-n0x1e5f)  + I tn
+	0x61673442, // n0x1dcc c0x0185 (n0x1e5f-n0x1e62)  + I tx
+	0x61a03b02, // n0x1dcd c0x0186 (n0x1e62-n0x1e65)  + I ut
+	0x61e000c2, // n0x1dce c0x0187 (n0x1e65-n0x1e68)  + I va
+	0x62205d42, // n0x1dcf c0x0188 (n0x1e68-n0x1e6b)  + I vi
+	0x62671f82, // n0x1dd0 c0x0189 (n0x1e6b-n0x1e6e)  + I vt
+	0x62a010c2, // n0x1dd1 c0x018a (n0x1e6e-n0x1e71)  + I wa
+	0x62e0ae82, // n0x1dd2 c0x018b (n0x1e71-n0x1e74)  + I wi
+	0x632755c2, // n0x1dd3 c0x018c (n0x1e74-n0x1e75)  + I wv
+	0x63674502, // n0x1dd4 c0x018d (n0x1e75-n0x1e78)  + I wy
+	0x0022e182, // n0x1dd5 c0x0000 (---------------)  + I cc
+	0x00309ac3, // n0x1dd6 c0x0000 (---------------)  + I k12
+	0x0027b703, // n0x1dd7 c0x0000 (---------------)  + I lib
+	0x0022e182, // n0x1dd8 c0x0000 (---------------)  + I cc
+	0x00309ac3, // n0x1dd9 c0x0000 (---------------)  + I k12
+	0x0027b703, // n0x1dda c0x0000 (---------------)  + I lib
+	0x0022e182, // n0x1ddb c0x0000 (---------------)  + I cc
+	0x00309ac3, // n0x1ddc c0x0000 (---------------)  + I k12
+	0x0027b703, // n0x1ddd c0x0000 (---------------)  + I lib
+	0x0022e182, // n0x1dde c0x0000 (---------------)  + I cc
+	0x00309ac3, // n0x1ddf c0x0000 (---------------)  + I k12
+	0x0027b703, // n0x1de0 c0x0000 (---------------)  + I lib
+	0x0022e182, // n0x1de1 c0x0000 (---------------)  + I cc
+	0x00309ac3, // n0x1de2 c0x0000 (---------------)  + I k12
+	0x0027b703, // n0x1de3 c0x0000 (---------------)  + I lib
+	0x0022e182, // n0x1de4 c0x0000 (---------------)  + I cc
+	0x00309ac3, // n0x1de5 c0x0000 (---------------)  + I k12
+	0x0027b703, // n0x1de6 c0x0000 (---------------)  + I lib
+	0x0022e182, // n0x1de7 c0x0000 (---------------)  + I cc
+	0x00309ac3, // n0x1de8 c0x0000 (---------------)  + I k12
+	0x0027b703, // n0x1de9 c0x0000 (---------------)  + I lib
+	0x0022e182, // n0x1dea c0x0000 (---------------)  + I cc
+	0x00309ac3, // n0x1deb c0x0000 (---------------)  + I k12
+	0x0027b703, // n0x1dec c0x0000 (---------------)  + I lib
+	0x0022e182, // n0x1ded c0x0000 (---------------)  + I cc
+	0x00309ac3, // n0x1dee c0x0000 (---------------)  + I k12
+	0x0027b703, // n0x1def c0x0000 (---------------)  + I lib
+	0x0022e182, // n0x1df0 c0x0000 (---------------)  + I cc
+	0x00309ac3, // n0x1df1 c0x0000 (---------------)  + I k12
+	0x0027b703, // n0x1df2 c0x0000 (---------------)  + I lib
+	0x0022e182, // n0x1df3 c0x0000 (---------------)  + I cc
+	0x00309ac3, // n0x1df4 c0x0000 (---------------)  + I k12
+	0x0027b703, // n0x1df5 c0x0000 (---------------)  + I lib
+	0x0022e182, // n0x1df6 c0x0000 (---------------)  + I cc
+	0x00309ac3, // n0x1df7 c0x0000 (---------------)  + I k12
+	0x0027b703, // n0x1df8 c0x0000 (---------------)  + I lib
+	0x0022e182, // n0x1df9 c0x0000 (---------------)  + I cc
+	0x00309ac3, // n0x1dfa c0x0000 (---------------)  + I k12
+	0x0027b703, // n0x1dfb c0x0000 (---------------)  + I lib
+	0x0022e182, // n0x1dfc c0x0000 (---------------)  + I cc
+	0x0027b703, // n0x1dfd c0x0000 (---------------)  + I lib
+	0x0022e182, // n0x1dfe c0x0000 (---------------)  + I cc
+	0x00309ac3, // n0x1dff c0x0000 (---------------)  + I k12
+	0x0027b703, // n0x1e00 c0x0000 (---------------)  + I lib
+	0x0022e182, // n0x1e01 c0x0000 (---------------)  + I cc
+	0x00309ac3, // n0x1e02 c0x0000 (---------------)  + I k12
+	0x0027b703, // n0x1e03 c0x0000 (---------------)  + I lib
+	0x0022e182, // n0x1e04 c0x0000 (---------------)  + I cc
+	0x00309ac3, // n0x1e05 c0x0000 (---------------)  + I k12
+	0x0027b703, // n0x1e06 c0x0000 (---------------)  + I lib
+	0x0022e182, // n0x1e07 c0x0000 (---------------)  + I cc
+	0x00309ac3, // n0x1e08 c0x0000 (---------------)  + I k12
+	0x0027b703, // n0x1e09 c0x0000 (---------------)  + I lib
+	0x0022e182, // n0x1e0a c0x0000 (---------------)  + I cc
+	0x00309ac3, // n0x1e0b c0x0000 (---------------)  + I k12
+	0x0027b703, // n0x1e0c c0x0000 (---------------)  + I lib
+	0x0022e182, // n0x1e0d c0x0000 (---------------)  + I cc
+	0x00309ac3, // n0x1e0e c0x0000 (---------------)  + I k12
+	0x0027b703, // n0x1e0f c0x0000 (---------------)  + I lib
+	0x0022e182, // n0x1e10 c0x0000 (---------------)  + I cc
+	0x00309ac3, // n0x1e11 c0x0000 (---------------)  + I k12
+	0x0027b703, // n0x1e12 c0x0000 (---------------)  + I lib
+	0x0022e182, // n0x1e13 c0x0000 (---------------)  + I cc
+	0x5b309ac3, // n0x1e14 c0x016c (n0x1e16-n0x1e19)  + I k12
+	0x0027b703, // n0x1e15 c0x0000 (---------------)  + I lib
+	0x0022a644, // n0x1e16 c0x0000 (---------------)  + I chtr
+	0x00289786, // n0x1e17 c0x0000 (---------------)  + I paroch
+	0x002e5543, // n0x1e18 c0x0000 (---------------)  + I pvt
+	0x0022e182, // n0x1e19 c0x0000 (---------------)  + I cc
+	0x00309ac3, // n0x1e1a c0x0000 (---------------)  + I k12
+	0x0027b703, // n0x1e1b c0x0000 (---------------)  + I lib
+	0x0022e182, // n0x1e1c c0x0000 (---------------)  + I cc
+	0x00309ac3, // n0x1e1d c0x0000 (---------------)  + I k12
+	0x0027b703, // n0x1e1e c0x0000 (---------------)  + I lib
+	0x0022e182, // n0x1e1f c0x0000 (---------------)  + I cc
+	0x00309ac3, // n0x1e20 c0x0000 (---------------)  + I k12
+	0x0027b703, // n0x1e21 c0x0000 (---------------)  + I lib
+	0x0022e182, // n0x1e22 c0x0000 (---------------)  + I cc
+	0x00309ac3, // n0x1e23 c0x0000 (---------------)  + I k12
+	0x0027b703, // n0x1e24 c0x0000 (---------------)  + I lib
+	0x0022e182, // n0x1e25 c0x0000 (---------------)  + I cc
+	0x00309ac3, // n0x1e26 c0x0000 (---------------)  + I k12
+	0x0027b703, // n0x1e27 c0x0000 (---------------)  + I lib
+	0x0022e182, // n0x1e28 c0x0000 (---------------)  + I cc
+	0x00309ac3, // n0x1e29 c0x0000 (---------------)  + I k12
+	0x0027b703, // n0x1e2a c0x0000 (---------------)  + I lib
+	0x0022e182, // n0x1e2b c0x0000 (---------------)  + I cc
+	0x00309ac3, // n0x1e2c c0x0000 (---------------)  + I k12
+	0x0027b703, // n0x1e2d c0x0000 (---------------)  + I lib
+	0x0022e182, // n0x1e2e c0x0000 (---------------)  + I cc
+	0x00309ac3, // n0x1e2f c0x0000 (---------------)  + I k12
+	0x0027b703, // n0x1e30 c0x0000 (---------------)  + I lib
+	0x0022e182, // n0x1e31 c0x0000 (---------------)  + I cc
+	0x0027b703, // n0x1e32 c0x0000 (---------------)  + I lib
+	0x0022e182, // n0x1e33 c0x0000 (---------------)  + I cc
+	0x00309ac3, // n0x1e34 c0x0000 (---------------)  + I k12
+	0x0027b703, // n0x1e35 c0x0000 (---------------)  + I lib
+	0x0022e182, // n0x1e36 c0x0000 (---------------)  + I cc
+	0x00309ac3, // n0x1e37 c0x0000 (---------------)  + I k12
+	0x0027b703, // n0x1e38 c0x0000 (---------------)  + I lib
+	0x0022e182, // n0x1e39 c0x0000 (---------------)  + I cc
+	0x00309ac3, // n0x1e3a c0x0000 (---------------)  + I k12
+	0x0027b703, // n0x1e3b c0x0000 (---------------)  + I lib
+	0x0022e182, // n0x1e3c c0x0000 (---------------)  + I cc
+	0x00309ac3, // n0x1e3d c0x0000 (---------------)  + I k12
+	0x0027b703, // n0x1e3e c0x0000 (---------------)  + I lib
+	0x0022e182, // n0x1e3f c0x0000 (---------------)  + I cc
+	0x00309ac3, // n0x1e40 c0x0000 (---------------)  + I k12
+	0x0027b703, // n0x1e41 c0x0000 (---------------)  + I lib
+	0x0022e182, // n0x1e42 c0x0000 (---------------)  + I cc
+	0x00309ac3, // n0x1e43 c0x0000 (---------------)  + I k12
+	0x0027b703, // n0x1e44 c0x0000 (---------------)  + I lib
+	0x0022e182, // n0x1e45 c0x0000 (---------------)  + I cc
+	0x00309ac3, // n0x1e46 c0x0000 (---------------)  + I k12
+	0x0027b703, // n0x1e47 c0x0000 (---------------)  + I lib
+	0x0022e182, // n0x1e48 c0x0000 (---------------)  + I cc
+	0x00309ac3, // n0x1e49 c0x0000 (---------------)  + I k12
+	0x0027b703, // n0x1e4a c0x0000 (---------------)  + I lib
+	0x0022e182, // n0x1e4b c0x0000 (---------------)  + I cc
+	0x00309ac3, // n0x1e4c c0x0000 (---------------)  + I k12
+	0x0027b703, // n0x1e4d c0x0000 (---------------)  + I lib
+	0x0022e182, // n0x1e4e c0x0000 (---------------)  + I cc
+	0x00309ac3, // n0x1e4f c0x0000 (---------------)  + I k12
+	0x0027b703, // n0x1e50 c0x0000 (---------------)  + I lib
+	0x0022e182, // n0x1e51 c0x0000 (---------------)  + I cc
+	0x00309ac3, // n0x1e52 c0x0000 (---------------)  + I k12
+	0x0027b703, // n0x1e53 c0x0000 (---------------)  + I lib
+	0x0022e182, // n0x1e54 c0x0000 (---------------)  + I cc
+	0x00309ac3, // n0x1e55 c0x0000 (---------------)  + I k12
+	0x0027b703, // n0x1e56 c0x0000 (---------------)  + I lib
+	0x0022e182, // n0x1e57 c0x0000 (---------------)  + I cc
+	0x00309ac3, // n0x1e58 c0x0000 (---------------)  + I k12
+	0x0027b703, // n0x1e59 c0x0000 (---------------)  + I lib
+	0x0022e182, // n0x1e5a c0x0000 (---------------)  + I cc
+	0x0027b703, // n0x1e5b c0x0000 (---------------)  + I lib
+	0x0022e182, // n0x1e5c c0x0000 (---------------)  + I cc
+	0x00309ac3, // n0x1e5d c0x0000 (---------------)  + I k12
+	0x0027b703, // n0x1e5e c0x0000 (---------------)  + I lib
+	0x0022e182, // n0x1e5f c0x0000 (---------------)  + I cc
+	0x00309ac3, // n0x1e60 c0x0000 (---------------)  + I k12
+	0x0027b703, // n0x1e61 c0x0000 (---------------)  + I lib
+	0x0022e182, // n0x1e62 c0x0000 (---------------)  + I cc
+	0x00309ac3, // n0x1e63 c0x0000 (---------------)  + I k12
+	0x0027b703, // n0x1e64 c0x0000 (---------------)  + I lib
+	0x0022e182, // n0x1e65 c0x0000 (---------------)  + I cc
+	0x00309ac3, // n0x1e66 c0x0000 (---------------)  + I k12
+	0x0027b703, // n0x1e67 c0x0000 (---------------)  + I lib
+	0x0022e182, // n0x1e68 c0x0000 (---------------)  + I cc
+	0x00309ac3, // n0x1e69 c0x0000 (---------------)  + I k12
+	0x0027b703, // n0x1e6a c0x0000 (---------------)  + I lib
+	0x0022e182, // n0x1e6b c0x0000 (---------------)  + I cc
+	0x00309ac3, // n0x1e6c c0x0000 (---------------)  + I k12
+	0x0027b703, // n0x1e6d c0x0000 (---------------)  + I lib
+	0x0022e182, // n0x1e6e c0x0000 (---------------)  + I cc
+	0x00309ac3, // n0x1e6f c0x0000 (---------------)  + I k12
+	0x0027b703, // n0x1e70 c0x0000 (---------------)  + I lib
+	0x0022e182, // n0x1e71 c0x0000 (---------------)  + I cc
+	0x00309ac3, // n0x1e72 c0x0000 (---------------)  + I k12
+	0x0027b703, // n0x1e73 c0x0000 (---------------)  + I lib
+	0x0022e182, // n0x1e74 c0x0000 (---------------)  + I cc
+	0x0022e182, // n0x1e75 c0x0000 (---------------)  + I cc
+	0x00309ac3, // n0x1e76 c0x0000 (---------------)  + I k12
+	0x0027b703, // n0x1e77 c0x0000 (---------------)  + I lib
+	0x63e33503, // n0x1e78 c0x018f (n0x1e7e-n0x1e7f)  + I com
+	0x0023a783, // n0x1e79 c0x0000 (---------------)  + I edu
+	0x0024a483, // n0x1e7a c0x0000 (---------------)  + I gub
+	0x00209003, // n0x1e7b c0x0000 (---------------)  + I mil
+	0x0021fe03, // n0x1e7c c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x1e7d c0x0000 (---------------)  + I org
+	0x000ffa08, // n0x1e7e c0x0000 (---------------)  +   blogspot
+	0x00200742, // n0x1e7f c0x0000 (---------------)  + I co
+	0x00233503, // n0x1e80 c0x0000 (---------------)  + I com
+	0x0021fe03, // n0x1e81 c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x1e82 c0x0000 (---------------)  + I org
+	0x00233503, // n0x1e83 c0x0000 (---------------)  + I com
+	0x0023a783, // n0x1e84 c0x0000 (---------------)  + I edu
+	0x0026cc83, // n0x1e85 c0x0000 (---------------)  + I gov
+	0x00209003, // n0x1e86 c0x0000 (---------------)  + I mil
+	0x0021fe03, // n0x1e87 c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x1e88 c0x0000 (---------------)  + I org
+	0x0024bf84, // n0x1e89 c0x0000 (---------------)  + I arts
+	0x00200742, // n0x1e8a c0x0000 (---------------)  + I co
+	0x00233503, // n0x1e8b c0x0000 (---------------)  + I com
+	0x00328c03, // n0x1e8c c0x0000 (---------------)  + I e12
+	0x0023a783, // n0x1e8d c0x0000 (---------------)  + I edu
+	0x0024d9c4, // n0x1e8e c0x0000 (---------------)  + I firm
+	0x00213183, // n0x1e8f c0x0000 (---------------)  + I gob
+	0x0026cc83, // n0x1e90 c0x0000 (---------------)  + I gov
+	0x003a1244, // n0x1e91 c0x0000 (---------------)  + I info
+	0x00201603, // n0x1e92 c0x0000 (---------------)  + I int
+	0x00209003, // n0x1e93 c0x0000 (---------------)  + I mil
+	0x0021fe03, // n0x1e94 c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x1e95 c0x0000 (---------------)  + I org
+	0x0022a5c3, // n0x1e96 c0x0000 (---------------)  + I rec
+	0x00391185, // n0x1e97 c0x0000 (---------------)  + I store
+	0x002d59c3, // n0x1e98 c0x0000 (---------------)  + I tec
+	0x00221a03, // n0x1e99 c0x0000 (---------------)  + I web
+	0x00200742, // n0x1e9a c0x0000 (---------------)  + I co
+	0x00233503, // n0x1e9b c0x0000 (---------------)  + I com
+	0x00309ac3, // n0x1e9c c0x0000 (---------------)  + I k12
+	0x0021fe03, // n0x1e9d c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x1e9e c0x0000 (---------------)  + I org
+	0x00201542, // n0x1e9f c0x0000 (---------------)  + I ac
+	0x00330b83, // n0x1ea0 c0x0000 (---------------)  + I biz
+	0x000ffa08, // n0x1ea1 c0x0000 (---------------)  +   blogspot
+	0x00233503, // n0x1ea2 c0x0000 (---------------)  + I com
+	0x0023a783, // n0x1ea3 c0x0000 (---------------)  + I edu
+	0x0026cc83, // n0x1ea4 c0x0000 (---------------)  + I gov
+	0x0036b386, // n0x1ea5 c0x0000 (---------------)  + I health
+	0x003a1244, // n0x1ea6 c0x0000 (---------------)  + I info
+	0x00201603, // n0x1ea7 c0x0000 (---------------)  + I int
+	0x00205284, // n0x1ea8 c0x0000 (---------------)  + I name
+	0x0021fe03, // n0x1ea9 c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x1eaa c0x0000 (---------------)  + I org
+	0x00220e43, // n0x1eab c0x0000 (---------------)  + I pro
+	0x00233503, // n0x1eac c0x0000 (---------------)  + I com
+	0x0023a783, // n0x1ead c0x0000 (---------------)  + I edu
+	0x0021fe03, // n0x1eae c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x1eaf c0x0000 (---------------)  + I org
+	0x00233503, // n0x1eb0 c0x0000 (---------------)  + I com
+	0x00013886, // n0x1eb1 c0x0000 (---------------)  +   dyndns
+	0x0023a783, // n0x1eb2 c0x0000 (---------------)  + I edu
+	0x0026cc83, // n0x1eb3 c0x0000 (---------------)  + I gov
+	0x000d0d86, // n0x1eb4 c0x0000 (---------------)  +   mypets
+	0x0021fe03, // n0x1eb5 c0x0000 (---------------)  + I net
+	0x0022d1c3, // n0x1eb6 c0x0000 (---------------)  + I org
+	0x00309e08, // n0x1eb7 c0x0000 (---------------)  + I xn--80au
+	0x0030c549, // n0x1eb8 c0x0000 (---------------)  + I xn--90azh
+	0x00318cc9, // n0x1eb9 c0x0000 (---------------)  + I xn--c1avg
+	0x00329088, // n0x1eba c0x0000 (---------------)  + I xn--d1at
+	0x00374908, // n0x1ebb c0x0000 (---------------)  + I xn--o1ac
+	0x00374909, // n0x1ebc c0x0000 (---------------)  + I xn--o1ach
+	0x00201542, // n0x1ebd c0x0000 (---------------)  + I ac
+	0x00209c85, // n0x1ebe c0x0000 (---------------)  + I agric
+	0x0023adc3, // n0x1ebf c0x0000 (---------------)  + I alt
+	0x66600742, // n0x1ec0 c0x0199 (n0x1ece-n0x1ecf)  + I co
+	0x0023a783, // n0x1ec1 c0x0000 (---------------)  + I edu
+	0x0026cc83, // n0x1ec2 c0x0000 (---------------)  + I gov
+	0x0027d907, // n0x1ec3 c0x0000 (---------------)  + I grondar
+	0x00274483, // n0x1ec4 c0x0000 (---------------)  + I law
+	0x00209003, // n0x1ec5 c0x0000 (---------------)  + I mil
+	0x0021fe03, // n0x1ec6 c0x0000 (---------------)  + I net
+	0x00202d03, // n0x1ec7 c0x0000 (---------------)  + I ngo
+	0x00211803, // n0x1ec8 c0x0000 (---------------)  + I nis
+	0x00201483, // n0x1ec9 c0x0000 (---------------)  + I nom
+	0x0022d1c3, // n0x1eca c0x0000 (---------------)  + I org
+	0x0023d0c6, // n0x1ecb c0x0000 (---------------)  + I school
+	0x00200142, // n0x1ecc c0x0000 (---------------)  + I tm
+	0x00221a03, // n0x1ecd c0x0000 (---------------)  + I web
+	0x000ffa08, // n0x1ece c0x0000 (---------------)  +   blogspot
+}
+
+// children is the list of nodes' children, the parent's wildcard bit and the
+// parent's node type. If a node has no children then their children index
+// will be in the range [0, 6), depending on the wildcard bit and node type.
+//
+// The layout within the uint32, from MSB to LSB, is:
+//	[ 1 bits] unused
+//	[ 1 bits] wildcard bit
+//	[ 2 bits] node type
+//	[14 bits] high nodes index (exclusive) of children
+//	[14 bits] low nodes index (inclusive) of children
+var children = [...]uint32{
+	0x00000000, // c0x0000 (---------------)  +
+	0x10000000, // c0x0001 (---------------)  !
+	0x20000000, // c0x0002 (---------------)  o
+	0x40000000, // c0x0003 (---------------)* +
+	0x50000000, // c0x0004 (---------------)* !
+	0x60000000, // c0x0005 (---------------)* o
+	0x0183c609, // c0x0006 (n0x0609-n0x060f)  +
+	0x0184060f, // c0x0007 (n0x060f-n0x0610)  +
+	0x01860610, // c0x0008 (n0x0610-n0x0618)  +
+	0x019bc618, // c0x0009 (n0x0618-n0x066f)  +
+	0x019d066f, // c0x000a (n0x066f-n0x0674)  +
+	0x019e4674, // c0x000b (n0x0674-n0x0679)  +
+	0x019f4679, // c0x000c (n0x0679-n0x067d)  +
+	0x01a1067d, // c0x000d (n0x067d-n0x0684)  +
+	0x01a14684, // c0x000e (n0x0684-n0x0685)  +
+	0x01a2c685, // c0x000f (n0x0685-n0x068b)  +
+	0x01a5068b, // c0x0010 (n0x068b-n0x0694)  +
+	0x01a54694, // c0x0011 (n0x0694-n0x0695)  +
+	0x01a6c695, // c0x0012 (n0x0695-n0x069b)  +
+	0x01a7069b, // c0x0013 (n0x069b-n0x069c)  +
+	0x01a8c69c, // c0x0014 (n0x069c-n0x06a3)  +
+	0x01a906a3, // c0x0015 (n0x06a3-n0x06a4)  +
+	0x01ad86a4, // c0x0016 (n0x06a4-n0x06b6)  +
+	0x01adc6b6, // c0x0017 (n0x06b6-n0x06b7)  +
+	0x01afc6b7, // c0x0018 (n0x06b7-n0x06bf)  +
+	0x01b106bf, // c0x0019 (n0x06bf-n0x06c4)  +
+	0x01b146c4, // c0x001a (n0x06c4-n0x06c5)  +
+	0x01b446c5, // c0x001b (n0x06c5-n0x06d1)  +
+	0x01b706d1, // c0x001c (n0x06d1-n0x06dc)  +
+	0x01b986dc, // c0x001d (n0x06dc-n0x06e6)  +
+	0x01ba06e6, // c0x001e (n0x06e6-n0x06e8)  +
+	0x01ba46e8, // c0x001f (n0x06e8-n0x06e9)  +
+	0x01c386e9, // c0x0020 (n0x06e9-n0x070e)  +
+	0x01c4c70e, // c0x0021 (n0x070e-n0x0713)  +
+	0x01c60713, // c0x0022 (n0x0713-n0x0718)  +
+	0x01c80718, // c0x0023 (n0x0718-n0x0720)  +
+	0x01c90720, // c0x0024 (n0x0720-n0x0724)  +
+	0x01ca4724, // c0x0025 (n0x0724-n0x0729)  +
+	0x01cc8729, // c0x0026 (n0x0729-n0x0732)  +
+	0x01de0732, // c0x0027 (n0x0732-n0x0778)  +
+	0x01de4778, // c0x0028 (n0x0778-n0x0779)  +
+	0x01df8779, // c0x0029 (n0x0779-n0x077e)  +
+	0x01e0c77e, // c0x002a (n0x077e-n0x0783)  +
+	0x01e14783, // c0x002b (n0x0783-n0x0785)  +
+	0x01e24785, // c0x002c (n0x0785-n0x0789)  +
+	0x01e28789, // c0x002d (n0x0789-n0x078a)  +
+	0x01e4078a, // c0x002e (n0x078a-n0x0790)  +
+	0x01e84790, // c0x002f (n0x0790-n0x07a1)  +
+	0x01e947a1, // c0x0030 (n0x07a1-n0x07a5)  +
+	0x01e987a5, // c0x0031 (n0x07a5-n0x07a6)  +
+	0x01e9c7a6, // c0x0032 (n0x07a6-n0x07a7)  +
+	0x01ea07a7, // c0x0033 (n0x07a7-n0x07a8)  +
+	0x01edc7a8, // c0x0034 (n0x07a8-n0x07b7)  +
+	0x61ee07b7, // c0x0035 (n0x07b7-n0x07b8)* o
+	0x01ef47b8, // c0x0036 (n0x07b8-n0x07bd)  +
+	0x01f047bd, // c0x0037 (n0x07bd-n0x07c1)  +
+	0x01fb87c1, // c0x0038 (n0x07c1-n0x07ee)  +
+	0x21fbc7ee, // c0x0039 (n0x07ee-n0x07ef)  o
+	0x01fc07ef, // c0x003a (n0x07ef-n0x07f0)  +
+	0x01fc47f0, // c0x003b (n0x07f0-n0x07f1)  +
+	0x21fc87f1, // c0x003c (n0x07f1-n0x07f2)  o
+	0x21fcc7f2, // c0x003d (n0x07f2-n0x07f3)  o
+	0x020007f3, // c0x003e (n0x07f3-n0x0800)  +
+	0x02004800, // c0x003f (n0x0800-n0x0801)  +
+	0x0235c801, // c0x0040 (n0x0801-n0x08d7)  +
+	0x223ac8d7, // c0x0041 (n0x08d7-n0x08eb)  o
+	0x223b08eb, // c0x0042 (n0x08eb-n0x08ec)  o
+	0x023d88ec, // c0x0043 (n0x08ec-n0x08f6)  +
+	0x023e08f6, // c0x0044 (n0x08f6-n0x08f8)  +
+	0x223e48f8, // c0x0045 (n0x08f8-n0x08f9)  o
+	0x223e88f9, // c0x0046 (n0x08f9-n0x08fa)  o
+	0x023f48fa, // c0x0047 (n0x08fa-n0x08fd)  +
+	0x223f88fd, // c0x0048 (n0x08fd-n0x08fe)  o
+	0x024148fe, // c0x0049 (n0x08fe-n0x0905)  +
+	0x0242c905, // c0x004a (n0x0905-n0x090b)  +
+	0x0243090b, // c0x004b (n0x090b-n0x090c)  +
+	0x0244090c, // c0x004c (n0x090c-n0x0910)  +
+	0x02448910, // c0x004d (n0x0910-n0x0912)  +
+	0x2247c912, // c0x004e (n0x0912-n0x091f)  o
+	0x0248091f, // c0x004f (n0x091f-n0x0920)  +
+	0x02488920, // c0x0050 (n0x0920-n0x0922)  +
+	0x024a8922, // c0x0051 (n0x0922-n0x092a)  +
+	0x024ac92a, // c0x0052 (n0x092a-n0x092b)  +
+	0x024c092b, // c0x0053 (n0x092b-n0x0930)  +
+	0x024e8930, // c0x0054 (n0x0930-n0x093a)  +
+	0x0250893a, // c0x0055 (n0x093a-n0x0942)  +
+	0x02538942, // c0x0056 (n0x0942-n0x094e)  +
+	0x0256094e, // c0x0057 (n0x094e-n0x0958)  +
+	0x02564958, // c0x0058 (n0x0958-n0x0959)  +
+	0x02588959, // c0x0059 (n0x0959-n0x0962)  +
+	0x0258c962, // c0x005a (n0x0962-n0x0963)  +
+	0x025a0963, // c0x005b (n0x0963-n0x0968)  +
+	0x025a4968, // c0x005c (n0x0968-n0x0969)  +
+	0x025c4969, // c0x005d (n0x0969-n0x0971)  +
+	0x025d0971, // c0x005e (n0x0971-n0x0974)  +
+	0x02630974, // c0x005f (n0x0974-n0x098c)  +
+	0x0264c98c, // c0x0060 (n0x098c-n0x0993)  +
+	0x02658993, // c0x0061 (n0x0993-n0x0996)  +
+	0x0266c996, // c0x0062 (n0x0996-n0x099b)  +
+	0x0268499b, // c0x0063 (n0x099b-n0x09a1)  +
+	0x026989a1, // c0x0064 (n0x09a1-n0x09a6)  +
+	0x026b09a6, // c0x0065 (n0x09a6-n0x09ac)  +
+	0x026c89ac, // c0x0066 (n0x09ac-n0x09b2)  +
+	0x026e09b2, // c0x0067 (n0x09b2-n0x09b8)  +
+	0x026fc9b8, // c0x0068 (n0x09b8-n0x09bf)  +
+	0x027149bf, // c0x0069 (n0x09bf-n0x09c5)  +
+	0x027749c5, // c0x006a (n0x09c5-n0x09dd)  +
+	0x0278c9dd, // c0x006b (n0x09dd-n0x09e3)  +
+	0x027a09e3, // c0x006c (n0x09e3-n0x09e8)  +
+	0x027e49e8, // c0x006d (n0x09e8-n0x09f9)  +
+	0x028649f9, // c0x006e (n0x09f9-n0x0a19)  +
+	0x02890a19, // c0x006f (n0x0a19-n0x0a24)  +
+	0x02894a24, // c0x0070 (n0x0a24-n0x0a25)  +
+	0x0289ca25, // c0x0071 (n0x0a25-n0x0a27)  +
+	0x028bca27, // c0x0072 (n0x0a27-n0x0a2f)  +
+	0x028c0a2f, // c0x0073 (n0x0a2f-n0x0a30)  +
+	0x028dca30, // c0x0074 (n0x0a30-n0x0a37)  +
+	0x028e4a37, // c0x0075 (n0x0a37-n0x0a39)  +
+	0x02918a39, // c0x0076 (n0x0a39-n0x0a46)  +
+	0x02940a46, // c0x0077 (n0x0a46-n0x0a50)  +
+	0x02944a50, // c0x0078 (n0x0a50-n0x0a51)  +
+	0x0295ca51, // c0x0079 (n0x0a51-n0x0a57)  +
+	0x02974a57, // c0x007a (n0x0a57-n0x0a5d)  +
+	0x02998a5d, // c0x007b (n0x0a5d-n0x0a66)  +
+	0x029b8a66, // c0x007c (n0x0a66-n0x0a6e)  +
+	0x02f7ca6e, // c0x007d (n0x0a6e-n0x0bdf)  +
+	0x02f88bdf, // c0x007e (n0x0bdf-n0x0be2)  +
+	0x02fa8be2, // c0x007f (n0x0be2-n0x0bea)  +
+	0x03164bea, // c0x0080 (n0x0bea-n0x0c59)  +
+	0x03234c59, // c0x0081 (n0x0c59-n0x0c8d)  +
+	0x032a4c8d, // c0x0082 (n0x0c8d-n0x0ca9)  +
+	0x032fcca9, // c0x0083 (n0x0ca9-n0x0cbf)  +
+	0x033e4cbf, // c0x0084 (n0x0cbf-n0x0cf9)  +
+	0x0343ccf9, // c0x0085 (n0x0cf9-n0x0d0f)  +
+	0x03478d0f, // c0x0086 (n0x0d0f-n0x0d1e)  +
+	0x03574d1e, // c0x0087 (n0x0d1e-n0x0d5d)  +
+	0x03640d5d, // c0x0088 (n0x0d5d-n0x0d90)  +
+	0x036d8d90, // c0x0089 (n0x0d90-n0x0db6)  +
+	0x03768db6, // c0x008a (n0x0db6-n0x0dda)  +
+	0x037ccdda, // c0x008b (n0x0dda-n0x0df3)  +
+	0x03a04df3, // c0x008c (n0x0df3-n0x0e81)  +
+	0x03abce81, // c0x008d (n0x0e81-n0x0eaf)  +
+	0x03b88eaf, // c0x008e (n0x0eaf-n0x0ee2)  +
+	0x03bd4ee2, // c0x008f (n0x0ee2-n0x0ef5)  +
+	0x03c5cef5, // c0x0090 (n0x0ef5-n0x0f17)  +
+	0x03c98f17, // c0x0091 (n0x0f17-n0x0f26)  +
+	0x03ce8f26, // c0x0092 (n0x0f26-n0x0f3a)  +
+	0x03d60f3a, // c0x0093 (n0x0f3a-n0x0f58)  +
+	0x63d64f58, // c0x0094 (n0x0f58-n0x0f59)* o
+	0x63d68f59, // c0x0095 (n0x0f59-n0x0f5a)* o
+	0x63d6cf5a, // c0x0096 (n0x0f5a-n0x0f5b)* o
+	0x03de8f5b, // c0x0097 (n0x0f5b-n0x0f7a)  +
+	0x03e50f7a, // c0x0098 (n0x0f7a-n0x0f94)  +
+	0x03eccf94, // c0x0099 (n0x0f94-n0x0fb3)  +
+	0x03f44fb3, // c0x009a (n0x0fb3-n0x0fd1)  +
+	0x03fc8fd1, // c0x009b (n0x0fd1-n0x0ff2)  +
+	0x04034ff2, // c0x009c (n0x0ff2-n0x100d)  +
+	0x0416100d, // c0x009d (n0x100d-n0x1058)  +
+	0x041b9058, // c0x009e (n0x1058-n0x106e)  +
+	0x641bd06e, // c0x009f (n0x106e-n0x106f)* o
+	0x0425506f, // c0x00a0 (n0x106f-n0x1095)  +
+	0x042dd095, // c0x00a1 (n0x1095-n0x10b7)  +
+	0x043290b7, // c0x00a2 (n0x10b7-n0x10ca)  +
+	0x043910ca, // c0x00a3 (n0x10ca-n0x10e4)  +
+	0x044390e4, // c0x00a4 (n0x10e4-n0x110e)  +
+	0x0450110e, // c0x00a5 (n0x110e-n0x1140)  +
+	0x04569140, // c0x00a6 (n0x1140-n0x115a)  +
+	0x0467d15a, // c0x00a7 (n0x115a-n0x119f)  +
+	0x6468119f, // c0x00a8 (n0x119f-n0x11a0)* o
+	0x646851a0, // c0x00a9 (n0x11a0-n0x11a1)* o
+	0x046e11a1, // c0x00aa (n0x11a1-n0x11b8)  +
+	0x0473d1b8, // c0x00ab (n0x11b8-n0x11cf)  +
+	0x047cd1cf, // c0x00ac (n0x11cf-n0x11f3)  +
+	0x048491f3, // c0x00ad (n0x11f3-n0x1212)  +
+	0x0488d212, // c0x00ae (n0x1212-n0x1223)  +
+	0x04971223, // c0x00af (n0x1223-n0x125c)  +
+	0x049a525c, // c0x00b0 (n0x125c-n0x1269)  +
+	0x04a05269, // c0x00b1 (n0x1269-n0x1281)  +
+	0x04a79281, // c0x00b2 (n0x1281-n0x129e)  +
+	0x04b0129e, // c0x00b3 (n0x129e-n0x12c0)  +
+	0x04b412c0, // c0x00b4 (n0x12c0-n0x12d0)  +
+	0x04bb12d0, // c0x00b5 (n0x12d0-n0x12ec)  +
+	0x64bb52ec, // c0x00b6 (n0x12ec-n0x12ed)* o
+	0x64bb92ed, // c0x00b7 (n0x12ed-n0x12ee)* o
+	0x24bbd2ee, // c0x00b8 (n0x12ee-n0x12ef)  o
+	0x04bd52ef, // c0x00b9 (n0x12ef-n0x12f5)  +
+	0x04bf12f5, // c0x00ba (n0x12f5-n0x12fc)  +
+	0x04c352fc, // c0x00bb (n0x12fc-n0x130d)  +
+	0x04c4530d, // c0x00bc (n0x130d-n0x1311)  +
+	0x04c5d311, // c0x00bd (n0x1311-n0x1317)  +
+	0x04cd5317, // c0x00be (n0x1317-n0x1335)  +
+	0x04ce9335, // c0x00bf (n0x1335-n0x133a)  +
+	0x04d0133a, // c0x00c0 (n0x133a-n0x1340)  +
+	0x04d25340, // c0x00c1 (n0x1340-n0x1349)  +
+	0x04d39349, // c0x00c2 (n0x1349-n0x134e)  +
+	0x04d5134e, // c0x00c3 (n0x134e-n0x1354)  +
+	0x04d55354, // c0x00c4 (n0x1354-n0x1355)  +
+	0x04d91355, // c0x00c5 (n0x1355-n0x1364)  +
+	0x04da5364, // c0x00c6 (n0x1364-n0x1369)  +
+	0x04dad369, // c0x00c7 (n0x1369-n0x136b)  +
+	0x04db536b, // c0x00c8 (n0x136b-n0x136d)  +
+	0x04db936d, // c0x00c9 (n0x136d-n0x136e)  +
+	0x04ddd36e, // c0x00ca (n0x136e-n0x1377)  +
+	0x04e01377, // c0x00cb (n0x1377-n0x1380)  +
+	0x04e19380, // c0x00cc (n0x1380-n0x1386)  +
+	0x04e21386, // c0x00cd (n0x1386-n0x1388)  +
+	0x04e25388, // c0x00ce (n0x1388-n0x1389)  +
+	0x04e59389, // c0x00cf (n0x1389-n0x1396)  +
+	0x04e7d396, // c0x00d0 (n0x1396-n0x139f)  +
+	0x04e9d39f, // c0x00d1 (n0x139f-n0x13a7)  +
+	0x04eb93a7, // c0x00d2 (n0x13a7-n0x13ae)  +
+	0x04ec93ae, // c0x00d3 (n0x13ae-n0x13b2)  +
+	0x04edd3b2, // c0x00d4 (n0x13b2-n0x13b7)  +
+	0x04ee13b7, // c0x00d5 (n0x13b7-n0x13b8)  +
+	0x04ee93b8, // c0x00d6 (n0x13b8-n0x13ba)  +
+	0x04efd3ba, // c0x00d7 (n0x13ba-n0x13bf)  +
+	0x04f0d3bf, // c0x00d8 (n0x13bf-n0x13c3)  +
+	0x04f113c3, // c0x00d9 (n0x13c3-n0x13c4)  +
+	0x04f2d3c4, // c0x00da (n0x13c4-n0x13cb)  +
+	0x057bd3cb, // c0x00db (n0x13cb-n0x15ef)  +
+	0x057f55ef, // c0x00dc (n0x15ef-n0x15fd)  +
+	0x058215fd, // c0x00dd (n0x15fd-n0x1608)  +
+	0x05839608, // c0x00de (n0x1608-n0x160e)  +
+	0x0585960e, // c0x00df (n0x160e-n0x1616)  +
+	0x6585d616, // c0x00e0 (n0x1616-n0x1617)* o
+	0x058a1617, // c0x00e1 (n0x1617-n0x1628)  +
+	0x058a9628, // c0x00e2 (n0x1628-n0x162a)  +
+	0x258ad62a, // c0x00e3 (n0x162a-n0x162b)  o
+	0x258b162b, // c0x00e4 (n0x162b-n0x162c)  o
+	0x058b562c, // c0x00e5 (n0x162c-n0x162d)  +
+	0x0598d62d, // c0x00e6 (n0x162d-n0x1663)  +
+	0x25991663, // c0x00e7 (n0x1663-n0x1664)  o
+	0x25999664, // c0x00e8 (n0x1664-n0x1666)  o
+	0x259a1666, // c0x00e9 (n0x1666-n0x1668)  o
+	0x259ad668, // c0x00ea (n0x1668-n0x166b)  o
+	0x059d566b, // c0x00eb (n0x166b-n0x1675)  +
+	0x059fd675, // c0x00ec (n0x1675-n0x167f)  +
+	0x05a0167f, // c0x00ed (n0x167f-n0x1680)  +
+	0x25a39680, // c0x00ee (n0x1680-n0x168e)  o
+	0x05a4568e, // c0x00ef (n0x168e-n0x1691)  +
+	0x0659d691, // c0x00f0 (n0x1691-n0x1967)  +
+	0x065a1967, // c0x00f1 (n0x1967-n0x1968)  +
+	0x065a5968, // c0x00f2 (n0x1968-n0x1969)  +
+	0x265a9969, // c0x00f3 (n0x1969-n0x196a)  o
+	0x065ad96a, // c0x00f4 (n0x196a-n0x196b)  +
+	0x265b196b, // c0x00f5 (n0x196b-n0x196c)  o
+	0x065b596c, // c0x00f6 (n0x196c-n0x196d)  +
+	0x265c196d, // c0x00f7 (n0x196d-n0x1970)  o
+	0x065c5970, // c0x00f8 (n0x1970-n0x1971)  +
+	0x065c9971, // c0x00f9 (n0x1971-n0x1972)  +
+	0x265cd972, // c0x00fa (n0x1972-n0x1973)  o
+	0x065d1973, // c0x00fb (n0x1973-n0x1974)  +
+	0x265d9974, // c0x00fc (n0x1974-n0x1976)  o
+	0x065dd976, // c0x00fd (n0x1976-n0x1977)  +
+	0x065e1977, // c0x00fe (n0x1977-n0x1978)  +
+	0x265f1978, // c0x00ff (n0x1978-n0x197c)  o
+	0x065f597c, // c0x0100 (n0x197c-n0x197d)  +
+	0x065f997d, // c0x0101 (n0x197d-n0x197e)  +
+	0x065fd97e, // c0x0102 (n0x197e-n0x197f)  +
+	0x0660197f, // c0x0103 (n0x197f-n0x1980)  +
+	0x26605980, // c0x0104 (n0x1980-n0x1981)  o
+	0x06609981, // c0x0105 (n0x1981-n0x1982)  +
+	0x0660d982, // c0x0106 (n0x1982-n0x1983)  +
+	0x06611983, // c0x0107 (n0x1983-n0x1984)  +
+	0x06615984, // c0x0108 (n0x1984-n0x1985)  +
+	0x2661d985, // c0x0109 (n0x1985-n0x1987)  o
+	0x06621987, // c0x010a (n0x1987-n0x1988)  +
+	0x06625988, // c0x010b (n0x1988-n0x1989)  +
+	0x06629989, // c0x010c (n0x1989-n0x198a)  +
+	0x2662d98a, // c0x010d (n0x198a-n0x198b)  o
+	0x0663198b, // c0x010e (n0x198b-n0x198c)  +
+	0x2663998c, // c0x010f (n0x198c-n0x198e)  o
+	0x2663d98e, // c0x0110 (n0x198e-n0x198f)  o
+	0x0665998f, // c0x0111 (n0x198f-n0x1996)  +
+	0x06665996, // c0x0112 (n0x1996-n0x1999)  +
+	0x066a5999, // c0x0113 (n0x1999-n0x19a9)  +
+	0x066a99a9, // c0x0114 (n0x19a9-n0x19aa)  +
+	0x066cd9aa, // c0x0115 (n0x19aa-n0x19b3)  +
+	0x067c19b3, // c0x0116 (n0x19b3-n0x19f0)  +
+	0x267c99f0, // c0x0117 (n0x19f0-n0x19f2)  o
+	0x267cd9f2, // c0x0118 (n0x19f2-n0x19f3)  o
+	0x267d19f3, // c0x0119 (n0x19f3-n0x19f4)  o
+	0x067d99f4, // c0x011a (n0x19f4-n0x19f6)  +
+	0x068b59f6, // c0x011b (n0x19f6-n0x1a2d)  +
+	0x068e1a2d, // c0x011c (n0x1a2d-n0x1a38)  +
+	0x06901a38, // c0x011d (n0x1a38-n0x1a40)  +
+	0x0690da40, // c0x011e (n0x1a40-n0x1a43)  +
+	0x0692da43, // c0x011f (n0x1a43-n0x1a4b)  +
+	0x06965a4b, // c0x0120 (n0x1a4b-n0x1a59)  +
+	0x06bf9a59, // c0x0121 (n0x1a59-n0x1afe)  +
+	0x06cb5afe, // c0x0122 (n0x1afe-n0x1b2d)  +
+	0x06cc9b2d, // c0x0123 (n0x1b2d-n0x1b32)  +
+	0x06cfdb32, // c0x0124 (n0x1b32-n0x1b3f)  +
+	0x06d29b3f, // c0x0125 (n0x1b3f-n0x1b4a)  +
+	0x06d45b4a, // c0x0126 (n0x1b4a-n0x1b51)  +
+	0x06d69b51, // c0x0127 (n0x1b51-n0x1b5a)  +
+	0x06d81b5a, // c0x0128 (n0x1b5a-n0x1b60)  +
+	0x06d9db60, // c0x0129 (n0x1b60-n0x1b67)  +
+	0x06dc1b67, // c0x012a (n0x1b67-n0x1b70)  +
+	0x06dd1b70, // c0x012b (n0x1b70-n0x1b74)  +
+	0x06e01b74, // c0x012c (n0x1b74-n0x1b80)  +
+	0x06e1db80, // c0x012d (n0x1b80-n0x1b87)  +
+	0x07029b87, // c0x012e (n0x1b87-n0x1c0a)  +
+	0x0704dc0a, // c0x012f (n0x1c0a-n0x1c13)  +
+	0x0706dc13, // c0x0130 (n0x1c13-n0x1c1b)  +
+	0x07081c1b, // c0x0131 (n0x1c1b-n0x1c20)  +
+	0x07095c20, // c0x0132 (n0x1c20-n0x1c25)  +
+	0x070b5c25, // c0x0133 (n0x1c25-n0x1c2d)  +
+	0x07159c2d, // c0x0134 (n0x1c2d-n0x1c56)  +
+	0x07175c56, // c0x0135 (n0x1c56-n0x1c5d)  +
+	0x07191c5d, // c0x0136 (n0x1c5d-n0x1c64)  +
+	0x07195c64, // c0x0137 (n0x1c64-n0x1c65)  +
+	0x07199c65, // c0x0138 (n0x1c65-n0x1c66)  +
+	0x071adc66, // c0x0139 (n0x1c66-n0x1c6b)  +
+	0x071cdc6b, // c0x013a (n0x1c6b-n0x1c73)  +
+	0x071d9c73, // c0x013b (n0x1c73-n0x1c76)  +
+	0x07209c76, // c0x013c (n0x1c76-n0x1c82)  +
+	0x07289c82, // c0x013d (n0x1c82-n0x1ca2)  +
+	0x0729dca2, // c0x013e (n0x1ca2-n0x1ca7)  +
+	0x072a1ca7, // c0x013f (n0x1ca7-n0x1ca8)  +
+	0x072b9ca8, // c0x0140 (n0x1ca8-n0x1cae)  +
+	0x072c5cae, // c0x0141 (n0x1cae-n0x1cb1)  +
+	0x072c9cb1, // c0x0142 (n0x1cb1-n0x1cb2)  +
+	0x072e5cb2, // c0x0143 (n0x1cb2-n0x1cb9)  +
+	0x07321cb9, // c0x0144 (n0x1cb9-n0x1cc8)  +
+	0x07325cc8, // c0x0145 (n0x1cc8-n0x1cc9)  +
+	0x07345cc9, // c0x0146 (n0x1cc9-n0x1cd1)  +
+	0x07395cd1, // c0x0147 (n0x1cd1-n0x1ce5)  +
+	0x073adce5, // c0x0148 (n0x1ce5-n0x1ceb)  +
+	0x07401ceb, // c0x0149 (n0x1ceb-n0x1d00)  +
+	0x07405d00, // c0x014a (n0x1d00-n0x1d01)  +
+	0x07409d01, // c0x014b (n0x1d01-n0x1d02)  +
+	0x0744dd02, // c0x014c (n0x1d02-n0x1d13)  +
+	0x0745dd13, // c0x014d (n0x1d13-n0x1d17)  +
+	0x07495d17, // c0x014e (n0x1d17-n0x1d25)  +
+	0x074c5d25, // c0x014f (n0x1d25-n0x1d31)  +
+	0x07601d31, // c0x0150 (n0x1d31-n0x1d80)  +
+	0x07625d80, // c0x0151 (n0x1d80-n0x1d89)  +
+	0x07651d89, // c0x0152 (n0x1d89-n0x1d94)  +
+	0x07655d94, // c0x0153 (n0x1d94-n0x1d95)  +
+	0x07659d95, // c0x0154 (n0x1d95-n0x1d96)  +
+	0x07755d96, // c0x0155 (n0x1d96-n0x1dd5)  +
+	0x07761dd5, // c0x0156 (n0x1dd5-n0x1dd8)  +
+	0x0776ddd8, // c0x0157 (n0x1dd8-n0x1ddb)  +
+	0x07779ddb, // c0x0158 (n0x1ddb-n0x1dde)  +
+	0x07785dde, // c0x0159 (n0x1dde-n0x1de1)  +
+	0x07791de1, // c0x015a (n0x1de1-n0x1de4)  +
+	0x0779dde4, // c0x015b (n0x1de4-n0x1de7)  +
+	0x077a9de7, // c0x015c (n0x1de7-n0x1dea)  +
+	0x077b5dea, // c0x015d (n0x1dea-n0x1ded)  +
+	0x077c1ded, // c0x015e (n0x1ded-n0x1df0)  +
+	0x077cddf0, // c0x015f (n0x1df0-n0x1df3)  +
+	0x077d9df3, // c0x0160 (n0x1df3-n0x1df6)  +
+	0x077e5df6, // c0x0161 (n0x1df6-n0x1df9)  +
+	0x077f1df9, // c0x0162 (n0x1df9-n0x1dfc)  +
+	0x077f9dfc, // c0x0163 (n0x1dfc-n0x1dfe)  +
+	0x07805dfe, // c0x0164 (n0x1dfe-n0x1e01)  +
+	0x07811e01, // c0x0165 (n0x1e01-n0x1e04)  +
+	0x0781de04, // c0x0166 (n0x1e04-n0x1e07)  +
+	0x07829e07, // c0x0167 (n0x1e07-n0x1e0a)  +
+	0x07835e0a, // c0x0168 (n0x1e0a-n0x1e0d)  +
+	0x07841e0d, // c0x0169 (n0x1e0d-n0x1e10)  +
+	0x0784de10, // c0x016a (n0x1e10-n0x1e13)  +
+	0x07859e13, // c0x016b (n0x1e13-n0x1e16)  +
+	0x07865e16, // c0x016c (n0x1e16-n0x1e19)  +
+	0x07871e19, // c0x016d (n0x1e19-n0x1e1c)  +
+	0x0787de1c, // c0x016e (n0x1e1c-n0x1e1f)  +
+	0x07889e1f, // c0x016f (n0x1e1f-n0x1e22)  +
+	0x07895e22, // c0x0170 (n0x1e22-n0x1e25)  +
+	0x078a1e25, // c0x0171 (n0x1e25-n0x1e28)  +
+	0x078ade28, // c0x0172 (n0x1e28-n0x1e2b)  +
+	0x078b9e2b, // c0x0173 (n0x1e2b-n0x1e2e)  +
+	0x078c5e2e, // c0x0174 (n0x1e2e-n0x1e31)  +
+	0x078cde31, // c0x0175 (n0x1e31-n0x1e33)  +
+	0x078d9e33, // c0x0176 (n0x1e33-n0x1e36)  +
+	0x078e5e36, // c0x0177 (n0x1e36-n0x1e39)  +
+	0x078f1e39, // c0x0178 (n0x1e39-n0x1e3c)  +
+	0x078fde3c, // c0x0179 (n0x1e3c-n0x1e3f)  +
+	0x07909e3f, // c0x017a (n0x1e3f-n0x1e42)  +
+	0x07915e42, // c0x017b (n0x1e42-n0x1e45)  +
+	0x07921e45, // c0x017c (n0x1e45-n0x1e48)  +
+	0x0792de48, // c0x017d (n0x1e48-n0x1e4b)  +
+	0x07939e4b, // c0x017e (n0x1e4b-n0x1e4e)  +
+	0x07945e4e, // c0x017f (n0x1e4e-n0x1e51)  +
+	0x07951e51, // c0x0180 (n0x1e51-n0x1e54)  +
+	0x0795de54, // c0x0181 (n0x1e54-n0x1e57)  +
+	0x07969e57, // c0x0182 (n0x1e57-n0x1e5a)  +
+	0x07971e5a, // c0x0183 (n0x1e5a-n0x1e5c)  +
+	0x0797de5c, // c0x0184 (n0x1e5c-n0x1e5f)  +
+	0x07989e5f, // c0x0185 (n0x1e5f-n0x1e62)  +
+	0x07995e62, // c0x0186 (n0x1e62-n0x1e65)  +
+	0x079a1e65, // c0x0187 (n0x1e65-n0x1e68)  +
+	0x079ade68, // c0x0188 (n0x1e68-n0x1e6b)  +
+	0x079b9e6b, // c0x0189 (n0x1e6b-n0x1e6e)  +
+	0x079c5e6e, // c0x018a (n0x1e6e-n0x1e71)  +
+	0x079d1e71, // c0x018b (n0x1e71-n0x1e74)  +
+	0x079d5e74, // c0x018c (n0x1e74-n0x1e75)  +
+	0x079e1e75, // c0x018d (n0x1e75-n0x1e78)  +
+	0x079f9e78, // c0x018e (n0x1e78-n0x1e7e)  +
+	0x079fde7e, // c0x018f (n0x1e7e-n0x1e7f)  +
+	0x07a0de7f, // c0x0190 (n0x1e7f-n0x1e83)  +
+	0x07a25e83, // c0x0191 (n0x1e83-n0x1e89)  +
+	0x07a69e89, // c0x0192 (n0x1e89-n0x1e9a)  +
+	0x07a7de9a, // c0x0193 (n0x1e9a-n0x1e9f)  +
+	0x07ab1e9f, // c0x0194 (n0x1e9f-n0x1eac)  +
+	0x07ac1eac, // c0x0195 (n0x1eac-n0x1eb0)  +
+	0x07addeb0, // c0x0196 (n0x1eb0-n0x1eb7)  +
+	0x07af5eb7, // c0x0197 (n0x1eb7-n0x1ebd)  +
+	0x27b39ebd, // c0x0198 (n0x1ebd-n0x1ece)  o
+	0x07b3dece, // c0x0199 (n0x1ece-n0x1ecf)  +
+}
+
+// max children 409 (capacity 511)
+// max text offset 27059 (capacity 32767)
+// max text length 36 (capacity 63)
+// max hi 7887 (capacity 16383)
+// max lo 7886 (capacity 16383)
diff --git a/vendor/golang.org/x/net/trace/trace.go b/vendor/golang.org/x/net/trace/trace.go
index 9ee193627..dd67007d5 100644
--- a/vendor/golang.org/x/net/trace/trace.go
+++ b/vendor/golang.org/x/net/trace/trace.go
@@ -60,7 +60,7 @@ The /debug/events HTTP endpoint organizes the event logs by family and
 by time since the last error.  The expanded view displays recent log
 entries and the log's call stack.
 */
-package trace
+package trace // import "golang.org/x/net/trace"
 
 import (
 	"bytes"
diff --git a/vendor/golang.org/x/oauth2/.travis.yml b/vendor/golang.org/x/oauth2/.travis.yml
deleted file mode 100644
index a035125c3..000000000
--- a/vendor/golang.org/x/oauth2/.travis.yml
+++ /dev/null
@@ -1,14 +0,0 @@
-language: go
-
-go:
-  - 1.3
-  - 1.4
-
-install:
-  - export GOPATH="$HOME/gopath"
-  - mkdir -p "$GOPATH/src/golang.org/x"
-  - mv "$TRAVIS_BUILD_DIR" "$GOPATH/src/golang.org/x/oauth2"
-  - go get -v -t -d golang.org/x/oauth2/...
-
-script:
-  - go test -v golang.org/x/oauth2/...
diff --git a/vendor/golang.org/x/oauth2/AUTHORS b/vendor/golang.org/x/oauth2/AUTHORS
deleted file mode 100644
index 15167cd74..000000000
--- a/vendor/golang.org/x/oauth2/AUTHORS
+++ /dev/null
@@ -1,3 +0,0 @@
-# This source code refers to The Go Authors for copyright purposes.
-# The master list of authors is in the main Go distribution,
-# visible at http://tip.golang.org/AUTHORS.
diff --git a/vendor/golang.org/x/oauth2/CONTRIBUTING.md b/vendor/golang.org/x/oauth2/CONTRIBUTING.md
deleted file mode 100644
index 46aa2b12d..000000000
--- a/vendor/golang.org/x/oauth2/CONTRIBUTING.md
+++ /dev/null
@@ -1,31 +0,0 @@
-# Contributing to Go
-
-Go is an open source project.
-
-It is the work of hundreds of contributors. We appreciate your help!
-
-
-## Filing issues
-
-When [filing an issue](https://github.com/golang/oauth2/issues), make sure to answer these five questions:
-
-1. What version of Go are you using (`go version`)?
-2. What operating system and processor architecture are you using?
-3. What did you do?
-4. What did you expect to see?
-5. What did you see instead?
-
-General questions should go to the [golang-nuts mailing list](https://groups.google.com/group/golang-nuts) instead of the issue tracker.
-The gophers there will answer or ask you to file an issue if you've tripped over a bug.
-
-## Contributing code
-
-Please read the [Contribution Guidelines](https://golang.org/doc/contribute.html)
-before sending patches.
-
-**We do not accept GitHub pull requests**
-(we use [Gerrit](https://code.google.com/p/gerrit/) instead for code review).
-
-Unless otherwise noted, the Go source files are distributed under
-the BSD-style license found in the LICENSE file.
-
diff --git a/vendor/golang.org/x/oauth2/CONTRIBUTORS b/vendor/golang.org/x/oauth2/CONTRIBUTORS
deleted file mode 100644
index 1c4577e96..000000000
--- a/vendor/golang.org/x/oauth2/CONTRIBUTORS
+++ /dev/null
@@ -1,3 +0,0 @@
-# This source code was written by the Go contributors.
-# The master list of contributors is in the main Go distribution,
-# visible at http://tip.golang.org/CONTRIBUTORS.
diff --git a/vendor/golang.org/x/oauth2/README.md b/vendor/golang.org/x/oauth2/README.md
deleted file mode 100644
index 0d5141733..000000000
--- a/vendor/golang.org/x/oauth2/README.md
+++ /dev/null
@@ -1,64 +0,0 @@
-# OAuth2 for Go
-
-[![Build Status](https://travis-ci.org/golang/oauth2.svg?branch=master)](https://travis-ci.org/golang/oauth2)
-
-oauth2 package contains a client implementation for OAuth 2.0 spec.
-
-## Installation
-
-~~~~
-go get golang.org/x/oauth2
-~~~~
-
-See godoc for further documentation and examples.
-
-* [godoc.org/golang.org/x/oauth2](http://godoc.org/golang.org/x/oauth2)
-* [godoc.org/golang.org/x/oauth2/google](http://godoc.org/golang.org/x/oauth2/google)
-
-
-## App Engine
-
-In change 96e89be (March 2015) we removed the `oauth2.Context2` type in favor
-of the [`context.Context`](https://golang.org/x/net/context#Context) type from
-the `golang.org/x/net/context` package
-
-This means its no longer possible to use the "Classic App Engine"
-`appengine.Context` type with the `oauth2` package. (You're using
-Classic App Engine if you import the package `"appengine"`.)
-
-To work around this, you may use the new `"google.golang.org/appengine"`
-package. This package has almost the same API as the `"appengine"` package,
-but it can be fetched with `go get` and used on "Managed VMs" and well as
-Classic App Engine.
-
-See the [new `appengine` package's readme](https://github.com/golang/appengine#updating-a-go-app-engine-app)
-for information on updating your app.
-
-If you don't want to update your entire app to use the new App Engine packages,
-you may use both sets of packages in parallel, using only the new packages
-with the `oauth2` package.
-
-	import (
-		"golang.org/x/net/context"
-		"golang.org/x/oauth2"
-		"golang.org/x/oauth2/google"
-		newappengine "google.golang.org/appengine"
-		newurlfetch "google.golang.org/appengine/urlfetch"
-
-		"appengine"
-	)
-
-	func handler(w http.ResponseWriter, r *http.Request) {
-		var c appengine.Context = appengine.NewContext(r)
-		c.Infof("Logging a message with the old package")
-
-		var ctx context.Context = newappengine.NewContext(r)
-		client := &http.Client{
-			Transport: &oauth2.Transport{
-				Source: google.AppEngineTokenSource(ctx, "scope"),
-				Base:   &newurlfetch.Transport{Context: ctx},
-			},
-		}
-		client.Get("...")
-	}
-
diff --git a/vendor/golang.org/x/oauth2/google/google.go b/vendor/golang.org/x/oauth2/google/google.go
index 0bed73866..9a3d5feb1 100644
--- a/vendor/golang.org/x/oauth2/google/google.go
+++ b/vendor/golang.org/x/oauth2/google/google.go
@@ -12,7 +12,7 @@
 // https://developers.google.com/accounts/docs/OAuth2
 // and
 // https://developers.google.com/accounts/docs/application-default-credentials.
-package google
+package google // import "golang.org/x/oauth2/google"
 
 import (
 	"encoding/json"
diff --git a/vendor/golang.org/x/oauth2/jws/jws.go b/vendor/golang.org/x/oauth2/jws/jws.go
index b46edb27c..8ca597843 100644
--- a/vendor/golang.org/x/oauth2/jws/jws.go
+++ b/vendor/golang.org/x/oauth2/jws/jws.go
@@ -4,7 +4,7 @@
 
 // Package jws provides encoding and decoding utilities for
 // signed JWS messages.
-package jws
+package jws // import "golang.org/x/oauth2/jws"
 
 import (
 	"bytes"
diff --git a/vendor/golang.org/x/oauth2/oauth2.go b/vendor/golang.org/x/oauth2/oauth2.go
index 9b7b977da..a68289607 100644
--- a/vendor/golang.org/x/oauth2/oauth2.go
+++ b/vendor/golang.org/x/oauth2/oauth2.go
@@ -5,7 +5,7 @@
 // Package oauth2 provides support for making
 // OAuth2 authorized and authenticated HTTP requests.
 // It can additionally grant authorization with Bearer JWT.
-package oauth2
+package oauth2 // import "golang.org/x/oauth2"
 
 import (
 	"bytes"
diff --git a/vendor/google.golang.org/api/googleapi/googleapi.go b/vendor/google.golang.org/api/googleapi/googleapi.go
index 03e9acdd8..fd556730c 100644
--- a/vendor/google.golang.org/api/googleapi/googleapi.go
+++ b/vendor/google.golang.org/api/googleapi/googleapi.go
@@ -4,7 +4,7 @@
 
 // Package googleapi contains the common code shared by all Google API
 // libraries.
-package googleapi
+package googleapi // import "google.golang.org/api/googleapi"
 
 import (
 	"bytes"
diff --git a/vendor/google.golang.org/api/storage/v1/storage-api.json b/vendor/google.golang.org/api/storage/v1/storage-api.json
deleted file mode 100644
index 3768b4687..000000000
--- a/vendor/google.golang.org/api/storage/v1/storage-api.json
+++ /dev/null
@@ -1,2865 +0,0 @@
-{
- "kind": "discovery#restDescription",
- "etag": "\"bRFOOrZKfO9LweMbPqu0kcu6De8/KVPQfwGxQTBtH0g1kuij0C9i4uc\"",
- "discoveryVersion": "v1",
- "id": "storage:v1",
- "name": "storage",
- "version": "v1",
- "revision": "20160304",
- "title": "Cloud Storage JSON API",
- "description": "Stores and retrieves potentially large, immutable data objects.",
- "ownerDomain": "google.com",
- "ownerName": "Google",
- "icons": {
-  "x16": "https://www.google.com/images/icons/product/cloud_storage-16.png",
-  "x32": "https://www.google.com/images/icons/product/cloud_storage-32.png"
- },
- "documentationLink": "https://developers.google.com/storage/docs/json_api/",
- "labels": [
-  "labs"
- ],
- "protocol": "rest",
- "baseUrl": "https://www.googleapis.com/storage/v1/",
- "basePath": "/storage/v1/",
- "rootUrl": "https://www.googleapis.com/",
- "servicePath": "storage/v1/",
- "batchPath": "batch",
- "parameters": {
-  "alt": {
-   "type": "string",
-   "description": "Data format for the response.",
-   "default": "json",
-   "enum": [
-    "json"
-   ],
-   "enumDescriptions": [
-    "Responses with Content-Type of application/json"
-   ],
-   "location": "query"
-  },
-  "fields": {
-   "type": "string",
-   "description": "Selector specifying which fields to include in a partial response.",
-   "location": "query"
-  },
-  "key": {
-   "type": "string",
-   "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
-   "location": "query"
-  },
-  "oauth_token": {
-   "type": "string",
-   "description": "OAuth 2.0 token for the current user.",
-   "location": "query"
-  },
-  "prettyPrint": {
-   "type": "boolean",
-   "description": "Returns response with indentations and line breaks.",
-   "default": "true",
-   "location": "query"
-  },
-  "quotaUser": {
-   "type": "string",
-   "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.",
-   "location": "query"
-  },
-  "userIp": {
-   "type": "string",
-   "description": "IP address of the site where the request originates. Use this if you want to enforce per-user limits.",
-   "location": "query"
-  }
- },
- "auth": {
-  "oauth2": {
-   "scopes": {
-    "https://www.googleapis.com/auth/cloud-platform": {
-     "description": "View and manage your data across Google Cloud Platform services"
-    },
-    "https://www.googleapis.com/auth/cloud-platform.read-only": {
-     "description": "View your data across Google Cloud Platform services"
-    },
-    "https://www.googleapis.com/auth/devstorage.full_control": {
-     "description": "Manage your data and permissions in Google Cloud Storage"
-    },
-    "https://www.googleapis.com/auth/devstorage.read_only": {
-     "description": "View your data in Google Cloud Storage"
-    },
-    "https://www.googleapis.com/auth/devstorage.read_write": {
-     "description": "Manage your data in Google Cloud Storage"
-    }
-   }
-  }
- },
- "schemas": {
-  "Bucket": {
-   "id": "Bucket",
-   "type": "object",
-   "description": "A bucket.",
-   "properties": {
-    "acl": {
-     "type": "array",
-     "description": "Access controls on the bucket.",
-     "items": {
-      "$ref": "BucketAccessControl"
-     },
-     "annotations": {
-      "required": [
-       "storage.buckets.update"
-      ]
-     }
-    },
-    "cors": {
-     "type": "array",
-     "description": "The bucket's Cross-Origin Resource Sharing (CORS) configuration.",
-     "items": {
-      "type": "object",
-      "properties": {
-       "maxAgeSeconds": {
-        "type": "integer",
-        "description": "The value, in seconds, to return in the  Access-Control-Max-Age header used in preflight responses.",
-        "format": "int32"
-       },
-       "method": {
-        "type": "array",
-        "description": "The list of HTTP methods on which to include CORS response headers, (GET, OPTIONS, POST, etc) Note: \"*\" is permitted in the list of methods, and means \"any method\".",
-        "items": {
-         "type": "string"
-        }
-       },
-       "origin": {
-        "type": "array",
-        "description": "The list of Origins eligible to receive CORS response headers. Note: \"*\" is permitted in the list of origins, and means \"any Origin\".",
-        "items": {
-         "type": "string"
-        }
-       },
-       "responseHeader": {
-        "type": "array",
-        "description": "The list of HTTP headers other than the simple response headers to give permission for the user-agent to share across domains.",
-        "items": {
-         "type": "string"
-        }
-       }
-      }
-     }
-    },
-    "defaultObjectAcl": {
-     "type": "array",
-     "description": "Default access controls to apply to new objects when no ACL is provided.",
-     "items": {
-      "$ref": "ObjectAccessControl"
-     }
-    },
-    "etag": {
-     "type": "string",
-     "description": "HTTP 1.1 Entity tag for the bucket."
-    },
-    "id": {
-     "type": "string",
-     "description": "The ID of the bucket."
-    },
-    "kind": {
-     "type": "string",
-     "description": "The kind of item this is. For buckets, this is always storage#bucket.",
-     "default": "storage#bucket"
-    },
-    "lifecycle": {
-     "type": "object",
-     "description": "The bucket's lifecycle configuration. See lifecycle management for more information.",
-     "properties": {
-      "rule": {
-       "type": "array",
-       "description": "A lifecycle management rule, which is made of an action to take and the condition(s) under which the action will be taken.",
-       "items": {
-        "type": "object",
-        "properties": {
-         "action": {
-          "type": "object",
-          "description": "The action to take.",
-          "properties": {
-           "type": {
-            "type": "string",
-            "description": "Type of the action. Currently, only Delete is supported."
-           }
-          }
-         },
-         "condition": {
-          "type": "object",
-          "description": "The condition(s) under which the action will be taken.",
-          "properties": {
-           "age": {
-            "type": "integer",
-            "description": "Age of an object (in days). This condition is satisfied when an object reaches the specified age.",
-            "format": "int32"
-           },
-           "createdBefore": {
-            "type": "string",
-            "description": "A date in RFC 3339 format with only the date part (for instance, \"2013-01-15\"). This condition is satisfied when an object is created before midnight of the specified date in UTC.",
-            "format": "date"
-           },
-           "isLive": {
-            "type": "boolean",
-            "description": "Relevant only for versioned objects. If the value is true, this condition matches live objects; if the value is false, it matches archived objects."
-           },
-           "numNewerVersions": {
-            "type": "integer",
-            "description": "Relevant only for versioned objects. If the value is N, this condition is satisfied when there are at least N versions (including the live version) newer than this version of the object.",
-            "format": "int32"
-           }
-          }
-         }
-        }
-       }
-      }
-     }
-    },
-    "location": {
-     "type": "string",
-     "description": "The location of the bucket. Object data for objects in the bucket resides in physical storage within this region. Defaults to US. See the developer's guide for the authoritative list."
-    },
-    "logging": {
-     "type": "object",
-     "description": "The bucket's logging configuration, which defines the destination bucket and optional name prefix for the current bucket's logs.",
-     "properties": {
-      "logBucket": {
-       "type": "string",
-       "description": "The destination bucket where the current bucket's logs should be placed."
-      },
-      "logObjectPrefix": {
-       "type": "string",
-       "description": "A prefix for log object names."
-      }
-     }
-    },
-    "metageneration": {
-     "type": "string",
-     "description": "The metadata generation of this bucket.",
-     "format": "int64"
-    },
-    "name": {
-     "type": "string",
-     "description": "The name of the bucket.",
-     "annotations": {
-      "required": [
-       "storage.buckets.insert"
-      ]
-     }
-    },
-    "owner": {
-     "type": "object",
-     "description": "The owner of the bucket. This is always the project team's owner group.",
-     "properties": {
-      "entity": {
-       "type": "string",
-       "description": "The entity, in the form project-owner-projectId."
-      },
-      "entityId": {
-       "type": "string",
-       "description": "The ID for the entity."
-      }
-     }
-    },
-    "projectNumber": {
-     "type": "string",
-     "description": "The project number of the project the bucket belongs to.",
-     "format": "uint64"
-    },
-    "selfLink": {
-     "type": "string",
-     "description": "The URI of this bucket."
-    },
-    "storageClass": {
-     "type": "string",
-     "description": "The bucket's storage class. This defines how objects in the bucket are stored and determines the SLA and the cost of storage. Values include STANDARD, NEARLINE and DURABLE_REDUCED_AVAILABILITY. Defaults to STANDARD. For more information, see storage classes."
-    },
-    "timeCreated": {
-     "type": "string",
-     "description": "The creation time of the bucket in RFC 3339 format.",
-     "format": "date-time"
-    },
-    "updated": {
-     "type": "string",
-     "description": "The modification time of the bucket in RFC 3339 format.",
-     "format": "date-time"
-    },
-    "versioning": {
-     "type": "object",
-     "description": "The bucket's versioning configuration.",
-     "properties": {
-      "enabled": {
-       "type": "boolean",
-       "description": "While set to true, versioning is fully enabled for this bucket."
-      }
-     }
-    },
-    "website": {
-     "type": "object",
-     "description": "The bucket's website configuration.",
-     "properties": {
-      "mainPageSuffix": {
-       "type": "string",
-       "description": "Behaves as the bucket's directory index where missing objects are treated as potential directories."
-      },
-      "notFoundPage": {
-       "type": "string",
-       "description": "The custom object to return when a requested resource is not found."
-      }
-     }
-    }
-   }
-  },
-  "BucketAccessControl": {
-   "id": "BucketAccessControl",
-   "type": "object",
-   "description": "An access-control entry.",
-   "properties": {
-    "bucket": {
-     "type": "string",
-     "description": "The name of the bucket."
-    },
-    "domain": {
-     "type": "string",
-     "description": "The domain associated with the entity, if any."
-    },
-    "email": {
-     "type": "string",
-     "description": "The email address associated with the entity, if any."
-    },
-    "entity": {
-     "type": "string",
-     "description": "The entity holding the permission, in one of the following forms: \n- user-userId \n- user-email \n- group-groupId \n- group-email \n- domain-domain \n- project-team-projectId \n- allUsers \n- allAuthenticatedUsers Examples: \n- The user liz@example.com would be user-liz@example.com. \n- The group example@googlegroups.com would be group-example@googlegroups.com. \n- To refer to all members of the Google Apps for Business domain example.com, the entity would be domain-example.com.",
-     "annotations": {
-      "required": [
-       "storage.bucketAccessControls.insert"
-      ]
-     }
-    },
-    "entityId": {
-     "type": "string",
-     "description": "The ID for the entity, if any."
-    },
-    "etag": {
-     "type": "string",
-     "description": "HTTP 1.1 Entity tag for the access-control entry."
-    },
-    "id": {
-     "type": "string",
-     "description": "The ID of the access-control entry."
-    },
-    "kind": {
-     "type": "string",
-     "description": "The kind of item this is. For bucket access control entries, this is always storage#bucketAccessControl.",
-     "default": "storage#bucketAccessControl"
-    },
-    "projectTeam": {
-     "type": "object",
-     "description": "The project team associated with the entity, if any.",
-     "properties": {
-      "projectNumber": {
-       "type": "string",
-       "description": "The project number."
-      },
-      "team": {
-       "type": "string",
-       "description": "The team. Can be owners, editors, or viewers."
-      }
-     }
-    },
-    "role": {
-     "type": "string",
-     "description": "The access permission for the entity. Can be READER, WRITER, or OWNER.",
-     "annotations": {
-      "required": [
-       "storage.bucketAccessControls.insert"
-      ]
-     }
-    },
-    "selfLink": {
-     "type": "string",
-     "description": "The link to this access-control entry."
-    }
-   }
-  },
-  "BucketAccessControls": {
-   "id": "BucketAccessControls",
-   "type": "object",
-   "description": "An access-control list.",
-   "properties": {
-    "items": {
-     "type": "array",
-     "description": "The list of items.",
-     "items": {
-      "$ref": "BucketAccessControl"
-     }
-    },
-    "kind": {
-     "type": "string",
-     "description": "The kind of item this is. For lists of bucket access control entries, this is always storage#bucketAccessControls.",
-     "default": "storage#bucketAccessControls"
-    }
-   }
-  },
-  "Buckets": {
-   "id": "Buckets",
-   "type": "object",
-   "description": "A list of buckets.",
-   "properties": {
-    "items": {
-     "type": "array",
-     "description": "The list of items.",
-     "items": {
-      "$ref": "Bucket"
-     }
-    },
-    "kind": {
-     "type": "string",
-     "description": "The kind of item this is. For lists of buckets, this is always storage#buckets.",
-     "default": "storage#buckets"
-    },
-    "nextPageToken": {
-     "type": "string",
-     "description": "The continuation token, used to page through large result sets. Provide this value in a subsequent request to return the next page of results."
-    }
-   }
-  },
-  "Channel": {
-   "id": "Channel",
-   "type": "object",
-   "description": "An notification channel used to watch for resource changes.",
-   "properties": {
-    "address": {
-     "type": "string",
-     "description": "The address where notifications are delivered for this channel."
-    },
-    "expiration": {
-     "type": "string",
-     "description": "Date and time of notification channel expiration, expressed as a Unix timestamp, in milliseconds. Optional.",
-     "format": "int64"
-    },
-    "id": {
-     "type": "string",
-     "description": "A UUID or similar unique string that identifies this channel."
-    },
-    "kind": {
-     "type": "string",
-     "description": "Identifies this as a notification channel used to watch for changes to a resource. Value: the fixed string \"api#channel\".",
-     "default": "api#channel"
-    },
-    "params": {
-     "type": "object",
-     "description": "Additional parameters controlling delivery channel behavior. Optional.",
-     "additionalProperties": {
-      "type": "string",
-      "description": "Declares a new parameter by name."
-     }
-    },
-    "payload": {
-     "type": "boolean",
-     "description": "A Boolean value to indicate whether payload is wanted. Optional."
-    },
-    "resourceId": {
-     "type": "string",
-     "description": "An opaque ID that identifies the resource being watched on this channel. Stable across different API versions."
-    },
-    "resourceUri": {
-     "type": "string",
-     "description": "A version-specific identifier for the watched resource."
-    },
-    "token": {
-     "type": "string",
-     "description": "An arbitrary string delivered to the target address with each notification delivered over this channel. Optional."
-    },
-    "type": {
-     "type": "string",
-     "description": "The type of delivery mechanism used for this channel."
-    }
-   }
-  },
-  "ComposeRequest": {
-   "id": "ComposeRequest",
-   "type": "object",
-   "description": "A Compose request.",
-   "properties": {
-    "destination": {
-     "$ref": "Object",
-     "description": "Properties of the resulting object."
-    },
-    "kind": {
-     "type": "string",
-     "description": "The kind of item this is.",
-     "default": "storage#composeRequest"
-    },
-    "sourceObjects": {
-     "type": "array",
-     "description": "The list of source objects that will be concatenated into a single object.",
-     "items": {
-      "type": "object",
-      "properties": {
-       "generation": {
-        "type": "string",
-        "description": "The generation of this object to use as the source.",
-        "format": "int64"
-       },
-       "name": {
-        "type": "string",
-        "description": "The source object's name. The source object's bucket is implicitly the destination bucket.",
-        "annotations": {
-         "required": [
-          "storage.objects.compose"
-         ]
-        }
-       },
-       "objectPreconditions": {
-        "type": "object",
-        "description": "Conditions that must be met for this operation to execute.",
-        "properties": {
-         "ifGenerationMatch": {
-          "type": "string",
-          "description": "Only perform the composition if the generation of the source object that would be used matches this value. If this value and a generation are both specified, they must be the same value or the call will fail.",
-          "format": "int64"
-         }
-        }
-       }
-      }
-     },
-     "annotations": {
-      "required": [
-       "storage.objects.compose"
-      ]
-     }
-    }
-   }
-  },
-  "Object": {
-   "id": "Object",
-   "type": "object",
-   "description": "An object.",
-   "properties": {
-    "acl": {
-     "type": "array",
-     "description": "Access controls on the object.",
-     "items": {
-      "$ref": "ObjectAccessControl"
-     },
-     "annotations": {
-      "required": [
-       "storage.objects.update"
-      ]
-     }
-    },
-    "bucket": {
-     "type": "string",
-     "description": "The name of the bucket containing this object."
-    },
-    "cacheControl": {
-     "type": "string",
-     "description": "Cache-Control directive for the object data."
-    },
-    "componentCount": {
-     "type": "integer",
-     "description": "Number of underlying components that make up this object. Components are accumulated by compose operations.",
-     "format": "int32"
-    },
-    "contentDisposition": {
-     "type": "string",
-     "description": "Content-Disposition of the object data."
-    },
-    "contentEncoding": {
-     "type": "string",
-     "description": "Content-Encoding of the object data."
-    },
-    "contentLanguage": {
-     "type": "string",
-     "description": "Content-Language of the object data."
-    },
-    "contentType": {
-     "type": "string",
-     "description": "Content-Type of the object data."
-    },
-    "crc32c": {
-     "type": "string",
-     "description": "CRC32c checksum, as described in RFC 4960, Appendix B; encoded using base64 in big-endian byte order. For more information about using the CRC32c checksum, see Hashes and ETags: Best Practices."
-    },
-    "customerEncryption": {
-     "type": "object",
-     "description": "Metadata of customer-supplied encryption key, if the object is encrypted by such a key.",
-     "properties": {
-      "encryptionAlgorithm": {
-       "type": "string",
-       "description": "The encryption algorithm."
-      },
-      "keySha256": {
-       "type": "string",
-       "description": "SHA256 hash value of the encryption key."
-      }
-     }
-    },
-    "etag": {
-     "type": "string",
-     "description": "HTTP 1.1 Entity tag for the object."
-    },
-    "generation": {
-     "type": "string",
-     "description": "The content generation of this object. Used for object versioning.",
-     "format": "int64"
-    },
-    "id": {
-     "type": "string",
-     "description": "The ID of the object."
-    },
-    "kind": {
-     "type": "string",
-     "description": "The kind of item this is. For objects, this is always storage#object.",
-     "default": "storage#object"
-    },
-    "md5Hash": {
-     "type": "string",
-     "description": "MD5 hash of the data; encoded using base64. For more information about using the MD5 hash, see Hashes and ETags: Best Practices."
-    },
-    "mediaLink": {
-     "type": "string",
-     "description": "Media download link."
-    },
-    "metadata": {
-     "type": "object",
-     "description": "User-provided metadata, in key/value pairs.",
-     "additionalProperties": {
-      "type": "string",
-      "description": "An individual metadata entry."
-     }
-    },
-    "metageneration": {
-     "type": "string",
-     "description": "The version of the metadata for this object at this generation. Used for preconditions and for detecting changes in metadata. A metageneration number is only meaningful in the context of a particular generation of a particular object.",
-     "format": "int64"
-    },
-    "name": {
-     "type": "string",
-     "description": "The name of this object. Required if not specified by URL parameter."
-    },
-    "owner": {
-     "type": "object",
-     "description": "The owner of the object. This will always be the uploader of the object.",
-     "properties": {
-      "entity": {
-       "type": "string",
-       "description": "The entity, in the form user-userId."
-      },
-      "entityId": {
-       "type": "string",
-       "description": "The ID for the entity."
-      }
-     }
-    },
-    "selfLink": {
-     "type": "string",
-     "description": "The link to this object."
-    },
-    "size": {
-     "type": "string",
-     "description": "Content-Length of the data in bytes.",
-     "format": "uint64"
-    },
-    "storageClass": {
-     "type": "string",
-     "description": "Storage class of the object."
-    },
-    "timeCreated": {
-     "type": "string",
-     "description": "The creation time of the object in RFC 3339 format.",
-     "format": "date-time"
-    },
-    "timeDeleted": {
-     "type": "string",
-     "description": "The deletion time of the object in RFC 3339 format. Will be returned if and only if this version of the object has been deleted.",
-     "format": "date-time"
-    },
-    "updated": {
-     "type": "string",
-     "description": "The modification time of the object metadata in RFC 3339 format.",
-     "format": "date-time"
-    }
-   }
-  },
-  "ObjectAccessControl": {
-   "id": "ObjectAccessControl",
-   "type": "object",
-   "description": "An access-control entry.",
-   "properties": {
-    "bucket": {
-     "type": "string",
-     "description": "The name of the bucket."
-    },
-    "domain": {
-     "type": "string",
-     "description": "The domain associated with the entity, if any."
-    },
-    "email": {
-     "type": "string",
-     "description": "The email address associated with the entity, if any."
-    },
-    "entity": {
-     "type": "string",
-     "description": "The entity holding the permission, in one of the following forms: \n- user-userId \n- user-email \n- group-groupId \n- group-email \n- domain-domain \n- project-team-projectId \n- allUsers \n- allAuthenticatedUsers Examples: \n- The user liz@example.com would be user-liz@example.com. \n- The group example@googlegroups.com would be group-example@googlegroups.com. \n- To refer to all members of the Google Apps for Business domain example.com, the entity would be domain-example.com."
-    },
-    "entityId": {
-     "type": "string",
-     "description": "The ID for the entity, if any."
-    },
-    "etag": {
-     "type": "string",
-     "description": "HTTP 1.1 Entity tag for the access-control entry."
-    },
-    "generation": {
-     "type": "string",
-     "description": "The content generation of the object.",
-     "format": "int64"
-    },
-    "id": {
-     "type": "string",
-     "description": "The ID of the access-control entry."
-    },
-    "kind": {
-     "type": "string",
-     "description": "The kind of item this is. For object access control entries, this is always storage#objectAccessControl.",
-     "default": "storage#objectAccessControl"
-    },
-    "object": {
-     "type": "string",
-     "description": "The name of the object."
-    },
-    "projectTeam": {
-     "type": "object",
-     "description": "The project team associated with the entity, if any.",
-     "properties": {
-      "projectNumber": {
-       "type": "string",
-       "description": "The project number."
-      },
-      "team": {
-       "type": "string",
-       "description": "The team. Can be owners, editors, or viewers."
-      }
-     }
-    },
-    "role": {
-     "type": "string",
-     "description": "The access permission for the entity. Can be READER or OWNER."
-    },
-    "selfLink": {
-     "type": "string",
-     "description": "The link to this access-control entry."
-    }
-   }
-  },
-  "ObjectAccessControls": {
-   "id": "ObjectAccessControls",
-   "type": "object",
-   "description": "An access-control list.",
-   "properties": {
-    "items": {
-     "type": "array",
-     "description": "The list of items.",
-     "items": {
-      "type": "any"
-     }
-    },
-    "kind": {
-     "type": "string",
-     "description": "The kind of item this is. For lists of object access control entries, this is always storage#objectAccessControls.",
-     "default": "storage#objectAccessControls"
-    }
-   }
-  },
-  "Objects": {
-   "id": "Objects",
-   "type": "object",
-   "description": "A list of objects.",
-   "properties": {
-    "items": {
-     "type": "array",
-     "description": "The list of items.",
-     "items": {
-      "$ref": "Object"
-     }
-    },
-    "kind": {
-     "type": "string",
-     "description": "The kind of item this is. For lists of objects, this is always storage#objects.",
-     "default": "storage#objects"
-    },
-    "nextPageToken": {
-     "type": "string",
-     "description": "The continuation token, used to page through large result sets. Provide this value in a subsequent request to return the next page of results."
-    },
-    "prefixes": {
-     "type": "array",
-     "description": "The list of prefixes of objects matching-but-not-listed up to and including the requested delimiter.",
-     "items": {
-      "type": "string"
-     }
-    }
-   }
-  },
-  "RewriteResponse": {
-   "id": "RewriteResponse",
-   "type": "object",
-   "description": "A rewrite response.",
-   "properties": {
-    "done": {
-     "type": "boolean",
-     "description": "true if the copy is finished; otherwise, false if the copy is in progress. This property is always present in the response."
-    },
-    "kind": {
-     "type": "string",
-     "description": "The kind of item this is.",
-     "default": "storage#rewriteResponse"
-    },
-    "objectSize": {
-     "type": "string",
-     "description": "The total size of the object being copied in bytes. This property is always present in the response.",
-     "format": "uint64"
-    },
-    "resource": {
-     "$ref": "Object",
-     "description": "A resource containing the metadata for the copied-to object. This property is present in the response only when copying completes."
-    },
-    "rewriteToken": {
-     "type": "string",
-     "description": "A token to use in subsequent requests to continue copying data. This token is present in the response only when there is more data to copy."
-    },
-    "totalBytesRewritten": {
-     "type": "string",
-     "description": "The total bytes written so far, which can be used to provide a waiting user with a progress indicator. This property is always present in the response.",
-     "format": "uint64"
-    }
-   }
-  }
- },
- "resources": {
-  "bucketAccessControls": {
-   "methods": {
-    "delete": {
-     "id": "storage.bucketAccessControls.delete",
-     "path": "b/{bucket}/acl/{entity}",
-     "httpMethod": "DELETE",
-     "description": "Permanently deletes the ACL entry for the specified entity on the specified bucket.",
-     "parameters": {
-      "bucket": {
-       "type": "string",
-       "description": "Name of a bucket.",
-       "required": true,
-       "location": "path"
-      },
-      "entity": {
-       "type": "string",
-       "description": "The entity holding the permission. Can be user-userId, user-emailAddress, group-groupId, group-emailAddress, allUsers, or allAuthenticatedUsers.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "bucket",
-      "entity"
-     ],
-     "scopes": [
-      "https://www.googleapis.com/auth/cloud-platform",
-      "https://www.googleapis.com/auth/devstorage.full_control"
-     ]
-    },
-    "get": {
-     "id": "storage.bucketAccessControls.get",
-     "path": "b/{bucket}/acl/{entity}",
-     "httpMethod": "GET",
-     "description": "Returns the ACL entry for the specified entity on the specified bucket.",
-     "parameters": {
-      "bucket": {
-       "type": "string",
-       "description": "Name of a bucket.",
-       "required": true,
-       "location": "path"
-      },
-      "entity": {
-       "type": "string",
-       "description": "The entity holding the permission. Can be user-userId, user-emailAddress, group-groupId, group-emailAddress, allUsers, or allAuthenticatedUsers.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "bucket",
-      "entity"
-     ],
-     "response": {
-      "$ref": "BucketAccessControl"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/cloud-platform",
-      "https://www.googleapis.com/auth/devstorage.full_control"
-     ]
-    },
-    "insert": {
-     "id": "storage.bucketAccessControls.insert",
-     "path": "b/{bucket}/acl",
-     "httpMethod": "POST",
-     "description": "Creates a new ACL entry on the specified bucket.",
-     "parameters": {
-      "bucket": {
-       "type": "string",
-       "description": "Name of a bucket.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "bucket"
-     ],
-     "request": {
-      "$ref": "BucketAccessControl"
-     },
-     "response": {
-      "$ref": "BucketAccessControl"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/cloud-platform",
-      "https://www.googleapis.com/auth/devstorage.full_control"
-     ]
-    },
-    "list": {
-     "id": "storage.bucketAccessControls.list",
-     "path": "b/{bucket}/acl",
-     "httpMethod": "GET",
-     "description": "Retrieves ACL entries on the specified bucket.",
-     "parameters": {
-      "bucket": {
-       "type": "string",
-       "description": "Name of a bucket.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "bucket"
-     ],
-     "response": {
-      "$ref": "BucketAccessControls"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/cloud-platform",
-      "https://www.googleapis.com/auth/devstorage.full_control"
-     ]
-    },
-    "patch": {
-     "id": "storage.bucketAccessControls.patch",
-     "path": "b/{bucket}/acl/{entity}",
-     "httpMethod": "PATCH",
-     "description": "Updates an ACL entry on the specified bucket. This method supports patch semantics.",
-     "parameters": {
-      "bucket": {
-       "type": "string",
-       "description": "Name of a bucket.",
-       "required": true,
-       "location": "path"
-      },
-      "entity": {
-       "type": "string",
-       "description": "The entity holding the permission. Can be user-userId, user-emailAddress, group-groupId, group-emailAddress, allUsers, or allAuthenticatedUsers.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "bucket",
-      "entity"
-     ],
-     "request": {
-      "$ref": "BucketAccessControl"
-     },
-     "response": {
-      "$ref": "BucketAccessControl"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/cloud-platform",
-      "https://www.googleapis.com/auth/devstorage.full_control"
-     ]
-    },
-    "update": {
-     "id": "storage.bucketAccessControls.update",
-     "path": "b/{bucket}/acl/{entity}",
-     "httpMethod": "PUT",
-     "description": "Updates an ACL entry on the specified bucket.",
-     "parameters": {
-      "bucket": {
-       "type": "string",
-       "description": "Name of a bucket.",
-       "required": true,
-       "location": "path"
-      },
-      "entity": {
-       "type": "string",
-       "description": "The entity holding the permission. Can be user-userId, user-emailAddress, group-groupId, group-emailAddress, allUsers, or allAuthenticatedUsers.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "bucket",
-      "entity"
-     ],
-     "request": {
-      "$ref": "BucketAccessControl"
-     },
-     "response": {
-      "$ref": "BucketAccessControl"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/cloud-platform",
-      "https://www.googleapis.com/auth/devstorage.full_control"
-     ]
-    }
-   }
-  },
-  "buckets": {
-   "methods": {
-    "delete": {
-     "id": "storage.buckets.delete",
-     "path": "b/{bucket}",
-     "httpMethod": "DELETE",
-     "description": "Permanently deletes an empty bucket.",
-     "parameters": {
-      "bucket": {
-       "type": "string",
-       "description": "Name of a bucket.",
-       "required": true,
-       "location": "path"
-      },
-      "ifMetagenerationMatch": {
-       "type": "string",
-       "description": "If set, only deletes the bucket if its metageneration matches this value.",
-       "format": "int64",
-       "location": "query"
-      },
-      "ifMetagenerationNotMatch": {
-       "type": "string",
-       "description": "If set, only deletes the bucket if its metageneration does not match this value.",
-       "format": "int64",
-       "location": "query"
-      }
-     },
-     "parameterOrder": [
-      "bucket"
-     ],
-     "scopes": [
-      "https://www.googleapis.com/auth/cloud-platform",
-      "https://www.googleapis.com/auth/devstorage.full_control",
-      "https://www.googleapis.com/auth/devstorage.read_write"
-     ]
-    },
-    "get": {
-     "id": "storage.buckets.get",
-     "path": "b/{bucket}",
-     "httpMethod": "GET",
-     "description": "Returns metadata for the specified bucket.",
-     "parameters": {
-      "bucket": {
-       "type": "string",
-       "description": "Name of a bucket.",
-       "required": true,
-       "location": "path"
-      },
-      "ifMetagenerationMatch": {
-       "type": "string",
-       "description": "Makes the return of the bucket metadata conditional on whether the bucket's current metageneration matches the given value.",
-       "format": "int64",
-       "location": "query"
-      },
-      "ifMetagenerationNotMatch": {
-       "type": "string",
-       "description": "Makes the return of the bucket metadata conditional on whether the bucket's current metageneration does not match the given value.",
-       "format": "int64",
-       "location": "query"
-      },
-      "projection": {
-       "type": "string",
-       "description": "Set of properties to return. Defaults to noAcl.",
-       "enum": [
-        "full",
-        "noAcl"
-       ],
-       "enumDescriptions": [
-        "Include all properties.",
-        "Omit acl and defaultObjectAcl properties."
-       ],
-       "location": "query"
-      }
-     },
-     "parameterOrder": [
-      "bucket"
-     ],
-     "response": {
-      "$ref": "Bucket"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/cloud-platform",
-      "https://www.googleapis.com/auth/cloud-platform.read-only",
-      "https://www.googleapis.com/auth/devstorage.full_control",
-      "https://www.googleapis.com/auth/devstorage.read_only",
-      "https://www.googleapis.com/auth/devstorage.read_write"
-     ]
-    },
-    "insert": {
-     "id": "storage.buckets.insert",
-     "path": "b",
-     "httpMethod": "POST",
-     "description": "Creates a new bucket.",
-     "parameters": {
-      "predefinedAcl": {
-       "type": "string",
-       "description": "Apply a predefined set of access controls to this bucket.",
-       "enum": [
-        "authenticatedRead",
-        "private",
-        "projectPrivate",
-        "publicRead",
-        "publicReadWrite"
-       ],
-       "enumDescriptions": [
-        "Project team owners get OWNER access, and allAuthenticatedUsers get READER access.",
-        "Project team owners get OWNER access.",
-        "Project team members get access according to their roles.",
-        "Project team owners get OWNER access, and allUsers get READER access.",
-        "Project team owners get OWNER access, and allUsers get WRITER access."
-       ],
-       "location": "query"
-      },
-      "predefinedDefaultObjectAcl": {
-       "type": "string",
-       "description": "Apply a predefined set of default object access controls to this bucket.",
-       "enum": [
-        "authenticatedRead",
-        "bucketOwnerFullControl",
-        "bucketOwnerRead",
-        "private",
-        "projectPrivate",
-        "publicRead"
-       ],
-       "enumDescriptions": [
-        "Object owner gets OWNER access, and allAuthenticatedUsers get READER access.",
-        "Object owner gets OWNER access, and project team owners get OWNER access.",
-        "Object owner gets OWNER access, and project team owners get READER access.",
-        "Object owner gets OWNER access.",
-        "Object owner gets OWNER access, and project team members get access according to their roles.",
-        "Object owner gets OWNER access, and allUsers get READER access."
-       ],
-       "location": "query"
-      },
-      "project": {
-       "type": "string",
-       "description": "A valid API project identifier.",
-       "required": true,
-       "location": "query"
-      },
-      "projection": {
-       "type": "string",
-       "description": "Set of properties to return. Defaults to noAcl, unless the bucket resource specifies acl or defaultObjectAcl properties, when it defaults to full.",
-       "enum": [
-        "full",
-        "noAcl"
-       ],
-       "enumDescriptions": [
-        "Include all properties.",
-        "Omit acl and defaultObjectAcl properties."
-       ],
-       "location": "query"
-      }
-     },
-     "parameterOrder": [
-      "project"
-     ],
-     "request": {
-      "$ref": "Bucket"
-     },
-     "response": {
-      "$ref": "Bucket"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/cloud-platform",
-      "https://www.googleapis.com/auth/devstorage.full_control",
-      "https://www.googleapis.com/auth/devstorage.read_write"
-     ]
-    },
-    "list": {
-     "id": "storage.buckets.list",
-     "path": "b",
-     "httpMethod": "GET",
-     "description": "Retrieves a list of buckets for a given project.",
-     "parameters": {
-      "maxResults": {
-       "type": "integer",
-       "description": "Maximum number of buckets to return.",
-       "format": "uint32",
-       "minimum": "0",
-       "location": "query"
-      },
-      "pageToken": {
-       "type": "string",
-       "description": "A previously-returned page token representing part of the larger set of results to view.",
-       "location": "query"
-      },
-      "prefix": {
-       "type": "string",
-       "description": "Filter results to buckets whose names begin with this prefix.",
-       "location": "query"
-      },
-      "project": {
-       "type": "string",
-       "description": "A valid API project identifier.",
-       "required": true,
-       "location": "query"
-      },
-      "projection": {
-       "type": "string",
-       "description": "Set of properties to return. Defaults to noAcl.",
-       "enum": [
-        "full",
-        "noAcl"
-       ],
-       "enumDescriptions": [
-        "Include all properties.",
-        "Omit acl and defaultObjectAcl properties."
-       ],
-       "location": "query"
-      }
-     },
-     "parameterOrder": [
-      "project"
-     ],
-     "response": {
-      "$ref": "Buckets"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/cloud-platform",
-      "https://www.googleapis.com/auth/cloud-platform.read-only",
-      "https://www.googleapis.com/auth/devstorage.full_control",
-      "https://www.googleapis.com/auth/devstorage.read_only",
-      "https://www.googleapis.com/auth/devstorage.read_write"
-     ]
-    },
-    "patch": {
-     "id": "storage.buckets.patch",
-     "path": "b/{bucket}",
-     "httpMethod": "PATCH",
-     "description": "Updates a bucket. This method supports patch semantics.",
-     "parameters": {
-      "bucket": {
-       "type": "string",
-       "description": "Name of a bucket.",
-       "required": true,
-       "location": "path"
-      },
-      "ifMetagenerationMatch": {
-       "type": "string",
-       "description": "Makes the return of the bucket metadata conditional on whether the bucket's current metageneration matches the given value.",
-       "format": "int64",
-       "location": "query"
-      },
-      "ifMetagenerationNotMatch": {
-       "type": "string",
-       "description": "Makes the return of the bucket metadata conditional on whether the bucket's current metageneration does not match the given value.",
-       "format": "int64",
-       "location": "query"
-      },
-      "predefinedAcl": {
-       "type": "string",
-       "description": "Apply a predefined set of access controls to this bucket.",
-       "enum": [
-        "authenticatedRead",
-        "private",
-        "projectPrivate",
-        "publicRead",
-        "publicReadWrite"
-       ],
-       "enumDescriptions": [
-        "Project team owners get OWNER access, and allAuthenticatedUsers get READER access.",
-        "Project team owners get OWNER access.",
-        "Project team members get access according to their roles.",
-        "Project team owners get OWNER access, and allUsers get READER access.",
-        "Project team owners get OWNER access, and allUsers get WRITER access."
-       ],
-       "location": "query"
-      },
-      "predefinedDefaultObjectAcl": {
-       "type": "string",
-       "description": "Apply a predefined set of default object access controls to this bucket.",
-       "enum": [
-        "authenticatedRead",
-        "bucketOwnerFullControl",
-        "bucketOwnerRead",
-        "private",
-        "projectPrivate",
-        "publicRead"
-       ],
-       "enumDescriptions": [
-        "Object owner gets OWNER access, and allAuthenticatedUsers get READER access.",
-        "Object owner gets OWNER access, and project team owners get OWNER access.",
-        "Object owner gets OWNER access, and project team owners get READER access.",
-        "Object owner gets OWNER access.",
-        "Object owner gets OWNER access, and project team members get access according to their roles.",
-        "Object owner gets OWNER access, and allUsers get READER access."
-       ],
-       "location": "query"
-      },
-      "projection": {
-       "type": "string",
-       "description": "Set of properties to return. Defaults to full.",
-       "enum": [
-        "full",
-        "noAcl"
-       ],
-       "enumDescriptions": [
-        "Include all properties.",
-        "Omit acl and defaultObjectAcl properties."
-       ],
-       "location": "query"
-      }
-     },
-     "parameterOrder": [
-      "bucket"
-     ],
-     "request": {
-      "$ref": "Bucket"
-     },
-     "response": {
-      "$ref": "Bucket"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/cloud-platform",
-      "https://www.googleapis.com/auth/devstorage.full_control",
-      "https://www.googleapis.com/auth/devstorage.read_write"
-     ]
-    },
-    "update": {
-     "id": "storage.buckets.update",
-     "path": "b/{bucket}",
-     "httpMethod": "PUT",
-     "description": "Updates a bucket.",
-     "parameters": {
-      "bucket": {
-       "type": "string",
-       "description": "Name of a bucket.",
-       "required": true,
-       "location": "path"
-      },
-      "ifMetagenerationMatch": {
-       "type": "string",
-       "description": "Makes the return of the bucket metadata conditional on whether the bucket's current metageneration matches the given value.",
-       "format": "int64",
-       "location": "query"
-      },
-      "ifMetagenerationNotMatch": {
-       "type": "string",
-       "description": "Makes the return of the bucket metadata conditional on whether the bucket's current metageneration does not match the given value.",
-       "format": "int64",
-       "location": "query"
-      },
-      "predefinedAcl": {
-       "type": "string",
-       "description": "Apply a predefined set of access controls to this bucket.",
-       "enum": [
-        "authenticatedRead",
-        "private",
-        "projectPrivate",
-        "publicRead",
-        "publicReadWrite"
-       ],
-       "enumDescriptions": [
-        "Project team owners get OWNER access, and allAuthenticatedUsers get READER access.",
-        "Project team owners get OWNER access.",
-        "Project team members get access according to their roles.",
-        "Project team owners get OWNER access, and allUsers get READER access.",
-        "Project team owners get OWNER access, and allUsers get WRITER access."
-       ],
-       "location": "query"
-      },
-      "predefinedDefaultObjectAcl": {
-       "type": "string",
-       "description": "Apply a predefined set of default object access controls to this bucket.",
-       "enum": [
-        "authenticatedRead",
-        "bucketOwnerFullControl",
-        "bucketOwnerRead",
-        "private",
-        "projectPrivate",
-        "publicRead"
-       ],
-       "enumDescriptions": [
-        "Object owner gets OWNER access, and allAuthenticatedUsers get READER access.",
-        "Object owner gets OWNER access, and project team owners get OWNER access.",
-        "Object owner gets OWNER access, and project team owners get READER access.",
-        "Object owner gets OWNER access.",
-        "Object owner gets OWNER access, and project team members get access according to their roles.",
-        "Object owner gets OWNER access, and allUsers get READER access."
-       ],
-       "location": "query"
-      },
-      "projection": {
-       "type": "string",
-       "description": "Set of properties to return. Defaults to full.",
-       "enum": [
-        "full",
-        "noAcl"
-       ],
-       "enumDescriptions": [
-        "Include all properties.",
-        "Omit acl and defaultObjectAcl properties."
-       ],
-       "location": "query"
-      }
-     },
-     "parameterOrder": [
-      "bucket"
-     ],
-     "request": {
-      "$ref": "Bucket"
-     },
-     "response": {
-      "$ref": "Bucket"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/cloud-platform",
-      "https://www.googleapis.com/auth/devstorage.full_control",
-      "https://www.googleapis.com/auth/devstorage.read_write"
-     ]
-    }
-   }
-  },
-  "channels": {
-   "methods": {
-    "stop": {
-     "id": "storage.channels.stop",
-     "path": "channels/stop",
-     "httpMethod": "POST",
-     "description": "Stop watching resources through this channel",
-     "request": {
-      "$ref": "Channel",
-      "parameterName": "resource"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/cloud-platform",
-      "https://www.googleapis.com/auth/cloud-platform.read-only",
-      "https://www.googleapis.com/auth/devstorage.full_control",
-      "https://www.googleapis.com/auth/devstorage.read_only",
-      "https://www.googleapis.com/auth/devstorage.read_write"
-     ]
-    }
-   }
-  },
-  "defaultObjectAccessControls": {
-   "methods": {
-    "delete": {
-     "id": "storage.defaultObjectAccessControls.delete",
-     "path": "b/{bucket}/defaultObjectAcl/{entity}",
-     "httpMethod": "DELETE",
-     "description": "Permanently deletes the default object ACL entry for the specified entity on the specified bucket.",
-     "parameters": {
-      "bucket": {
-       "type": "string",
-       "description": "Name of a bucket.",
-       "required": true,
-       "location": "path"
-      },
-      "entity": {
-       "type": "string",
-       "description": "The entity holding the permission. Can be user-userId, user-emailAddress, group-groupId, group-emailAddress, allUsers, or allAuthenticatedUsers.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "bucket",
-      "entity"
-     ],
-     "scopes": [
-      "https://www.googleapis.com/auth/cloud-platform",
-      "https://www.googleapis.com/auth/devstorage.full_control"
-     ]
-    },
-    "get": {
-     "id": "storage.defaultObjectAccessControls.get",
-     "path": "b/{bucket}/defaultObjectAcl/{entity}",
-     "httpMethod": "GET",
-     "description": "Returns the default object ACL entry for the specified entity on the specified bucket.",
-     "parameters": {
-      "bucket": {
-       "type": "string",
-       "description": "Name of a bucket.",
-       "required": true,
-       "location": "path"
-      },
-      "entity": {
-       "type": "string",
-       "description": "The entity holding the permission. Can be user-userId, user-emailAddress, group-groupId, group-emailAddress, allUsers, or allAuthenticatedUsers.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "bucket",
-      "entity"
-     ],
-     "response": {
-      "$ref": "ObjectAccessControl"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/cloud-platform",
-      "https://www.googleapis.com/auth/devstorage.full_control"
-     ]
-    },
-    "insert": {
-     "id": "storage.defaultObjectAccessControls.insert",
-     "path": "b/{bucket}/defaultObjectAcl",
-     "httpMethod": "POST",
-     "description": "Creates a new default object ACL entry on the specified bucket.",
-     "parameters": {
-      "bucket": {
-       "type": "string",
-       "description": "Name of a bucket.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "bucket"
-     ],
-     "request": {
-      "$ref": "ObjectAccessControl"
-     },
-     "response": {
-      "$ref": "ObjectAccessControl"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/cloud-platform",
-      "https://www.googleapis.com/auth/devstorage.full_control"
-     ]
-    },
-    "list": {
-     "id": "storage.defaultObjectAccessControls.list",
-     "path": "b/{bucket}/defaultObjectAcl",
-     "httpMethod": "GET",
-     "description": "Retrieves default object ACL entries on the specified bucket.",
-     "parameters": {
-      "bucket": {
-       "type": "string",
-       "description": "Name of a bucket.",
-       "required": true,
-       "location": "path"
-      },
-      "ifMetagenerationMatch": {
-       "type": "string",
-       "description": "If present, only return default ACL listing if the bucket's current metageneration matches this value.",
-       "format": "int64",
-       "location": "query"
-      },
-      "ifMetagenerationNotMatch": {
-       "type": "string",
-       "description": "If present, only return default ACL listing if the bucket's current metageneration does not match the given value.",
-       "format": "int64",
-       "location": "query"
-      }
-     },
-     "parameterOrder": [
-      "bucket"
-     ],
-     "response": {
-      "$ref": "ObjectAccessControls"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/cloud-platform",
-      "https://www.googleapis.com/auth/devstorage.full_control"
-     ]
-    },
-    "patch": {
-     "id": "storage.defaultObjectAccessControls.patch",
-     "path": "b/{bucket}/defaultObjectAcl/{entity}",
-     "httpMethod": "PATCH",
-     "description": "Updates a default object ACL entry on the specified bucket. This method supports patch semantics.",
-     "parameters": {
-      "bucket": {
-       "type": "string",
-       "description": "Name of a bucket.",
-       "required": true,
-       "location": "path"
-      },
-      "entity": {
-       "type": "string",
-       "description": "The entity holding the permission. Can be user-userId, user-emailAddress, group-groupId, group-emailAddress, allUsers, or allAuthenticatedUsers.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "bucket",
-      "entity"
-     ],
-     "request": {
-      "$ref": "ObjectAccessControl"
-     },
-     "response": {
-      "$ref": "ObjectAccessControl"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/cloud-platform",
-      "https://www.googleapis.com/auth/devstorage.full_control"
-     ]
-    },
-    "update": {
-     "id": "storage.defaultObjectAccessControls.update",
-     "path": "b/{bucket}/defaultObjectAcl/{entity}",
-     "httpMethod": "PUT",
-     "description": "Updates a default object ACL entry on the specified bucket.",
-     "parameters": {
-      "bucket": {
-       "type": "string",
-       "description": "Name of a bucket.",
-       "required": true,
-       "location": "path"
-      },
-      "entity": {
-       "type": "string",
-       "description": "The entity holding the permission. Can be user-userId, user-emailAddress, group-groupId, group-emailAddress, allUsers, or allAuthenticatedUsers.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "bucket",
-      "entity"
-     ],
-     "request": {
-      "$ref": "ObjectAccessControl"
-     },
-     "response": {
-      "$ref": "ObjectAccessControl"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/cloud-platform",
-      "https://www.googleapis.com/auth/devstorage.full_control"
-     ]
-    }
-   }
-  },
-  "objectAccessControls": {
-   "methods": {
-    "delete": {
-     "id": "storage.objectAccessControls.delete",
-     "path": "b/{bucket}/o/{object}/acl/{entity}",
-     "httpMethod": "DELETE",
-     "description": "Permanently deletes the ACL entry for the specified entity on the specified object.",
-     "parameters": {
-      "bucket": {
-       "type": "string",
-       "description": "Name of a bucket.",
-       "required": true,
-       "location": "path"
-      },
-      "entity": {
-       "type": "string",
-       "description": "The entity holding the permission. Can be user-userId, user-emailAddress, group-groupId, group-emailAddress, allUsers, or allAuthenticatedUsers.",
-       "required": true,
-       "location": "path"
-      },
-      "generation": {
-       "type": "string",
-       "description": "If present, selects a specific revision of this object (as opposed to the latest version, the default).",
-       "format": "int64",
-       "location": "query"
-      },
-      "object": {
-       "type": "string",
-       "description": "Name of the object. For information about how to URL encode object names to be path safe, see Encoding URI Path Parts.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "bucket",
-      "object",
-      "entity"
-     ],
-     "scopes": [
-      "https://www.googleapis.com/auth/cloud-platform",
-      "https://www.googleapis.com/auth/devstorage.full_control"
-     ]
-    },
-    "get": {
-     "id": "storage.objectAccessControls.get",
-     "path": "b/{bucket}/o/{object}/acl/{entity}",
-     "httpMethod": "GET",
-     "description": "Returns the ACL entry for the specified entity on the specified object.",
-     "parameters": {
-      "bucket": {
-       "type": "string",
-       "description": "Name of a bucket.",
-       "required": true,
-       "location": "path"
-      },
-      "entity": {
-       "type": "string",
-       "description": "The entity holding the permission. Can be user-userId, user-emailAddress, group-groupId, group-emailAddress, allUsers, or allAuthenticatedUsers.",
-       "required": true,
-       "location": "path"
-      },
-      "generation": {
-       "type": "string",
-       "description": "If present, selects a specific revision of this object (as opposed to the latest version, the default).",
-       "format": "int64",
-       "location": "query"
-      },
-      "object": {
-       "type": "string",
-       "description": "Name of the object. For information about how to URL encode object names to be path safe, see Encoding URI Path Parts.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "bucket",
-      "object",
-      "entity"
-     ],
-     "response": {
-      "$ref": "ObjectAccessControl"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/cloud-platform",
-      "https://www.googleapis.com/auth/devstorage.full_control"
-     ]
-    },
-    "insert": {
-     "id": "storage.objectAccessControls.insert",
-     "path": "b/{bucket}/o/{object}/acl",
-     "httpMethod": "POST",
-     "description": "Creates a new ACL entry on the specified object.",
-     "parameters": {
-      "bucket": {
-       "type": "string",
-       "description": "Name of a bucket.",
-       "required": true,
-       "location": "path"
-      },
-      "generation": {
-       "type": "string",
-       "description": "If present, selects a specific revision of this object (as opposed to the latest version, the default).",
-       "format": "int64",
-       "location": "query"
-      },
-      "object": {
-       "type": "string",
-       "description": "Name of the object. For information about how to URL encode object names to be path safe, see Encoding URI Path Parts.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "bucket",
-      "object"
-     ],
-     "request": {
-      "$ref": "ObjectAccessControl"
-     },
-     "response": {
-      "$ref": "ObjectAccessControl"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/cloud-platform",
-      "https://www.googleapis.com/auth/devstorage.full_control"
-     ]
-    },
-    "list": {
-     "id": "storage.objectAccessControls.list",
-     "path": "b/{bucket}/o/{object}/acl",
-     "httpMethod": "GET",
-     "description": "Retrieves ACL entries on the specified object.",
-     "parameters": {
-      "bucket": {
-       "type": "string",
-       "description": "Name of a bucket.",
-       "required": true,
-       "location": "path"
-      },
-      "generation": {
-       "type": "string",
-       "description": "If present, selects a specific revision of this object (as opposed to the latest version, the default).",
-       "format": "int64",
-       "location": "query"
-      },
-      "object": {
-       "type": "string",
-       "description": "Name of the object. For information about how to URL encode object names to be path safe, see Encoding URI Path Parts.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "bucket",
-      "object"
-     ],
-     "response": {
-      "$ref": "ObjectAccessControls"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/cloud-platform",
-      "https://www.googleapis.com/auth/devstorage.full_control"
-     ]
-    },
-    "patch": {
-     "id": "storage.objectAccessControls.patch",
-     "path": "b/{bucket}/o/{object}/acl/{entity}",
-     "httpMethod": "PATCH",
-     "description": "Updates an ACL entry on the specified object. This method supports patch semantics.",
-     "parameters": {
-      "bucket": {
-       "type": "string",
-       "description": "Name of a bucket.",
-       "required": true,
-       "location": "path"
-      },
-      "entity": {
-       "type": "string",
-       "description": "The entity holding the permission. Can be user-userId, user-emailAddress, group-groupId, group-emailAddress, allUsers, or allAuthenticatedUsers.",
-       "required": true,
-       "location": "path"
-      },
-      "generation": {
-       "type": "string",
-       "description": "If present, selects a specific revision of this object (as opposed to the latest version, the default).",
-       "format": "int64",
-       "location": "query"
-      },
-      "object": {
-       "type": "string",
-       "description": "Name of the object. For information about how to URL encode object names to be path safe, see Encoding URI Path Parts.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "bucket",
-      "object",
-      "entity"
-     ],
-     "request": {
-      "$ref": "ObjectAccessControl"
-     },
-     "response": {
-      "$ref": "ObjectAccessControl"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/cloud-platform",
-      "https://www.googleapis.com/auth/devstorage.full_control"
-     ]
-    },
-    "update": {
-     "id": "storage.objectAccessControls.update",
-     "path": "b/{bucket}/o/{object}/acl/{entity}",
-     "httpMethod": "PUT",
-     "description": "Updates an ACL entry on the specified object.",
-     "parameters": {
-      "bucket": {
-       "type": "string",
-       "description": "Name of a bucket.",
-       "required": true,
-       "location": "path"
-      },
-      "entity": {
-       "type": "string",
-       "description": "The entity holding the permission. Can be user-userId, user-emailAddress, group-groupId, group-emailAddress, allUsers, or allAuthenticatedUsers.",
-       "required": true,
-       "location": "path"
-      },
-      "generation": {
-       "type": "string",
-       "description": "If present, selects a specific revision of this object (as opposed to the latest version, the default).",
-       "format": "int64",
-       "location": "query"
-      },
-      "object": {
-       "type": "string",
-       "description": "Name of the object. For information about how to URL encode object names to be path safe, see Encoding URI Path Parts.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "bucket",
-      "object",
-      "entity"
-     ],
-     "request": {
-      "$ref": "ObjectAccessControl"
-     },
-     "response": {
-      "$ref": "ObjectAccessControl"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/cloud-platform",
-      "https://www.googleapis.com/auth/devstorage.full_control"
-     ]
-    }
-   }
-  },
-  "objects": {
-   "methods": {
-    "compose": {
-     "id": "storage.objects.compose",
-     "path": "b/{destinationBucket}/o/{destinationObject}/compose",
-     "httpMethod": "POST",
-     "description": "Concatenates a list of existing objects into a new object in the same bucket.",
-     "parameters": {
-      "destinationBucket": {
-       "type": "string",
-       "description": "Name of the bucket in which to store the new object.",
-       "required": true,
-       "location": "path"
-      },
-      "destinationObject": {
-       "type": "string",
-       "description": "Name of the new object. For information about how to URL encode object names to be path safe, see Encoding URI Path Parts.",
-       "required": true,
-       "location": "path"
-      },
-      "destinationPredefinedAcl": {
-       "type": "string",
-       "description": "Apply a predefined set of access controls to the destination object.",
-       "enum": [
-        "authenticatedRead",
-        "bucketOwnerFullControl",
-        "bucketOwnerRead",
-        "private",
-        "projectPrivate",
-        "publicRead"
-       ],
-       "enumDescriptions": [
-        "Object owner gets OWNER access, and allAuthenticatedUsers get READER access.",
-        "Object owner gets OWNER access, and project team owners get OWNER access.",
-        "Object owner gets OWNER access, and project team owners get READER access.",
-        "Object owner gets OWNER access.",
-        "Object owner gets OWNER access, and project team members get access according to their roles.",
-        "Object owner gets OWNER access, and allUsers get READER access."
-       ],
-       "location": "query"
-      },
-      "ifGenerationMatch": {
-       "type": "string",
-       "description": "Makes the operation conditional on whether the object's current generation matches the given value.",
-       "format": "int64",
-       "location": "query"
-      },
-      "ifMetagenerationMatch": {
-       "type": "string",
-       "description": "Makes the operation conditional on whether the object's current metageneration matches the given value.",
-       "format": "int64",
-       "location": "query"
-      }
-     },
-     "parameterOrder": [
-      "destinationBucket",
-      "destinationObject"
-     ],
-     "request": {
-      "$ref": "ComposeRequest"
-     },
-     "response": {
-      "$ref": "Object"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/cloud-platform",
-      "https://www.googleapis.com/auth/devstorage.full_control",
-      "https://www.googleapis.com/auth/devstorage.read_write"
-     ],
-     "supportsMediaDownload": true,
-     "useMediaDownloadService": true
-    },
-    "copy": {
-     "id": "storage.objects.copy",
-     "path": "b/{sourceBucket}/o/{sourceObject}/copyTo/b/{destinationBucket}/o/{destinationObject}",
-     "httpMethod": "POST",
-     "description": "Copies a source object to a destination object. Optionally overrides metadata.",
-     "parameters": {
-      "destinationBucket": {
-       "type": "string",
-       "description": "Name of the bucket in which to store the new object. Overrides the provided object metadata's bucket value, if any.For information about how to URL encode object names to be path safe, see Encoding URI Path Parts.",
-       "required": true,
-       "location": "path"
-      },
-      "destinationObject": {
-       "type": "string",
-       "description": "Name of the new object. Required when the object metadata is not otherwise provided. Overrides the object metadata's name value, if any.",
-       "required": true,
-       "location": "path"
-      },
-      "destinationPredefinedAcl": {
-       "type": "string",
-       "description": "Apply a predefined set of access controls to the destination object.",
-       "enum": [
-        "authenticatedRead",
-        "bucketOwnerFullControl",
-        "bucketOwnerRead",
-        "private",
-        "projectPrivate",
-        "publicRead"
-       ],
-       "enumDescriptions": [
-        "Object owner gets OWNER access, and allAuthenticatedUsers get READER access.",
-        "Object owner gets OWNER access, and project team owners get OWNER access.",
-        "Object owner gets OWNER access, and project team owners get READER access.",
-        "Object owner gets OWNER access.",
-        "Object owner gets OWNER access, and project team members get access according to their roles.",
-        "Object owner gets OWNER access, and allUsers get READER access."
-       ],
-       "location": "query"
-      },
-      "ifGenerationMatch": {
-       "type": "string",
-       "description": "Makes the operation conditional on whether the destination object's current generation matches the given value.",
-       "format": "int64",
-       "location": "query"
-      },
-      "ifGenerationNotMatch": {
-       "type": "string",
-       "description": "Makes the operation conditional on whether the destination object's current generation does not match the given value.",
-       "format": "int64",
-       "location": "query"
-      },
-      "ifMetagenerationMatch": {
-       "type": "string",
-       "description": "Makes the operation conditional on whether the destination object's current metageneration matches the given value.",
-       "format": "int64",
-       "location": "query"
-      },
-      "ifMetagenerationNotMatch": {
-       "type": "string",
-       "description": "Makes the operation conditional on whether the destination object's current metageneration does not match the given value.",
-       "format": "int64",
-       "location": "query"
-      },
-      "ifSourceGenerationMatch": {
-       "type": "string",
-       "description": "Makes the operation conditional on whether the source object's generation matches the given value.",
-       "format": "int64",
-       "location": "query"
-      },
-      "ifSourceGenerationNotMatch": {
-       "type": "string",
-       "description": "Makes the operation conditional on whether the source object's generation does not match the given value.",
-       "format": "int64",
-       "location": "query"
-      },
-      "ifSourceMetagenerationMatch": {
-       "type": "string",
-       "description": "Makes the operation conditional on whether the source object's current metageneration matches the given value.",
-       "format": "int64",
-       "location": "query"
-      },
-      "ifSourceMetagenerationNotMatch": {
-       "type": "string",
-       "description": "Makes the operation conditional on whether the source object's current metageneration does not match the given value.",
-       "format": "int64",
-       "location": "query"
-      },
-      "projection": {
-       "type": "string",
-       "description": "Set of properties to return. Defaults to noAcl, unless the object resource specifies the acl property, when it defaults to full.",
-       "enum": [
-        "full",
-        "noAcl"
-       ],
-       "enumDescriptions": [
-        "Include all properties.",
-        "Omit the acl property."
-       ],
-       "location": "query"
-      },
-      "sourceBucket": {
-       "type": "string",
-       "description": "Name of the bucket in which to find the source object.",
-       "required": true,
-       "location": "path"
-      },
-      "sourceGeneration": {
-       "type": "string",
-       "description": "If present, selects a specific revision of the source object (as opposed to the latest version, the default).",
-       "format": "int64",
-       "location": "query"
-      },
-      "sourceObject": {
-       "type": "string",
-       "description": "Name of the source object. For information about how to URL encode object names to be path safe, see Encoding URI Path Parts.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "sourceBucket",
-      "sourceObject",
-      "destinationBucket",
-      "destinationObject"
-     ],
-     "request": {
-      "$ref": "Object"
-     },
-     "response": {
-      "$ref": "Object"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/cloud-platform",
-      "https://www.googleapis.com/auth/devstorage.full_control",
-      "https://www.googleapis.com/auth/devstorage.read_write"
-     ],
-     "supportsMediaDownload": true,
-     "useMediaDownloadService": true
-    },
-    "delete": {
-     "id": "storage.objects.delete",
-     "path": "b/{bucket}/o/{object}",
-     "httpMethod": "DELETE",
-     "description": "Deletes an object and its metadata. Deletions are permanent if versioning is not enabled for the bucket, or if the generation parameter is used.",
-     "parameters": {
-      "bucket": {
-       "type": "string",
-       "description": "Name of the bucket in which the object resides.",
-       "required": true,
-       "location": "path"
-      },
-      "generation": {
-       "type": "string",
-       "description": "If present, permanently deletes a specific revision of this object (as opposed to the latest version, the default).",
-       "format": "int64",
-       "location": "query"
-      },
-      "ifGenerationMatch": {
-       "type": "string",
-       "description": "Makes the operation conditional on whether the object's current generation matches the given value.",
-       "format": "int64",
-       "location": "query"
-      },
-      "ifGenerationNotMatch": {
-       "type": "string",
-       "description": "Makes the operation conditional on whether the object's current generation does not match the given value.",
-       "format": "int64",
-       "location": "query"
-      },
-      "ifMetagenerationMatch": {
-       "type": "string",
-       "description": "Makes the operation conditional on whether the object's current metageneration matches the given value.",
-       "format": "int64",
-       "location": "query"
-      },
-      "ifMetagenerationNotMatch": {
-       "type": "string",
-       "description": "Makes the operation conditional on whether the object's current metageneration does not match the given value.",
-       "format": "int64",
-       "location": "query"
-      },
-      "object": {
-       "type": "string",
-       "description": "Name of the object. For information about how to URL encode object names to be path safe, see Encoding URI Path Parts.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "bucket",
-      "object"
-     ],
-     "scopes": [
-      "https://www.googleapis.com/auth/cloud-platform",
-      "https://www.googleapis.com/auth/devstorage.full_control",
-      "https://www.googleapis.com/auth/devstorage.read_write"
-     ]
-    },
-    "get": {
-     "id": "storage.objects.get",
-     "path": "b/{bucket}/o/{object}",
-     "httpMethod": "GET",
-     "description": "Retrieves an object or its metadata.",
-     "parameters": {
-      "bucket": {
-       "type": "string",
-       "description": "Name of the bucket in which the object resides.",
-       "required": true,
-       "location": "path"
-      },
-      "generation": {
-       "type": "string",
-       "description": "If present, selects a specific revision of this object (as opposed to the latest version, the default).",
-       "format": "int64",
-       "location": "query"
-      },
-      "ifGenerationMatch": {
-       "type": "string",
-       "description": "Makes the operation conditional on whether the object's generation matches the given value.",
-       "format": "int64",
-       "location": "query"
-      },
-      "ifGenerationNotMatch": {
-       "type": "string",
-       "description": "Makes the operation conditional on whether the object's generation does not match the given value.",
-       "format": "int64",
-       "location": "query"
-      },
-      "ifMetagenerationMatch": {
-       "type": "string",
-       "description": "Makes the operation conditional on whether the object's current metageneration matches the given value.",
-       "format": "int64",
-       "location": "query"
-      },
-      "ifMetagenerationNotMatch": {
-       "type": "string",
-       "description": "Makes the operation conditional on whether the object's current metageneration does not match the given value.",
-       "format": "int64",
-       "location": "query"
-      },
-      "object": {
-       "type": "string",
-       "description": "Name of the object. For information about how to URL encode object names to be path safe, see Encoding URI Path Parts.",
-       "required": true,
-       "location": "path"
-      },
-      "projection": {
-       "type": "string",
-       "description": "Set of properties to return. Defaults to noAcl.",
-       "enum": [
-        "full",
-        "noAcl"
-       ],
-       "enumDescriptions": [
-        "Include all properties.",
-        "Omit the acl property."
-       ],
-       "location": "query"
-      }
-     },
-     "parameterOrder": [
-      "bucket",
-      "object"
-     ],
-     "response": {
-      "$ref": "Object"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/cloud-platform",
-      "https://www.googleapis.com/auth/cloud-platform.read-only",
-      "https://www.googleapis.com/auth/devstorage.full_control",
-      "https://www.googleapis.com/auth/devstorage.read_only",
-      "https://www.googleapis.com/auth/devstorage.read_write"
-     ],
-     "supportsMediaDownload": true,
-     "useMediaDownloadService": true
-    },
-    "insert": {
-     "id": "storage.objects.insert",
-     "path": "b/{bucket}/o",
-     "httpMethod": "POST",
-     "description": "Stores a new object and metadata.",
-     "parameters": {
-      "bucket": {
-       "type": "string",
-       "description": "Name of the bucket in which to store the new object. Overrides the provided object metadata's bucket value, if any.",
-       "required": true,
-       "location": "path"
-      },
-      "contentEncoding": {
-       "type": "string",
-       "description": "If set, sets the contentEncoding property of the final object to this value. Setting this parameter is equivalent to setting the contentEncoding metadata property. This can be useful when uploading an object with uploadType=media to indicate the encoding of the content being uploaded.",
-       "location": "query"
-      },
-      "ifGenerationMatch": {
-       "type": "string",
-       "description": "Makes the operation conditional on whether the object's current generation matches the given value.",
-       "format": "int64",
-       "location": "query"
-      },
-      "ifGenerationNotMatch": {
-       "type": "string",
-       "description": "Makes the operation conditional on whether the object's current generation does not match the given value.",
-       "format": "int64",
-       "location": "query"
-      },
-      "ifMetagenerationMatch": {
-       "type": "string",
-       "description": "Makes the operation conditional on whether the object's current metageneration matches the given value.",
-       "format": "int64",
-       "location": "query"
-      },
-      "ifMetagenerationNotMatch": {
-       "type": "string",
-       "description": "Makes the operation conditional on whether the object's current metageneration does not match the given value.",
-       "format": "int64",
-       "location": "query"
-      },
-      "name": {
-       "type": "string",
-       "description": "Name of the object. Required when the object metadata is not otherwise provided. Overrides the object metadata's name value, if any. For information about how to URL encode object names to be path safe, see Encoding URI Path Parts.",
-       "location": "query"
-      },
-      "predefinedAcl": {
-       "type": "string",
-       "description": "Apply a predefined set of access controls to this object.",
-       "enum": [
-        "authenticatedRead",
-        "bucketOwnerFullControl",
-        "bucketOwnerRead",
-        "private",
-        "projectPrivate",
-        "publicRead"
-       ],
-       "enumDescriptions": [
-        "Object owner gets OWNER access, and allAuthenticatedUsers get READER access.",
-        "Object owner gets OWNER access, and project team owners get OWNER access.",
-        "Object owner gets OWNER access, and project team owners get READER access.",
-        "Object owner gets OWNER access.",
-        "Object owner gets OWNER access, and project team members get access according to their roles.",
-        "Object owner gets OWNER access, and allUsers get READER access."
-       ],
-       "location": "query"
-      },
-      "projection": {
-       "type": "string",
-       "description": "Set of properties to return. Defaults to noAcl, unless the object resource specifies the acl property, when it defaults to full.",
-       "enum": [
-        "full",
-        "noAcl"
-       ],
-       "enumDescriptions": [
-        "Include all properties.",
-        "Omit the acl property."
-       ],
-       "location": "query"
-      }
-     },
-     "parameterOrder": [
-      "bucket"
-     ],
-     "request": {
-      "$ref": "Object"
-     },
-     "response": {
-      "$ref": "Object"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/cloud-platform",
-      "https://www.googleapis.com/auth/devstorage.full_control",
-      "https://www.googleapis.com/auth/devstorage.read_write"
-     ],
-     "supportsMediaDownload": true,
-     "useMediaDownloadService": true,
-     "supportsMediaUpload": true,
-     "mediaUpload": {
-      "accept": [
-       "*/*"
-      ],
-      "protocols": {
-       "simple": {
-        "multipart": true,
-        "path": "/upload/storage/v1/b/{bucket}/o"
-       },
-       "resumable": {
-        "multipart": true,
-        "path": "/resumable/upload/storage/v1/b/{bucket}/o"
-       }
-      }
-     }
-    },
-    "list": {
-     "id": "storage.objects.list",
-     "path": "b/{bucket}/o",
-     "httpMethod": "GET",
-     "description": "Retrieves a list of objects matching the criteria.",
-     "parameters": {
-      "bucket": {
-       "type": "string",
-       "description": "Name of the bucket in which to look for objects.",
-       "required": true,
-       "location": "path"
-      },
-      "delimiter": {
-       "type": "string",
-       "description": "Returns results in a directory-like mode. items will contain only objects whose names, aside from the prefix, do not contain delimiter. Objects whose names, aside from the prefix, contain delimiter will have their name, truncated after the delimiter, returned in prefixes. Duplicate prefixes are omitted.",
-       "location": "query"
-      },
-      "maxResults": {
-       "type": "integer",
-       "description": "Maximum number of items plus prefixes to return. As duplicate prefixes are omitted, fewer total results may be returned than requested. The default value of this parameter is 1,000 items.",
-       "format": "uint32",
-       "minimum": "0",
-       "location": "query"
-      },
-      "pageToken": {
-       "type": "string",
-       "description": "A previously-returned page token representing part of the larger set of results to view.",
-       "location": "query"
-      },
-      "prefix": {
-       "type": "string",
-       "description": "Filter results to objects whose names begin with this prefix.",
-       "location": "query"
-      },
-      "projection": {
-       "type": "string",
-       "description": "Set of properties to return. Defaults to noAcl.",
-       "enum": [
-        "full",
-        "noAcl"
-       ],
-       "enumDescriptions": [
-        "Include all properties.",
-        "Omit the acl property."
-       ],
-       "location": "query"
-      },
-      "versions": {
-       "type": "boolean",
-       "description": "If true, lists all versions of an object as distinct results. The default is false. For more information, see Object Versioning.",
-       "location": "query"
-      }
-     },
-     "parameterOrder": [
-      "bucket"
-     ],
-     "response": {
-      "$ref": "Objects"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/cloud-platform",
-      "https://www.googleapis.com/auth/cloud-platform.read-only",
-      "https://www.googleapis.com/auth/devstorage.full_control",
-      "https://www.googleapis.com/auth/devstorage.read_only",
-      "https://www.googleapis.com/auth/devstorage.read_write"
-     ],
-     "supportsSubscription": true
-    },
-    "patch": {
-     "id": "storage.objects.patch",
-     "path": "b/{bucket}/o/{object}",
-     "httpMethod": "PATCH",
-     "description": "Updates an object's metadata. This method supports patch semantics.",
-     "parameters": {
-      "bucket": {
-       "type": "string",
-       "description": "Name of the bucket in which the object resides.",
-       "required": true,
-       "location": "path"
-      },
-      "generation": {
-       "type": "string",
-       "description": "If present, selects a specific revision of this object (as opposed to the latest version, the default).",
-       "format": "int64",
-       "location": "query"
-      },
-      "ifGenerationMatch": {
-       "type": "string",
-       "description": "Makes the operation conditional on whether the object's current generation matches the given value.",
-       "format": "int64",
-       "location": "query"
-      },
-      "ifGenerationNotMatch": {
-       "type": "string",
-       "description": "Makes the operation conditional on whether the object's current generation does not match the given value.",
-       "format": "int64",
-       "location": "query"
-      },
-      "ifMetagenerationMatch": {
-       "type": "string",
-       "description": "Makes the operation conditional on whether the object's current metageneration matches the given value.",
-       "format": "int64",
-       "location": "query"
-      },
-      "ifMetagenerationNotMatch": {
-       "type": "string",
-       "description": "Makes the operation conditional on whether the object's current metageneration does not match the given value.",
-       "format": "int64",
-       "location": "query"
-      },
-      "object": {
-       "type": "string",
-       "description": "Name of the object. For information about how to URL encode object names to be path safe, see Encoding URI Path Parts.",
-       "required": true,
-       "location": "path"
-      },
-      "predefinedAcl": {
-       "type": "string",
-       "description": "Apply a predefined set of access controls to this object.",
-       "enum": [
-        "authenticatedRead",
-        "bucketOwnerFullControl",
-        "bucketOwnerRead",
-        "private",
-        "projectPrivate",
-        "publicRead"
-       ],
-       "enumDescriptions": [
-        "Object owner gets OWNER access, and allAuthenticatedUsers get READER access.",
-        "Object owner gets OWNER access, and project team owners get OWNER access.",
-        "Object owner gets OWNER access, and project team owners get READER access.",
-        "Object owner gets OWNER access.",
-        "Object owner gets OWNER access, and project team members get access according to their roles.",
-        "Object owner gets OWNER access, and allUsers get READER access."
-       ],
-       "location": "query"
-      },
-      "projection": {
-       "type": "string",
-       "description": "Set of properties to return. Defaults to full.",
-       "enum": [
-        "full",
-        "noAcl"
-       ],
-       "enumDescriptions": [
-        "Include all properties.",
-        "Omit the acl property."
-       ],
-       "location": "query"
-      }
-     },
-     "parameterOrder": [
-      "bucket",
-      "object"
-     ],
-     "request": {
-      "$ref": "Object"
-     },
-     "response": {
-      "$ref": "Object"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/cloud-platform",
-      "https://www.googleapis.com/auth/devstorage.full_control",
-      "https://www.googleapis.com/auth/devstorage.read_write"
-     ]
-    },
-    "rewrite": {
-     "id": "storage.objects.rewrite",
-     "path": "b/{sourceBucket}/o/{sourceObject}/rewriteTo/b/{destinationBucket}/o/{destinationObject}",
-     "httpMethod": "POST",
-     "description": "Rewrites a source object to a destination object. Optionally overrides metadata.",
-     "parameters": {
-      "destinationBucket": {
-       "type": "string",
-       "description": "Name of the bucket in which to store the new object. Overrides the provided object metadata's bucket value, if any.",
-       "required": true,
-       "location": "path"
-      },
-      "destinationObject": {
-       "type": "string",
-       "description": "Name of the new object. Required when the object metadata is not otherwise provided. Overrides the object metadata's name value, if any. For information about how to URL encode object names to be path safe, see Encoding URI Path Parts.",
-       "required": true,
-       "location": "path"
-      },
-      "destinationPredefinedAcl": {
-       "type": "string",
-       "description": "Apply a predefined set of access controls to the destination object.",
-       "enum": [
-        "authenticatedRead",
-        "bucketOwnerFullControl",
-        "bucketOwnerRead",
-        "private",
-        "projectPrivate",
-        "publicRead"
-       ],
-       "enumDescriptions": [
-        "Object owner gets OWNER access, and allAuthenticatedUsers get READER access.",
-        "Object owner gets OWNER access, and project team owners get OWNER access.",
-        "Object owner gets OWNER access, and project team owners get READER access.",
-        "Object owner gets OWNER access.",
-        "Object owner gets OWNER access, and project team members get access according to their roles.",
-        "Object owner gets OWNER access, and allUsers get READER access."
-       ],
-       "location": "query"
-      },
-      "ifGenerationMatch": {
-       "type": "string",
-       "description": "Makes the operation conditional on whether the destination object's current generation matches the given value.",
-       "format": "int64",
-       "location": "query"
-      },
-      "ifGenerationNotMatch": {
-       "type": "string",
-       "description": "Makes the operation conditional on whether the destination object's current generation does not match the given value.",
-       "format": "int64",
-       "location": "query"
-      },
-      "ifMetagenerationMatch": {
-       "type": "string",
-       "description": "Makes the operation conditional on whether the destination object's current metageneration matches the given value.",
-       "format": "int64",
-       "location": "query"
-      },
-      "ifMetagenerationNotMatch": {
-       "type": "string",
-       "description": "Makes the operation conditional on whether the destination object's current metageneration does not match the given value.",
-       "format": "int64",
-       "location": "query"
-      },
-      "ifSourceGenerationMatch": {
-       "type": "string",
-       "description": "Makes the operation conditional on whether the source object's generation matches the given value.",
-       "format": "int64",
-       "location": "query"
-      },
-      "ifSourceGenerationNotMatch": {
-       "type": "string",
-       "description": "Makes the operation conditional on whether the source object's generation does not match the given value.",
-       "format": "int64",
-       "location": "query"
-      },
-      "ifSourceMetagenerationMatch": {
-       "type": "string",
-       "description": "Makes the operation conditional on whether the source object's current metageneration matches the given value.",
-       "format": "int64",
-       "location": "query"
-      },
-      "ifSourceMetagenerationNotMatch": {
-       "type": "string",
-       "description": "Makes the operation conditional on whether the source object's current metageneration does not match the given value.",
-       "format": "int64",
-       "location": "query"
-      },
-      "maxBytesRewrittenPerCall": {
-       "type": "string",
-       "description": "The maximum number of bytes that will be rewritten per rewrite request. Most callers shouldn't need to specify this parameter - it is primarily in place to support testing. If specified the value must be an integral multiple of 1 MiB (1048576). Also, this only applies to requests where the source and destination span locations and/or storage classes. Finally, this value must not change across rewrite calls else you'll get an error that the rewriteToken is invalid.",
-       "format": "int64",
-       "location": "query"
-      },
-      "projection": {
-       "type": "string",
-       "description": "Set of properties to return. Defaults to noAcl, unless the object resource specifies the acl property, when it defaults to full.",
-       "enum": [
-        "full",
-        "noAcl"
-       ],
-       "enumDescriptions": [
-        "Include all properties.",
-        "Omit the acl property."
-       ],
-       "location": "query"
-      },
-      "rewriteToken": {
-       "type": "string",
-       "description": "Include this field (from the previous rewrite response) on each rewrite request after the first one, until the rewrite response 'done' flag is true. Calls that provide a rewriteToken can omit all other request fields, but if included those fields must match the values provided in the first rewrite request.",
-       "location": "query"
-      },
-      "sourceBucket": {
-       "type": "string",
-       "description": "Name of the bucket in which to find the source object.",
-       "required": true,
-       "location": "path"
-      },
-      "sourceGeneration": {
-       "type": "string",
-       "description": "If present, selects a specific revision of the source object (as opposed to the latest version, the default).",
-       "format": "int64",
-       "location": "query"
-      },
-      "sourceObject": {
-       "type": "string",
-       "description": "Name of the source object. For information about how to URL encode object names to be path safe, see Encoding URI Path Parts.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "sourceBucket",
-      "sourceObject",
-      "destinationBucket",
-      "destinationObject"
-     ],
-     "request": {
-      "$ref": "Object"
-     },
-     "response": {
-      "$ref": "RewriteResponse"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/cloud-platform",
-      "https://www.googleapis.com/auth/devstorage.full_control",
-      "https://www.googleapis.com/auth/devstorage.read_write"
-     ]
-    },
-    "update": {
-     "id": "storage.objects.update",
-     "path": "b/{bucket}/o/{object}",
-     "httpMethod": "PUT",
-     "description": "Updates an object's metadata.",
-     "parameters": {
-      "bucket": {
-       "type": "string",
-       "description": "Name of the bucket in which the object resides.",
-       "required": true,
-       "location": "path"
-      },
-      "generation": {
-       "type": "string",
-       "description": "If present, selects a specific revision of this object (as opposed to the latest version, the default).",
-       "format": "int64",
-       "location": "query"
-      },
-      "ifGenerationMatch": {
-       "type": "string",
-       "description": "Makes the operation conditional on whether the object's current generation matches the given value.",
-       "format": "int64",
-       "location": "query"
-      },
-      "ifGenerationNotMatch": {
-       "type": "string",
-       "description": "Makes the operation conditional on whether the object's current generation does not match the given value.",
-       "format": "int64",
-       "location": "query"
-      },
-      "ifMetagenerationMatch": {
-       "type": "string",
-       "description": "Makes the operation conditional on whether the object's current metageneration matches the given value.",
-       "format": "int64",
-       "location": "query"
-      },
-      "ifMetagenerationNotMatch": {
-       "type": "string",
-       "description": "Makes the operation conditional on whether the object's current metageneration does not match the given value.",
-       "format": "int64",
-       "location": "query"
-      },
-      "object": {
-       "type": "string",
-       "description": "Name of the object. For information about how to URL encode object names to be path safe, see Encoding URI Path Parts.",
-       "required": true,
-       "location": "path"
-      },
-      "predefinedAcl": {
-       "type": "string",
-       "description": "Apply a predefined set of access controls to this object.",
-       "enum": [
-        "authenticatedRead",
-        "bucketOwnerFullControl",
-        "bucketOwnerRead",
-        "private",
-        "projectPrivate",
-        "publicRead"
-       ],
-       "enumDescriptions": [
-        "Object owner gets OWNER access, and allAuthenticatedUsers get READER access.",
-        "Object owner gets OWNER access, and project team owners get OWNER access.",
-        "Object owner gets OWNER access, and project team owners get READER access.",
-        "Object owner gets OWNER access.",
-        "Object owner gets OWNER access, and project team members get access according to their roles.",
-        "Object owner gets OWNER access, and allUsers get READER access."
-       ],
-       "location": "query"
-      },
-      "projection": {
-       "type": "string",
-       "description": "Set of properties to return. Defaults to full.",
-       "enum": [
-        "full",
-        "noAcl"
-       ],
-       "enumDescriptions": [
-        "Include all properties.",
-        "Omit the acl property."
-       ],
-       "location": "query"
-      }
-     },
-     "parameterOrder": [
-      "bucket",
-      "object"
-     ],
-     "request": {
-      "$ref": "Object"
-     },
-     "response": {
-      "$ref": "Object"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/cloud-platform",
-      "https://www.googleapis.com/auth/devstorage.full_control",
-      "https://www.googleapis.com/auth/devstorage.read_write"
-     ],
-     "supportsMediaDownload": true,
-     "useMediaDownloadService": true
-    },
-    "watchAll": {
-     "id": "storage.objects.watchAll",
-     "path": "b/{bucket}/o/watch",
-     "httpMethod": "POST",
-     "description": "Watch for changes on all objects in a bucket.",
-     "parameters": {
-      "bucket": {
-       "type": "string",
-       "description": "Name of the bucket in which to look for objects.",
-       "required": true,
-       "location": "path"
-      },
-      "delimiter": {
-       "type": "string",
-       "description": "Returns results in a directory-like mode. items will contain only objects whose names, aside from the prefix, do not contain delimiter. Objects whose names, aside from the prefix, contain delimiter will have their name, truncated after the delimiter, returned in prefixes. Duplicate prefixes are omitted.",
-       "location": "query"
-      },
-      "maxResults": {
-       "type": "integer",
-       "description": "Maximum number of items plus prefixes to return. As duplicate prefixes are omitted, fewer total results may be returned than requested. The default value of this parameter is 1,000 items.",
-       "format": "uint32",
-       "minimum": "0",
-       "location": "query"
-      },
-      "pageToken": {
-       "type": "string",
-       "description": "A previously-returned page token representing part of the larger set of results to view.",
-       "location": "query"
-      },
-      "prefix": {
-       "type": "string",
-       "description": "Filter results to objects whose names begin with this prefix.",
-       "location": "query"
-      },
-      "projection": {
-       "type": "string",
-       "description": "Set of properties to return. Defaults to noAcl.",
-       "enum": [
-        "full",
-        "noAcl"
-       ],
-       "enumDescriptions": [
-        "Include all properties.",
-        "Omit the acl property."
-       ],
-       "location": "query"
-      },
-      "versions": {
-       "type": "boolean",
-       "description": "If true, lists all versions of an object as distinct results. The default is false. For more information, see Object Versioning.",
-       "location": "query"
-      }
-     },
-     "parameterOrder": [
-      "bucket"
-     ],
-     "request": {
-      "$ref": "Channel",
-      "parameterName": "resource"
-     },
-     "response": {
-      "$ref": "Channel"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/cloud-platform",
-      "https://www.googleapis.com/auth/cloud-platform.read-only",
-      "https://www.googleapis.com/auth/devstorage.full_control",
-      "https://www.googleapis.com/auth/devstorage.read_only",
-      "https://www.googleapis.com/auth/devstorage.read_write"
-     ],
-     "supportsSubscription": true
-    }
-   }
-  }
- }
-}
diff --git a/vendor/google.golang.org/api/storage/v1/storage-gen.go b/vendor/google.golang.org/api/storage/v1/storage-gen.go
index a29904439..c0e0661df 100644
--- a/vendor/google.golang.org/api/storage/v1/storage-gen.go
+++ b/vendor/google.golang.org/api/storage/v1/storage-gen.go
@@ -7,7 +7,7 @@
 //   import "google.golang.org/api/storage/v1"
 //   ...
 //   storageService, err := storage.New(oauthHttpClient)
-package storage
+package storage // import "google.golang.org/api/storage/v1"
 
 import (
 	"bytes"
diff --git a/vendor/google.golang.org/appengine/.travis.yml b/vendor/google.golang.org/appengine/.travis.yml
deleted file mode 100644
index 771520977..000000000
--- a/vendor/google.golang.org/appengine/.travis.yml
+++ /dev/null
@@ -1,18 +0,0 @@
-language: go
-sudo: false
-
-go:
-  - 1.4
-
-install:
-  - go get -v -t -d google.golang.org/appengine/...
-  - mkdir sdk
-  - curl -o sdk.zip "https://storage.googleapis.com/appengine-sdks/featured/go_appengine_sdk_linux_amd64-1.9.24.zip"
-  - unzip sdk.zip -d sdk
-  - export APPENGINE_DEV_APPSERVER=$(pwd)/sdk/go_appengine/dev_appserver.py
-
-script:
-  - go version
-  - go test -v google.golang.org/appengine/...
-  - go test -v -race google.golang.org/appengine/...
-  - sdk/go_appengine/goapp test -v google.golang.org/appengine/...
diff --git a/vendor/google.golang.org/appengine/README.md b/vendor/google.golang.org/appengine/README.md
deleted file mode 100644
index 1dbb3341f..000000000
--- a/vendor/google.golang.org/appengine/README.md
+++ /dev/null
@@ -1,73 +0,0 @@
-# Go App Engine packages
-
-[![Build Status](https://travis-ci.org/golang/appengine.svg)](https://travis-ci.org/golang/appengine)
-
-This repository supports the Go runtime on App Engine,
-including both classic App Engine and Managed VMs.
-It provides APIs for interacting with App Engine services.
-Its canonical import path is `google.golang.org/appengine`.
-
-See https://cloud.google.com/appengine/docs/go/
-for more information.
-
-File issue reports and feature requests on the [Google App Engine issue
-tracker](https://code.google.com/p/googleappengine/issues/entry?template=Go%20defect).
-
-## Directory structure
-The top level directory of this repository is the `appengine` package. It
-contains the
-basic APIs (e.g. `appengine.NewContext`) that apply across APIs. Specific API
-packages are in subdirectories (e.g. `datastore`).
-
-There is an `internal` subdirectory that contains service protocol buffers,
-plus packages required for connectivity to make API calls. App Engine apps
-should not directly import any package under `internal`.
-
-## Updating a Go App Engine app
-
-This section describes how to update a traditional Go App Engine app to use
-these packages.
-
-### 1. Update YAML files (Managed VMs only)
-
-The `app.yaml` file (and YAML files for modules) should have these new lines added:
-```
-vm: true
-```
-See https://cloud.google.com/appengine/docs/go/modules/#Go_Instance_scaling_and_class for details.
-
-### 2. Update import paths
-
-The import paths for App Engine packages are now fully qualified, based at `google.golang.org/appengine`.
-You will need to update your code to use import paths starting with that; for instance,
-code importing `appengine/datastore` will now need to import `google.golang.org/appengine/datastore`.
-You can do that manually, or by running this command to recursively update all Go source files in the current directory:
-(may require GNU sed)
-```
-sed -i '/"appengine/{s,"appengine,"google.golang.org/appengine,;s,appengine_,appengine/,}' \
-  $(find . -name '*.go')
-```
-
-### 3. Update code using deprecated, removed or modified APIs
-
-Most App Engine services are available with exactly the same API.
-A few APIs were cleaned up, and some are not available yet.
-This list summarises the differences:
-
-* `appengine.Context` has been replaced with the `Context` type from `golang.org/x/net/context`.
-* Logging methods that were on `appengine.Context` are now functions in `google.golang.org/appengine/log`.
-* `appengine.Timeout` has been removed. Use `context.WithTimeout` instead.
-* `appengine.Datacenter` now takes a `context.Context` argument.
-* `datastore.PropertyLoadSaver` has been simplified to use slices in place of channels.
-* `delay.Call` now returns an error.
-* `search.FieldLoadSaver` now handles document metadata.
-* `urlfetch.Transport` no longer has a Deadline field; set a deadline on the
-  `context.Context` instead.
-* `aetest` no longer declares its own Context type, and uses the standard one instead.
-* `taskqueue.QueueStats` no longer takes a maxTasks argument. That argument has been
-  deprecated and unused for a long time.
-* `appengine.BackendHostname` and `appengine.BackendInstance` were for the deprecated backends feature.
-  Use `appengine.ModuleHostname`and `appengine.ModuleName` instead.
-* Most of `appengine/file` and parts of `appengine/blobstore` are deprecated.
-  Use [Google Cloud Storage](https://godoc.org/google.golang.org/cloud/storage) instead.
-* `appengine/socket` is not required on Managed VMs. Use the standard `net` package instead.
diff --git a/vendor/google.golang.org/appengine/appengine.go b/vendor/google.golang.org/appengine/appengine.go
index be0b5f2bc..aa23a7ab6 100644
--- a/vendor/google.golang.org/appengine/appengine.go
+++ b/vendor/google.golang.org/appengine/appengine.go
@@ -6,7 +6,7 @@
 //
 // For more information on how to write Go apps for Google App Engine, see:
 // https://cloud.google.com/appengine/docs/go/
-package appengine
+package appengine // import "google.golang.org/appengine"
 
 import (
 	"net/http"
diff --git a/vendor/google.golang.org/appengine/internal/datastore/datastore_v3.proto b/vendor/google.golang.org/appengine/internal/datastore/datastore_v3.proto
old mode 100644
new mode 100755
diff --git a/vendor/google.golang.org/appengine/internal/regen.sh b/vendor/google.golang.org/appengine/internal/regen.sh
deleted file mode 100644
index 2fdb546a6..000000000
--- a/vendor/google.golang.org/appengine/internal/regen.sh
+++ /dev/null
@@ -1,40 +0,0 @@
-#!/bin/bash -e
-#
-# This script rebuilds the generated code for the protocol buffers.
-# To run this you will need protoc and goprotobuf installed;
-# see https://github.com/golang/protobuf for instructions.
-
-PKG=google.golang.org/appengine
-
-function die() {
-	echo 1>&2 $*
-	exit 1
-}
-
-# Sanity check that the right tools are accessible.
-for tool in go protoc protoc-gen-go; do
-	q=$(which $tool) || die "didn't find $tool"
-	echo 1>&2 "$tool: $q"
-done
-
-echo -n 1>&2 "finding package dir... "
-pkgdir=$(go list -f '{{.Dir}}' $PKG)
-echo 1>&2 $pkgdir
-base=$(echo $pkgdir | sed "s,/$PKG\$,,")
-echo 1>&2 "base: $base"
-cd $base
-
-# Run protoc once per package.
-for dir in $(find $PKG/internal -name '*.proto' | xargs dirname | sort | uniq); do
-	echo 1>&2 "* $dir"
-	protoc --go_out=. $dir/*.proto
-done
-
-for f in $(find $PKG/internal -name '*.pb.go'); do
-  # Remove proto.RegisterEnum calls.
-  # These cause duplicate registration panics when these packages
-  # are used on classic App Engine. proto.RegisterEnum only affects
-  # parsing the text format; we don't care about that.
-  # https://code.google.com/p/googleappengine/issues/detail?id=11670#c17
-  sed -i '/proto.RegisterEnum/d' $f
-done
diff --git a/vendor/google.golang.org/appengine/internal/urlfetch/urlfetch_service.pb.go b/vendor/google.golang.org/appengine/internal/urlfetch/urlfetch_service.pb.go
new file mode 100644
index 000000000..af463fbb2
--- /dev/null
+++ b/vendor/google.golang.org/appengine/internal/urlfetch/urlfetch_service.pb.go
@@ -0,0 +1,355 @@
+// Code generated by protoc-gen-go.
+// source: google.golang.org/appengine/internal/urlfetch/urlfetch_service.proto
+// DO NOT EDIT!
+
+/*
+Package urlfetch is a generated protocol buffer package.
+
+It is generated from these files:
+	google.golang.org/appengine/internal/urlfetch/urlfetch_service.proto
+
+It has these top-level messages:
+	URLFetchServiceError
+	URLFetchRequest
+	URLFetchResponse
+*/
+package urlfetch
+
+import proto "github.com/golang/protobuf/proto"
+import fmt "fmt"
+import math "math"
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+type URLFetchServiceError_ErrorCode int32
+
+const (
+	URLFetchServiceError_OK                       URLFetchServiceError_ErrorCode = 0
+	URLFetchServiceError_INVALID_URL              URLFetchServiceError_ErrorCode = 1
+	URLFetchServiceError_FETCH_ERROR              URLFetchServiceError_ErrorCode = 2
+	URLFetchServiceError_UNSPECIFIED_ERROR        URLFetchServiceError_ErrorCode = 3
+	URLFetchServiceError_RESPONSE_TOO_LARGE       URLFetchServiceError_ErrorCode = 4
+	URLFetchServiceError_DEADLINE_EXCEEDED        URLFetchServiceError_ErrorCode = 5
+	URLFetchServiceError_SSL_CERTIFICATE_ERROR    URLFetchServiceError_ErrorCode = 6
+	URLFetchServiceError_DNS_ERROR                URLFetchServiceError_ErrorCode = 7
+	URLFetchServiceError_CLOSED                   URLFetchServiceError_ErrorCode = 8
+	URLFetchServiceError_INTERNAL_TRANSIENT_ERROR URLFetchServiceError_ErrorCode = 9
+	URLFetchServiceError_TOO_MANY_REDIRECTS       URLFetchServiceError_ErrorCode = 10
+	URLFetchServiceError_MALFORMED_REPLY          URLFetchServiceError_ErrorCode = 11
+	URLFetchServiceError_CONNECTION_ERROR         URLFetchServiceError_ErrorCode = 12
+)
+
+var URLFetchServiceError_ErrorCode_name = map[int32]string{
+	0:  "OK",
+	1:  "INVALID_URL",
+	2:  "FETCH_ERROR",
+	3:  "UNSPECIFIED_ERROR",
+	4:  "RESPONSE_TOO_LARGE",
+	5:  "DEADLINE_EXCEEDED",
+	6:  "SSL_CERTIFICATE_ERROR",
+	7:  "DNS_ERROR",
+	8:  "CLOSED",
+	9:  "INTERNAL_TRANSIENT_ERROR",
+	10: "TOO_MANY_REDIRECTS",
+	11: "MALFORMED_REPLY",
+	12: "CONNECTION_ERROR",
+}
+var URLFetchServiceError_ErrorCode_value = map[string]int32{
+	"OK":                       0,
+	"INVALID_URL":              1,
+	"FETCH_ERROR":              2,
+	"UNSPECIFIED_ERROR":        3,
+	"RESPONSE_TOO_LARGE":       4,
+	"DEADLINE_EXCEEDED":        5,
+	"SSL_CERTIFICATE_ERROR":    6,
+	"DNS_ERROR":                7,
+	"CLOSED":                   8,
+	"INTERNAL_TRANSIENT_ERROR": 9,
+	"TOO_MANY_REDIRECTS":       10,
+	"MALFORMED_REPLY":          11,
+	"CONNECTION_ERROR":         12,
+}
+
+func (x URLFetchServiceError_ErrorCode) Enum() *URLFetchServiceError_ErrorCode {
+	p := new(URLFetchServiceError_ErrorCode)
+	*p = x
+	return p
+}
+func (x URLFetchServiceError_ErrorCode) String() string {
+	return proto.EnumName(URLFetchServiceError_ErrorCode_name, int32(x))
+}
+func (x *URLFetchServiceError_ErrorCode) UnmarshalJSON(data []byte) error {
+	value, err := proto.UnmarshalJSONEnum(URLFetchServiceError_ErrorCode_value, data, "URLFetchServiceError_ErrorCode")
+	if err != nil {
+		return err
+	}
+	*x = URLFetchServiceError_ErrorCode(value)
+	return nil
+}
+
+type URLFetchRequest_RequestMethod int32
+
+const (
+	URLFetchRequest_GET    URLFetchRequest_RequestMethod = 1
+	URLFetchRequest_POST   URLFetchRequest_RequestMethod = 2
+	URLFetchRequest_HEAD   URLFetchRequest_RequestMethod = 3
+	URLFetchRequest_PUT    URLFetchRequest_RequestMethod = 4
+	URLFetchRequest_DELETE URLFetchRequest_RequestMethod = 5
+	URLFetchRequest_PATCH  URLFetchRequest_RequestMethod = 6
+)
+
+var URLFetchRequest_RequestMethod_name = map[int32]string{
+	1: "GET",
+	2: "POST",
+	3: "HEAD",
+	4: "PUT",
+	5: "DELETE",
+	6: "PATCH",
+}
+var URLFetchRequest_RequestMethod_value = map[string]int32{
+	"GET":    1,
+	"POST":   2,
+	"HEAD":   3,
+	"PUT":    4,
+	"DELETE": 5,
+	"PATCH":  6,
+}
+
+func (x URLFetchRequest_RequestMethod) Enum() *URLFetchRequest_RequestMethod {
+	p := new(URLFetchRequest_RequestMethod)
+	*p = x
+	return p
+}
+func (x URLFetchRequest_RequestMethod) String() string {
+	return proto.EnumName(URLFetchRequest_RequestMethod_name, int32(x))
+}
+func (x *URLFetchRequest_RequestMethod) UnmarshalJSON(data []byte) error {
+	value, err := proto.UnmarshalJSONEnum(URLFetchRequest_RequestMethod_value, data, "URLFetchRequest_RequestMethod")
+	if err != nil {
+		return err
+	}
+	*x = URLFetchRequest_RequestMethod(value)
+	return nil
+}
+
+type URLFetchServiceError struct {
+	XXX_unrecognized []byte `json:"-"`
+}
+
+func (m *URLFetchServiceError) Reset()         { *m = URLFetchServiceError{} }
+func (m *URLFetchServiceError) String() string { return proto.CompactTextString(m) }
+func (*URLFetchServiceError) ProtoMessage()    {}
+
+type URLFetchRequest struct {
+	Method                        *URLFetchRequest_RequestMethod `protobuf:"varint,1,req,name=Method,enum=appengine.URLFetchRequest_RequestMethod" json:"Method,omitempty"`
+	Url                           *string                        `protobuf:"bytes,2,req,name=Url" json:"Url,omitempty"`
+	Header                        []*URLFetchRequest_Header      `protobuf:"group,3,rep,name=Header" json:"header,omitempty"`
+	Payload                       []byte                         `protobuf:"bytes,6,opt,name=Payload" json:"Payload,omitempty"`
+	FollowRedirects               *bool                          `protobuf:"varint,7,opt,name=FollowRedirects,def=1" json:"FollowRedirects,omitempty"`
+	Deadline                      *float64                       `protobuf:"fixed64,8,opt,name=Deadline" json:"Deadline,omitempty"`
+	MustValidateServerCertificate *bool                          `protobuf:"varint,9,opt,name=MustValidateServerCertificate,def=1" json:"MustValidateServerCertificate,omitempty"`
+	XXX_unrecognized              []byte                         `json:"-"`
+}
+
+func (m *URLFetchRequest) Reset()         { *m = URLFetchRequest{} }
+func (m *URLFetchRequest) String() string { return proto.CompactTextString(m) }
+func (*URLFetchRequest) ProtoMessage()    {}
+
+const Default_URLFetchRequest_FollowRedirects bool = true
+const Default_URLFetchRequest_MustValidateServerCertificate bool = true
+
+func (m *URLFetchRequest) GetMethod() URLFetchRequest_RequestMethod {
+	if m != nil && m.Method != nil {
+		return *m.Method
+	}
+	return URLFetchRequest_GET
+}
+
+func (m *URLFetchRequest) GetUrl() string {
+	if m != nil && m.Url != nil {
+		return *m.Url
+	}
+	return ""
+}
+
+func (m *URLFetchRequest) GetHeader() []*URLFetchRequest_Header {
+	if m != nil {
+		return m.Header
+	}
+	return nil
+}
+
+func (m *URLFetchRequest) GetPayload() []byte {
+	if m != nil {
+		return m.Payload
+	}
+	return nil
+}
+
+func (m *URLFetchRequest) GetFollowRedirects() bool {
+	if m != nil && m.FollowRedirects != nil {
+		return *m.FollowRedirects
+	}
+	return Default_URLFetchRequest_FollowRedirects
+}
+
+func (m *URLFetchRequest) GetDeadline() float64 {
+	if m != nil && m.Deadline != nil {
+		return *m.Deadline
+	}
+	return 0
+}
+
+func (m *URLFetchRequest) GetMustValidateServerCertificate() bool {
+	if m != nil && m.MustValidateServerCertificate != nil {
+		return *m.MustValidateServerCertificate
+	}
+	return Default_URLFetchRequest_MustValidateServerCertificate
+}
+
+type URLFetchRequest_Header struct {
+	Key              *string `protobuf:"bytes,4,req,name=Key" json:"Key,omitempty"`
+	Value            *string `protobuf:"bytes,5,req,name=Value" json:"Value,omitempty"`
+	XXX_unrecognized []byte  `json:"-"`
+}
+
+func (m *URLFetchRequest_Header) Reset()         { *m = URLFetchRequest_Header{} }
+func (m *URLFetchRequest_Header) String() string { return proto.CompactTextString(m) }
+func (*URLFetchRequest_Header) ProtoMessage()    {}
+
+func (m *URLFetchRequest_Header) GetKey() string {
+	if m != nil && m.Key != nil {
+		return *m.Key
+	}
+	return ""
+}
+
+func (m *URLFetchRequest_Header) GetValue() string {
+	if m != nil && m.Value != nil {
+		return *m.Value
+	}
+	return ""
+}
+
+type URLFetchResponse struct {
+	Content               []byte                     `protobuf:"bytes,1,opt,name=Content" json:"Content,omitempty"`
+	StatusCode            *int32                     `protobuf:"varint,2,req,name=StatusCode" json:"StatusCode,omitempty"`
+	Header                []*URLFetchResponse_Header `protobuf:"group,3,rep,name=Header" json:"header,omitempty"`
+	ContentWasTruncated   *bool                      `protobuf:"varint,6,opt,name=ContentWasTruncated,def=0" json:"ContentWasTruncated,omitempty"`
+	ExternalBytesSent     *int64                     `protobuf:"varint,7,opt,name=ExternalBytesSent" json:"ExternalBytesSent,omitempty"`
+	ExternalBytesReceived *int64                     `protobuf:"varint,8,opt,name=ExternalBytesReceived" json:"ExternalBytesReceived,omitempty"`
+	FinalUrl              *string                    `protobuf:"bytes,9,opt,name=FinalUrl" json:"FinalUrl,omitempty"`
+	ApiCpuMilliseconds    *int64                     `protobuf:"varint,10,opt,name=ApiCpuMilliseconds,def=0" json:"ApiCpuMilliseconds,omitempty"`
+	ApiBytesSent          *int64                     `protobuf:"varint,11,opt,name=ApiBytesSent,def=0" json:"ApiBytesSent,omitempty"`
+	ApiBytesReceived      *int64                     `protobuf:"varint,12,opt,name=ApiBytesReceived,def=0" json:"ApiBytesReceived,omitempty"`
+	XXX_unrecognized      []byte                     `json:"-"`
+}
+
+func (m *URLFetchResponse) Reset()         { *m = URLFetchResponse{} }
+func (m *URLFetchResponse) String() string { return proto.CompactTextString(m) }
+func (*URLFetchResponse) ProtoMessage()    {}
+
+const Default_URLFetchResponse_ContentWasTruncated bool = false
+const Default_URLFetchResponse_ApiCpuMilliseconds int64 = 0
+const Default_URLFetchResponse_ApiBytesSent int64 = 0
+const Default_URLFetchResponse_ApiBytesReceived int64 = 0
+
+func (m *URLFetchResponse) GetContent() []byte {
+	if m != nil {
+		return m.Content
+	}
+	return nil
+}
+
+func (m *URLFetchResponse) GetStatusCode() int32 {
+	if m != nil && m.StatusCode != nil {
+		return *m.StatusCode
+	}
+	return 0
+}
+
+func (m *URLFetchResponse) GetHeader() []*URLFetchResponse_Header {
+	if m != nil {
+		return m.Header
+	}
+	return nil
+}
+
+func (m *URLFetchResponse) GetContentWasTruncated() bool {
+	if m != nil && m.ContentWasTruncated != nil {
+		return *m.ContentWasTruncated
+	}
+	return Default_URLFetchResponse_ContentWasTruncated
+}
+
+func (m *URLFetchResponse) GetExternalBytesSent() int64 {
+	if m != nil && m.ExternalBytesSent != nil {
+		return *m.ExternalBytesSent
+	}
+	return 0
+}
+
+func (m *URLFetchResponse) GetExternalBytesReceived() int64 {
+	if m != nil && m.ExternalBytesReceived != nil {
+		return *m.ExternalBytesReceived
+	}
+	return 0
+}
+
+func (m *URLFetchResponse) GetFinalUrl() string {
+	if m != nil && m.FinalUrl != nil {
+		return *m.FinalUrl
+	}
+	return ""
+}
+
+func (m *URLFetchResponse) GetApiCpuMilliseconds() int64 {
+	if m != nil && m.ApiCpuMilliseconds != nil {
+		return *m.ApiCpuMilliseconds
+	}
+	return Default_URLFetchResponse_ApiCpuMilliseconds
+}
+
+func (m *URLFetchResponse) GetApiBytesSent() int64 {
+	if m != nil && m.ApiBytesSent != nil {
+		return *m.ApiBytesSent
+	}
+	return Default_URLFetchResponse_ApiBytesSent
+}
+
+func (m *URLFetchResponse) GetApiBytesReceived() int64 {
+	if m != nil && m.ApiBytesReceived != nil {
+		return *m.ApiBytesReceived
+	}
+	return Default_URLFetchResponse_ApiBytesReceived
+}
+
+type URLFetchResponse_Header struct {
+	Key              *string `protobuf:"bytes,4,req,name=Key" json:"Key,omitempty"`
+	Value            *string `protobuf:"bytes,5,req,name=Value" json:"Value,omitempty"`
+	XXX_unrecognized []byte  `json:"-"`
+}
+
+func (m *URLFetchResponse_Header) Reset()         { *m = URLFetchResponse_Header{} }
+func (m *URLFetchResponse_Header) String() string { return proto.CompactTextString(m) }
+func (*URLFetchResponse_Header) ProtoMessage()    {}
+
+func (m *URLFetchResponse_Header) GetKey() string {
+	if m != nil && m.Key != nil {
+		return *m.Key
+	}
+	return ""
+}
+
+func (m *URLFetchResponse_Header) GetValue() string {
+	if m != nil && m.Value != nil {
+		return *m.Value
+	}
+	return ""
+}
+
+func init() {
+}
diff --git a/vendor/google.golang.org/appengine/internal/urlfetch/urlfetch_service.proto b/vendor/google.golang.org/appengine/internal/urlfetch/urlfetch_service.proto
new file mode 100644
index 000000000..f695edf6a
--- /dev/null
+++ b/vendor/google.golang.org/appengine/internal/urlfetch/urlfetch_service.proto
@@ -0,0 +1,64 @@
+syntax = "proto2";
+option go_package = "urlfetch";
+
+package appengine;
+
+message URLFetchServiceError {
+  enum ErrorCode {
+    OK = 0;
+    INVALID_URL = 1;
+    FETCH_ERROR = 2;
+    UNSPECIFIED_ERROR = 3;
+    RESPONSE_TOO_LARGE = 4;
+    DEADLINE_EXCEEDED = 5;
+    SSL_CERTIFICATE_ERROR = 6;
+    DNS_ERROR = 7;
+    CLOSED = 8;
+    INTERNAL_TRANSIENT_ERROR = 9;
+    TOO_MANY_REDIRECTS = 10;
+    MALFORMED_REPLY = 11;
+    CONNECTION_ERROR = 12;
+  }
+}
+
+message URLFetchRequest {
+  enum RequestMethod {
+    GET = 1;
+    POST = 2;
+    HEAD = 3;
+    PUT = 4;
+    DELETE = 5;
+    PATCH = 6;
+  }
+  required RequestMethod Method = 1;
+  required string Url = 2;
+  repeated group Header = 3 {
+    required string Key = 4;
+    required string Value = 5;
+  }
+  optional bytes Payload = 6 [ctype=CORD];
+
+  optional bool FollowRedirects = 7 [default=true];
+
+  optional double Deadline = 8;
+
+  optional bool MustValidateServerCertificate = 9 [default=true];
+}
+
+message URLFetchResponse {
+  optional bytes Content = 1;
+  required int32 StatusCode = 2;
+  repeated group Header = 3 {
+    required string Key = 4;
+    required string Value = 5;
+  }
+  optional bool ContentWasTruncated = 6 [default=false];
+  optional int64 ExternalBytesSent = 7;
+  optional int64 ExternalBytesReceived = 8;
+
+  optional string FinalUrl = 9;
+
+  optional int64 ApiCpuMilliseconds = 10 [default=0];
+  optional int64 ApiBytesSent = 11 [default=0];
+  optional int64 ApiBytesReceived = 12 [default=0];
+}
diff --git a/vendor/google.golang.org/appengine/urlfetch/urlfetch.go b/vendor/google.golang.org/appengine/urlfetch/urlfetch.go
new file mode 100644
index 000000000..6ffe1e6d9
--- /dev/null
+++ b/vendor/google.golang.org/appengine/urlfetch/urlfetch.go
@@ -0,0 +1,210 @@
+// Copyright 2011 Google Inc. All rights reserved.
+// Use of this source code is governed by the Apache 2.0
+// license that can be found in the LICENSE file.
+
+// Package urlfetch provides an http.RoundTripper implementation
+// for fetching URLs via App Engine's urlfetch service.
+package urlfetch // import "google.golang.org/appengine/urlfetch"
+
+import (
+	"errors"
+	"fmt"
+	"io"
+	"io/ioutil"
+	"net/http"
+	"net/url"
+	"strconv"
+	"strings"
+	"time"
+
+	"github.com/golang/protobuf/proto"
+	"golang.org/x/net/context"
+
+	"google.golang.org/appengine/internal"
+	pb "google.golang.org/appengine/internal/urlfetch"
+)
+
+// Transport is an implementation of http.RoundTripper for
+// App Engine. Users should generally create an http.Client using
+// this transport and use the Client rather than using this transport
+// directly.
+type Transport struct {
+	Context context.Context
+
+	// Controls whether the application checks the validity of SSL certificates
+	// over HTTPS connections. A value of false (the default) instructs the
+	// application to send a request to the server only if the certificate is
+	// valid and signed by a trusted certificate authority (CA), and also
+	// includes a hostname that matches the certificate. A value of true
+	// instructs the application to perform no certificate validation.
+	AllowInvalidServerCertificate bool
+}
+
+// Verify statically that *Transport implements http.RoundTripper.
+var _ http.RoundTripper = (*Transport)(nil)
+
+// Client returns an *http.Client using a default urlfetch Transport. This
+// client will have the default deadline of 5 seconds, and will check the
+// validity of SSL certificates.
+//
+// Any deadline of the provided context will be used for requests through this client;
+// if the client does not have a deadline then a 5 second default is used.
+func Client(ctx context.Context) *http.Client {
+	return &http.Client{
+		Transport: &Transport{
+			Context: ctx,
+		},
+	}
+}
+
+type bodyReader struct {
+	content   []byte
+	truncated bool
+	closed    bool
+}
+
+// ErrTruncatedBody is the error returned after the final Read() from a
+// response's Body if the body has been truncated by App Engine's proxy.
+var ErrTruncatedBody = errors.New("urlfetch: truncated body")
+
+func statusCodeToText(code int) string {
+	if t := http.StatusText(code); t != "" {
+		return t
+	}
+	return strconv.Itoa(code)
+}
+
+func (br *bodyReader) Read(p []byte) (n int, err error) {
+	if br.closed {
+		if br.truncated {
+			return 0, ErrTruncatedBody
+		}
+		return 0, io.EOF
+	}
+	n = copy(p, br.content)
+	if n > 0 {
+		br.content = br.content[n:]
+		return
+	}
+	if br.truncated {
+		br.closed = true
+		return 0, ErrTruncatedBody
+	}
+	return 0, io.EOF
+}
+
+func (br *bodyReader) Close() error {
+	br.closed = true
+	br.content = nil
+	return nil
+}
+
+// A map of the URL Fetch-accepted methods that take a request body.
+var methodAcceptsRequestBody = map[string]bool{
+	"POST":  true,
+	"PUT":   true,
+	"PATCH": true,
+}
+
+// urlString returns a valid string given a URL. This function is necessary because
+// the String method of URL doesn't correctly handle URLs with non-empty Opaque values.
+// See http://code.google.com/p/go/issues/detail?id=4860.
+func urlString(u *url.URL) string {
+	if u.Opaque == "" || strings.HasPrefix(u.Opaque, "//") {
+		return u.String()
+	}
+	aux := *u
+	aux.Opaque = "//" + aux.Host + aux.Opaque
+	return aux.String()
+}
+
+// RoundTrip issues a single HTTP request and returns its response. Per the
+// http.RoundTripper interface, RoundTrip only returns an error if there
+// was an unsupported request or the URL Fetch proxy fails.
+// Note that HTTP response codes such as 5xx, 403, 404, etc are not
+// errors as far as the transport is concerned and will be returned
+// with err set to nil.
+func (t *Transport) RoundTrip(req *http.Request) (res *http.Response, err error) {
+	methNum, ok := pb.URLFetchRequest_RequestMethod_value[req.Method]
+	if !ok {
+		return nil, fmt.Errorf("urlfetch: unsupported HTTP method %q", req.Method)
+	}
+
+	method := pb.URLFetchRequest_RequestMethod(methNum)
+
+	freq := &pb.URLFetchRequest{
+		Method:                        &method,
+		Url:                           proto.String(urlString(req.URL)),
+		FollowRedirects:               proto.Bool(false), // http.Client's responsibility
+		MustValidateServerCertificate: proto.Bool(!t.AllowInvalidServerCertificate),
+	}
+	if deadline, ok := t.Context.Deadline(); ok {
+		freq.Deadline = proto.Float64(deadline.Sub(time.Now()).Seconds())
+	}
+
+	for k, vals := range req.Header {
+		for _, val := range vals {
+			freq.Header = append(freq.Header, &pb.URLFetchRequest_Header{
+				Key:   proto.String(k),
+				Value: proto.String(val),
+			})
+		}
+	}
+	if methodAcceptsRequestBody[req.Method] && req.Body != nil {
+		// Avoid a []byte copy if req.Body has a Bytes method.
+		switch b := req.Body.(type) {
+		case interface {
+			Bytes() []byte
+		}:
+			freq.Payload = b.Bytes()
+		default:
+			freq.Payload, err = ioutil.ReadAll(req.Body)
+			if err != nil {
+				return nil, err
+			}
+		}
+	}
+
+	fres := &pb.URLFetchResponse{}
+	if err := internal.Call(t.Context, "urlfetch", "Fetch", freq, fres); err != nil {
+		return nil, err
+	}
+
+	res = &http.Response{}
+	res.StatusCode = int(*fres.StatusCode)
+	res.Status = fmt.Sprintf("%d %s", res.StatusCode, statusCodeToText(res.StatusCode))
+	res.Header = make(http.Header)
+	res.Request = req
+
+	// Faked:
+	res.ProtoMajor = 1
+	res.ProtoMinor = 1
+	res.Proto = "HTTP/1.1"
+	res.Close = true
+
+	for _, h := range fres.Header {
+		hkey := http.CanonicalHeaderKey(*h.Key)
+		hval := *h.Value
+		if hkey == "Content-Length" {
+			// Will get filled in below for all but HEAD requests.
+			if req.Method == "HEAD" {
+				res.ContentLength, _ = strconv.ParseInt(hval, 10, 64)
+			}
+			continue
+		}
+		res.Header.Add(hkey, hval)
+	}
+
+	if req.Method != "HEAD" {
+		res.ContentLength = int64(len(fres.Content))
+	}
+
+	truncated := fres.GetContentWasTruncated()
+	res.Body = &bodyReader{content: fres.Content, truncated: truncated}
+	return
+}
+
+func init() {
+	internal.RegisterErrorCodeMap("urlfetch", pb.URLFetchServiceError_ErrorCode_name)
+	internal.RegisterTimeoutErrorCode("urlfetch", int32(pb.URLFetchServiceError_DEADLINE_EXCEEDED))
+}
diff --git a/vendor/google.golang.org/cloud/.travis.yml b/vendor/google.golang.org/cloud/.travis.yml
deleted file mode 100644
index c037df0de..000000000
--- a/vendor/google.golang.org/cloud/.travis.yml
+++ /dev/null
@@ -1,11 +0,0 @@
-sudo: false
-language: go
-go:
-- 1.4
-- 1.5
-install:
-- go get -v google.golang.org/cloud/...
-script:
-- openssl aes-256-cbc -K $encrypted_912ff8fa81ad_key -iv $encrypted_912ff8fa81ad_iv -in key.json.enc -out key.json -d
-- GCLOUD_TESTS_GOLANG_PROJECT_ID="dulcet-port-762" GCLOUD_TESTS_GOLANG_KEY="$(pwd)/key.json"
-  go test -v -tags=integration google.golang.org/cloud/...
diff --git a/vendor/google.golang.org/cloud/AUTHORS b/vendor/google.golang.org/cloud/AUTHORS
deleted file mode 100644
index 3da443dc9..000000000
--- a/vendor/google.golang.org/cloud/AUTHORS
+++ /dev/null
@@ -1,12 +0,0 @@
-# This is the official list of cloud authors for copyright purposes.
-# This file is distinct from the CONTRIBUTORS files.
-# See the latter for an explanation.
-
-# Names should be added to this file as:
-# Name or Organization <email address>
-# The email address is not required for organizations.
-
-Google Inc.
-Palm Stone Games, Inc.
-Péter Szilágyi <peterke@gmail.com>
-Tyler Treat <ttreat31@gmail.com>
diff --git a/vendor/google.golang.org/cloud/CONTRIBUTING.md b/vendor/google.golang.org/cloud/CONTRIBUTING.md
deleted file mode 100644
index 9a1cab287..000000000
--- a/vendor/google.golang.org/cloud/CONTRIBUTING.md
+++ /dev/null
@@ -1,114 +0,0 @@
-# Contributing
-
-1. Sign one of the contributor license agreements below.
-1. `go get golang.org/x/review/git-codereview` to install the code reviewing tool.
-1. Get the cloud package by running `go get -d google.golang.org/cloud`.
-    1. If you have already checked out the source, make sure that the remote git
-       origin is https://code.googlesource.com/gocloud:
-
-            git remote set-url origin https://code.googlesource.com/gocloud
-1. Make changes and create a change by running `git codereview change <name>`,
-provide a command message, and use `git codereview mail` to create a Gerrit CL.
-1. Keep amending to the change and mail as your recieve feedback.
-
-## Integration Tests
-
-Additional to the unit tests, you may run the integration test suite.
-
-To run the integrations tests, creating and configuration of a project in the
-Google Developers Console is required. Once you create a project, set the
-following environment variables to be able to run the against the actual APIs.
-
-- **GCLOUD_TESTS_GOLANG_PROJECT_ID**: Developers Console project's ID (e.g. bamboo-shift-455)
-- **GCLOUD_TESTS_GOLANG_KEY**: The path to the JSON key file.
-
-Create a storage bucket with the same name as the project id set in **GCLOUD_TESTS_GOLANG_PROJECT_ID**.
-The storage integration test will create and delete some objects in this bucket.
-
-Install the [gcloud command-line tool][gcloudcli] to your machine and use it
-to create the indexes used in the datastore integration tests with indexes
-found in `datastore/testdata/index.yaml`:
-
-From the project's root directory:
-
-``` sh
-# Install the app component
-$ gcloud components update app
-
-# Set the default project in your env
-$ gcloud config set project $GCLOUD_TESTS_GOLANG_PROJECT_ID
-
-# Authenticate the gcloud tool with your account
-$ gcloud auth login
-
-# Create the indexes
-$ gcloud preview datastore create-indexes datastore/testdata/index.yaml
-
-```
-
-You can run the integration tests by running:
-
-``` sh
-$ go test -v -tags=integration google.golang.org/cloud/...
-```
-
-## Contributor License Agreements
-
-Before we can accept your pull requests you'll need to sign a Contributor
-License Agreement (CLA):
-
-- **If you are an individual writing original source code** and **you own the
-- intellectual property**, then you'll need to sign an [individual CLA][indvcla].
-- **If you work for a company that wants to allow you to contribute your work**,
-then you'll need to sign a [corporate CLA][corpcla].
-
-You can sign these electronically (just scroll to the bottom). After that,
-we'll be able to accept your pull requests.
-
-## Contributor Code of Conduct
-
-As contributors and maintainers of this project,
-and in the interest of fostering an open and welcoming community,
-we pledge to respect all people who contribute through reporting issues,
-posting feature requests, updating documentation,
-submitting pull requests or patches, and other activities.
-
-We are committed to making participation in this project
-a harassment-free experience for everyone,
-regardless of level of experience, gender, gender identity and expression,
-sexual orientation, disability, personal appearance,
-body size, race, ethnicity, age, religion, or nationality.
-
-Examples of unacceptable behavior by participants include:
-
-* The use of sexualized language or imagery
-* Personal attacks
-* Trolling or insulting/derogatory comments
-* Public or private harassment
-* Publishing other's private information,
-such as physical or electronic
-addresses, without explicit permission
-* Other unethical or unprofessional conduct.
-
-Project maintainers have the right and responsibility to remove, edit, or reject
-comments, commits, code, wiki edits, issues, and other contributions
-that are not aligned to this Code of Conduct.
-By adopting this Code of Conduct,
-project maintainers commit themselves to fairly and consistently
-applying these principles to every aspect of managing this project.
-Project maintainers who do not follow or enforce the Code of Conduct
-may be permanently removed from the project team.
-
-This code of conduct applies both within project spaces and in public spaces
-when an individual is representing the project or its community.
-
-Instances of abusive, harassing, or otherwise unacceptable behavior
-may be reported by opening an issue
-or contacting one or more of the project maintainers.
-
-This Code of Conduct is adapted from the [Contributor Covenant](http://contributor-covenant.org), version 1.2.0,
-available at [http://contributor-covenant.org/version/1/2/0/](http://contributor-covenant.org/version/1/2/0/)
-
-[gcloudcli]: https://developers.google.com/cloud/sdk/gcloud/
-[indvcla]: https://developers.google.com/open-source/cla/individual
-[corpcla]: https://developers.google.com/open-source/cla/corporate
diff --git a/vendor/google.golang.org/cloud/CONTRIBUTORS b/vendor/google.golang.org/cloud/CONTRIBUTORS
deleted file mode 100644
index 475ac6a66..000000000
--- a/vendor/google.golang.org/cloud/CONTRIBUTORS
+++ /dev/null
@@ -1,24 +0,0 @@
-# People who have agreed to one of the CLAs and can contribute patches.
-# The AUTHORS file lists the copyright holders; this file
-# lists people.  For example, Google employees are listed here
-# but not in AUTHORS, because Google holds the copyright.
-#
-# https://developers.google.com/open-source/cla/individual
-# https://developers.google.com/open-source/cla/corporate
-#
-# Names should be added to this file as:
-#     Name <email address>
-
-# Keep the list alphabetically sorted.
-
-Andrew Gerrand <adg@golang.org>
-Brad Fitzpatrick <bradfitz@golang.org>
-Burcu Dogan <jbd@google.com>
-Dave Day <djd@golang.org>
-David Symonds <dsymonds@golang.org>
-Glenn Lewis <gmlewis@google.com>
-Johan Euphrosine <proppy@google.com>
-Luna Duclos <luna.duclos@palmstonegames.com>
-Michael McGreevy <mcgreevy@golang.org>
-Péter Szilágyi <peterke@gmail.com>
-Tyler Treat <ttreat31@gmail.com>
diff --git a/vendor/google.golang.org/cloud/README.md b/vendor/google.golang.org/cloud/README.md
deleted file mode 100644
index 10d3995d5..000000000
--- a/vendor/google.golang.org/cloud/README.md
+++ /dev/null
@@ -1,135 +0,0 @@
-# Google Cloud for Go
-
-[![Build Status](https://travis-ci.org/GoogleCloudPlatform/gcloud-golang.svg?branch=master)](https://travis-ci.org/GoogleCloudPlatform/gcloud-golang)
-
-**NOTE:** These packages are experimental, and may occasionally make
-backwards-incompatible changes.
-
-**NOTE:** Github repo is a mirror of [https://code.googlesource.com/gocloud](https://code.googlesource.com/gocloud).
-
-Go packages for Google Cloud Platform services. Supported APIs include:
-
- * Google Cloud Datastore
- * Google Cloud Storage
- * Google Cloud Pub/Sub
- * Google Cloud Container Engine
-
-``` go
-import "google.golang.org/cloud"
-```
-
-Documentation and examples are available at
-[https://godoc.org/google.golang.org/cloud](https://godoc.org/google.golang.org/cloud).
-
-## Authorization
-
-Authorization, throughout the package, is delegated to the godoc.org/golang.org/x/oauth2.
-Refer to the [godoc documentation](https://godoc.org/golang.org/x/oauth2)
-for examples on using oauth2 with the Cloud package.
-
-## Google Cloud Datastore
-
-[Google Cloud Datastore][cloud-datastore] ([docs][cloud-datastore-docs]) is a fully
-managed, schemaless database for storing non-relational data. Cloud Datastore
-automatically scales with your users and supports ACID transactions, high availability
-of reads and writes, strong consistency for reads and ancestor queries, and eventual
-consistency for all other queries.
-
-Follow the [activation instructions][cloud-datastore-activation] to use the Google
-Cloud Datastore API with your project.
-
-[https://godoc.org/google.golang.org/cloud/datastore](https://godoc.org/google.golang.org/cloud/datastore)
-
-
-```go
-type Post struct {
-	Title       string
-	Body        string `datastore:",noindex"`
-	PublishedAt time.Time
-}
-keys := []*datastore.Key{
-	datastore.NewKey(ctx, "Post", "post1", 0, nil),
-	datastore.NewKey(ctx, "Post", "post2", 0, nil),
-}
-posts := []*Post{
-	{Title: "Post 1", Body: "...", PublishedAt: time.Now()},
-	{Title: "Post 2", Body: "...", PublishedAt: time.Now()},
-}
-if _, err := datastore.PutMulti(ctx, keys, posts); err != nil {
-	log.Println(err)
-}
-```
-
-## Google Cloud Storage
-
-[Google Cloud Storage][cloud-storage] ([docs][cloud-storage-docs]) allows you to store
-data on Google infrastructure with very high reliability, performance and availability,
-and can be used to distribute large data objects to users via direct download.
-
-[https://godoc.org/google.golang.org/cloud/storage](https://godoc.org/google.golang.org/cloud/storage)
-
-
-```go
-// Read the object1 from bucket.
-rc, err := storage.NewReader(ctx, "bucket", "object1")
-if err != nil {
-	log.Fatal(err)
-}
-slurp, err := ioutil.ReadAll(rc)
-rc.Close()
-if err != nil {
-	log.Fatal(err)
-}
-```
-
-## Google Cloud Pub/Sub (Alpha)
-
-> Google Cloud Pub/Sub is in **Alpha status**. As a result, it might change in
-> backward-incompatible ways and is not recommended for production use. It is not
-> subject to any SLA or deprecation policy.
-
-[Google Cloud Pub/Sub][cloud-pubsub] ([docs][cloud-pubsub-docs]) allows you to connect
-your services with reliable, many-to-many, asynchronous messaging hosted on Google's
-infrastructure. Cloud Pub/Sub automatically scales as you need it and provides a foundation
-for building your own robust, global services.
-
-[https://godoc.org/google.golang.org/cloud/pubsub](https://godoc.org/google.golang.org/cloud/pubsub)
-
-
-```go
-// Publish "hello world" on topic1.
-msgIDs, err := pubsub.Publish(ctx, "topic1", &pubsub.Message{
-	Data: []byte("hello world"),
-})
-if err != nil {
-	log.Println(err)
-}
-// Pull messages via subscription1.
-msgs, err := pubsub.Pull(ctx, "subscription1", 1)
-if err != nil {
-	log.Println(err)
-}
-```
-
-## Contributing
-
-Contributions are welcome. Please, see the
-[CONTRIBUTING](https://github.com/GoogleCloudPlatform/gcloud-golang/blob/master/CONTRIBUTING.md)
-document for details. We're using Gerrit for our code reviews. Please don't open pull
-requests against this repo, new pull requests will be automatically closed.
-
-Please note that this project is released with a Contributor Code of Conduct.
-By participating in this project you agree to abide by its terms.
-See [Contributor Code of Conduct](https://github.com/GoogleCloudPlatform/gcloud-golang/blob/master/CONTRIBUTING.md#contributor-code-of-conduct)
-for more information.
-
-[cloud-datastore]: https://cloud.google.com/datastore/
-[cloud-datastore-docs]: https://cloud.google.com/datastore/docs
-[cloud-datastore-activation]: https://cloud.google.com/datastore/docs/activate
-
-[cloud-pubsub]: https://cloud.google.com/pubsub/
-[cloud-pubsub-docs]: https://cloud.google.com/pubsub/docs
-
-[cloud-storage]: https://cloud.google.com/storage/
-[cloud-storage-docs]: https://cloud.google.com/storage/docs/overview
-[cloud-storage-create-bucket]: https://cloud.google.com/storage/docs/cloud-console#_creatingbuckets
diff --git a/vendor/google.golang.org/cloud/cloud.go b/vendor/google.golang.org/cloud/cloud.go
index a634b0552..96d36baf2 100644
--- a/vendor/google.golang.org/cloud/cloud.go
+++ b/vendor/google.golang.org/cloud/cloud.go
@@ -14,7 +14,7 @@
 
 // Package cloud contains Google Cloud Platform APIs related types
 // and common functions.
-package cloud
+package cloud // import "google.golang.org/cloud"
 
 import (
 	"net/http"
diff --git a/vendor/google.golang.org/cloud/compute/metadata/metadata.go b/vendor/google.golang.org/cloud/compute/metadata/metadata.go
index 3dd684e08..972972dd7 100644
--- a/vendor/google.golang.org/cloud/compute/metadata/metadata.go
+++ b/vendor/google.golang.org/cloud/compute/metadata/metadata.go
@@ -17,7 +17,7 @@
 //
 // This package is a wrapper around the GCE metadata service,
 // as documented at https://developers.google.com/compute/docs/metadata.
-package metadata
+package metadata // import "google.golang.org/cloud/compute/metadata"
 
 import (
 	"encoding/json"
diff --git a/vendor/google.golang.org/cloud/key.json.enc b/vendor/google.golang.org/cloud/key.json.enc
deleted file mode 100644
index 2f673a84b..000000000
Binary files a/vendor/google.golang.org/cloud/key.json.enc and /dev/null differ
diff --git a/vendor/google.golang.org/cloud/storage/storage.go b/vendor/google.golang.org/cloud/storage/storage.go
index bf22c6aea..8aa70ff42 100644
--- a/vendor/google.golang.org/cloud/storage/storage.go
+++ b/vendor/google.golang.org/cloud/storage/storage.go
@@ -15,7 +15,7 @@
 // Package storage contains a Google Cloud Storage client.
 //
 // This package is experimental and may make backwards-incompatible changes.
-package storage
+package storage // import "google.golang.org/cloud/storage"
 
 import (
 	"crypto"
diff --git a/vendor/google.golang.org/grpc/.travis.yml b/vendor/google.golang.org/grpc/.travis.yml
deleted file mode 100644
index 055d6641c..000000000
--- a/vendor/google.golang.org/grpc/.travis.yml
+++ /dev/null
@@ -1,13 +0,0 @@
-language: go
-
-before_install:
-  - go get github.com/axw/gocov/gocov
-  - go get github.com/mattn/goveralls
-  - go get golang.org/x/tools/cmd/cover
-
-install:
-  - mkdir -p "$GOPATH/src/google.golang.org"
-  - mv "$TRAVIS_BUILD_DIR" "$GOPATH/src/google.golang.org/grpc"
-
-script:
-  - make test testrace
diff --git a/vendor/google.golang.org/grpc/CONTRIBUTING.md b/vendor/google.golang.org/grpc/CONTRIBUTING.md
deleted file mode 100644
index 407d384a7..000000000
--- a/vendor/google.golang.org/grpc/CONTRIBUTING.md
+++ /dev/null
@@ -1,23 +0,0 @@
-# How to contribute
-
-We definitely welcome patches and contribution to grpc! Here is some guideline
-and information about how to do so.
-
-## Getting started
-
-### Legal requirements
-
-In order to protect both you and ourselves, you will need to sign the
-[Contributor License Agreement](https://cla.developers.google.com/clas).
-
-### Filing Issues
-When filing an issue, make sure to answer these five questions:
-
-1. What version of Go are you using (`go version`)?
-2. What operating system and processor architecture are you using?
-3. What did you do?
-4. What did you expect to see?
-5. What did you see instead?
-
-### Contributing code
-Unless otherwise noted, the Go source files are distributed under the BSD-style license found in the LICENSE file.
diff --git a/vendor/google.golang.org/grpc/Makefile b/vendor/google.golang.org/grpc/Makefile
deleted file mode 100644
index 12e84e4e5..000000000
--- a/vendor/google.golang.org/grpc/Makefile
+++ /dev/null
@@ -1,50 +0,0 @@
-.PHONY: \
-	all \
-	deps \
-	updatedeps \
-	testdeps \
-	updatetestdeps \
-	build \
-	proto \
-	test \
-	testrace \
-	clean \
-
-all: test testrace
-
-deps:
-	go get -d -v google.golang.org/grpc/...
-
-updatedeps:
-	go get -d -v -u -f google.golang.org/grpc/...
-
-testdeps:
-	go get -d -v -t google.golang.org/grpc/...
-
-updatetestdeps:
-	go get -d -v -t -u -f google.golang.org/grpc/...
-
-build: deps
-	go build google.golang.org/grpc/...
-
-proto:
-	@ if ! which protoc > /dev/null; then \
-		echo "error: protoc not installed" >&2; \
-		exit 1; \
-	fi
-	go get -v github.com/golang/protobuf/protoc-gen-go
-	for file in $$(git ls-files '*.proto'); do \
-		protoc -I $$(dirname $$file) --go_out=plugins=grpc:$$(dirname $$file) $$file; \
-	done
-
-test: testdeps
-	go test -v -cpu 1,4 google.golang.org/grpc/...
-
-testrace: testdeps
-	go test -v -race -cpu 1,4 google.golang.org/grpc/...
-
-clean:
-	go clean google.golang.org/grpc/...
-
-coverage: testdeps
-	./coverage.sh --coveralls
diff --git a/vendor/google.golang.org/grpc/README.md b/vendor/google.golang.org/grpc/README.md
deleted file mode 100644
index 37b05f095..000000000
--- a/vendor/google.golang.org/grpc/README.md
+++ /dev/null
@@ -1,32 +0,0 @@
-#gRPC-Go
-
-[![Build Status](https://travis-ci.org/grpc/grpc-go.svg)](https://travis-ci.org/grpc/grpc-go) [![GoDoc](https://godoc.org/google.golang.org/grpc?status.svg)](https://godoc.org/google.golang.org/grpc)
-
-The Go implementation of [gRPC](http://www.grpc.io/): A high performance, open source, general RPC framework that puts mobile and HTTP/2 first. For more information see the [gRPC Quick Start](http://www.grpc.io/docs/) guide.
-
-Installation
-------------
-
-To install this package, you need to install Go 1.4 or above and setup your Go workspace on your computer. The simplest way to install the library is to run:
-
-```
-$ go get google.golang.org/grpc
-```
-
-Prerequisites
--------------
-
-This requires Go 1.4 or above.
-
-Constraints
------------
-The grpc package should only depend on standard Go packages and a small number of exceptions. If your contribution introduces new dependencies which are NOT in the [list](http://godoc.org/google.golang.org/grpc?imports), you need a discussion with gRPC-Go authors and consultants.
-
-Documentation
--------------
-See [API documentation](https://godoc.org/google.golang.org/grpc) for package and API descriptions and find examples in the [examples directory](examples/).
-
-Status
-------
-Beta release
-
diff --git a/vendor/google.golang.org/grpc/codegen.sh b/vendor/google.golang.org/grpc/codegen.sh
deleted file mode 100644
index b00948884..000000000
--- a/vendor/google.golang.org/grpc/codegen.sh
+++ /dev/null
@@ -1,17 +0,0 @@
-#!/bin/bash
-
-# This script serves as an example to demonstrate how to generate the gRPC-Go
-# interface and the related messages from .proto file.
-#
-# It assumes the installation of i) Google proto buffer compiler at
-# https://github.com/google/protobuf (after v2.6.1) and ii) the Go codegen
-# plugin at https://github.com/golang/protobuf (after 2015-02-20). If you have
-# not, please install them first.
-#
-# We recommend running this script at $GOPATH/src.
-#
-# If this is not what you need, feel free to make your own scripts. Again, this
-# script is for demonstration purpose.
-#
-proto=$1
-protoc --go_out=plugins=grpc:. $proto
diff --git a/vendor/google.golang.org/grpc/codes/codes.go b/vendor/google.golang.org/grpc/codes/codes.go
index 37c5b860b..e14b464ac 100644
--- a/vendor/google.golang.org/grpc/codes/codes.go
+++ b/vendor/google.golang.org/grpc/codes/codes.go
@@ -33,7 +33,7 @@
 
 // Package codes defines the canonical error codes used by gRPC. It is
 // consistent across various languages.
-package codes
+package codes // import "google.golang.org/grpc/codes"
 
 // A Code is an unsigned 32-bit error code as defined in the gRPC spec.
 type Code uint32
diff --git a/vendor/google.golang.org/grpc/coverage.sh b/vendor/google.golang.org/grpc/coverage.sh
deleted file mode 100644
index 120235374..000000000
--- a/vendor/google.golang.org/grpc/coverage.sh
+++ /dev/null
@@ -1,47 +0,0 @@
-#!/bin/bash
-
-set -e
-
-workdir=.cover
-profile="$workdir/cover.out"
-mode=set
-end2endtest="google.golang.org/grpc/test"
-
-generate_cover_data() {
-    rm -rf "$workdir"
-    mkdir "$workdir"
-
-    for pkg in "$@"; do
-        if [ $pkg == "google.golang.org/grpc" -o $pkg == "google.golang.org/grpc/transport" -o $pkg == "google.golang.org/grpc/metadata" -o $pkg == "google.golang.org/grpc/credentials" ]
-            then
-                f="$workdir/$(echo $pkg | tr / -)"
-                go test -covermode="$mode" -coverprofile="$f.cover" "$pkg"
-                go test -covermode="$mode" -coverpkg "$pkg" -coverprofile="$f.e2e.cover" "$end2endtest"
-        fi
-    done
-
-    echo "mode: $mode" >"$profile"
-    grep -h -v "^mode:" "$workdir"/*.cover >>"$profile"
-}
-
-show_cover_report() {
-    go tool cover -${1}="$profile"
-}
-
-push_to_coveralls() {
-    goveralls -coverprofile="$profile"
-}
-
-generate_cover_data $(go list ./...)
-show_cover_report func
-case "$1" in
-"")
-    ;;
---html)
-    show_cover_report html ;;
---coveralls)
-    push_to_coveralls ;;
-*)
-    echo >&2 "error: invalid option: $1" ;;
-esac
-rm -rf "$workdir"
diff --git a/vendor/google.golang.org/grpc/credentials/credentials.go b/vendor/google.golang.org/grpc/credentials/credentials.go
index 0b0b89b6a..681f64e44 100644
--- a/vendor/google.golang.org/grpc/credentials/credentials.go
+++ b/vendor/google.golang.org/grpc/credentials/credentials.go
@@ -35,7 +35,7 @@
 // which encapsulate all the state needed by a client to authenticate with a
 // server and make various assertions, e.g., about the client's identity, role,
 // or whether it is authorized to make a particular call.
-package credentials
+package credentials // import "google.golang.org/grpc/credentials"
 
 import (
 	"crypto/tls"
diff --git a/vendor/google.golang.org/grpc/doc.go b/vendor/google.golang.org/grpc/doc.go
index b4c0e740e..a35f21885 100644
--- a/vendor/google.golang.org/grpc/doc.go
+++ b/vendor/google.golang.org/grpc/doc.go
@@ -3,4 +3,4 @@ Package grpc implements an RPC system called gRPC.
 
 See www.grpc.io for more information about gRPC.
 */
-package grpc
+package grpc // import "google.golang.org/grpc"
diff --git a/vendor/google.golang.org/grpc/grpclog/logger.go b/vendor/google.golang.org/grpc/grpclog/logger.go
index 2cc09be48..3b2933079 100644
--- a/vendor/google.golang.org/grpc/grpclog/logger.go
+++ b/vendor/google.golang.org/grpc/grpclog/logger.go
@@ -34,7 +34,7 @@
 /*
 Package grpclog defines logging for grpc.
 */
-package grpclog
+package grpclog // import "google.golang.org/grpc/grpclog"
 
 import (
 	"log"
diff --git a/vendor/google.golang.org/grpc/metadata/metadata.go b/vendor/google.golang.org/grpc/metadata/metadata.go
index 58469ddd3..52070dbec 100644
--- a/vendor/google.golang.org/grpc/metadata/metadata.go
+++ b/vendor/google.golang.org/grpc/metadata/metadata.go
@@ -32,7 +32,7 @@
  */
 
 // Package metadata define the structure of the metadata supported by gRPC library.
-package metadata
+package metadata // import "google.golang.org/grpc/metadata"
 
 import (
 	"encoding/base64"
diff --git a/vendor/google.golang.org/grpc/transport/transport.go b/vendor/google.golang.org/grpc/transport/transport.go
index f027cae55..6eca1b3b4 100644
--- a/vendor/google.golang.org/grpc/transport/transport.go
+++ b/vendor/google.golang.org/grpc/transport/transport.go
@@ -35,7 +35,7 @@
 Package transport defines and implements message oriented communication channel
 to complete various transactions (e.g., an RPC).
 */
-package transport
+package transport // import "google.golang.org/grpc/transport"
 
 import (
 	"bytes"
diff --git a/vendor/gopkg.in/check.v1/.gitignore b/vendor/gopkg.in/check.v1/.gitignore
deleted file mode 100644
index 191a5360b..000000000
--- a/vendor/gopkg.in/check.v1/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-_*
-*.swp
-*.[568]
-[568].out
diff --git a/vendor/gopkg.in/check.v1/README.md b/vendor/gopkg.in/check.v1/README.md
deleted file mode 100644
index 0ca9e5726..000000000
--- a/vendor/gopkg.in/check.v1/README.md
+++ /dev/null
@@ -1,20 +0,0 @@
-Instructions
-============
-
-Install the package with:
-
-    go get gopkg.in/check.v1
-    
-Import it with:
-
-    import "gopkg.in/check.v1"
-
-and use _check_ as the package name inside the code.
-
-For more details, visit the project page:
-
-* http://labix.org/gocheck
-
-and the API documentation:
-
-* https://gopkg.in/check.v1
diff --git a/vendor/gopkg.in/check.v1/TODO b/vendor/gopkg.in/check.v1/TODO
deleted file mode 100644
index 33498270e..000000000
--- a/vendor/gopkg.in/check.v1/TODO
+++ /dev/null
@@ -1,2 +0,0 @@
-- Assert(slice, Contains, item)
-- Parallel test support
diff --git a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/LICENSE b/vendor/gopkg.in/square/go-jose.v1/LICENSE
similarity index 100%
rename from vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/LICENSE
rename to vendor/gopkg.in/square/go-jose.v1/LICENSE
diff --git a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/asymmetric.go b/vendor/gopkg.in/square/go-jose.v1/asymmetric.go
similarity index 100%
rename from vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/asymmetric.go
rename to vendor/gopkg.in/square/go-jose.v1/asymmetric.go
diff --git a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/cipher/cbc_hmac.go b/vendor/gopkg.in/square/go-jose.v1/cipher/cbc_hmac.go
similarity index 100%
rename from vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/cipher/cbc_hmac.go
rename to vendor/gopkg.in/square/go-jose.v1/cipher/cbc_hmac.go
diff --git a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/cipher/concat_kdf.go b/vendor/gopkg.in/square/go-jose.v1/cipher/concat_kdf.go
similarity index 100%
rename from vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/cipher/concat_kdf.go
rename to vendor/gopkg.in/square/go-jose.v1/cipher/concat_kdf.go
diff --git a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/cipher/ecdh_es.go b/vendor/gopkg.in/square/go-jose.v1/cipher/ecdh_es.go
similarity index 100%
rename from vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/cipher/ecdh_es.go
rename to vendor/gopkg.in/square/go-jose.v1/cipher/ecdh_es.go
diff --git a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/cipher/key_wrap.go b/vendor/gopkg.in/square/go-jose.v1/cipher/key_wrap.go
similarity index 100%
rename from vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/cipher/key_wrap.go
rename to vendor/gopkg.in/square/go-jose.v1/cipher/key_wrap.go
diff --git a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/crypter.go b/vendor/gopkg.in/square/go-jose.v1/crypter.go
similarity index 100%
rename from vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/crypter.go
rename to vendor/gopkg.in/square/go-jose.v1/crypter.go
diff --git a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/doc.go b/vendor/gopkg.in/square/go-jose.v1/doc.go
similarity index 100%
rename from vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/doc.go
rename to vendor/gopkg.in/square/go-jose.v1/doc.go
diff --git a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/encoding.go b/vendor/gopkg.in/square/go-jose.v1/encoding.go
similarity index 100%
rename from vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/encoding.go
rename to vendor/gopkg.in/square/go-jose.v1/encoding.go
diff --git a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/json/LICENSE b/vendor/gopkg.in/square/go-jose.v1/json/LICENSE
similarity index 100%
rename from vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/json/LICENSE
rename to vendor/gopkg.in/square/go-jose.v1/json/LICENSE
diff --git a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/json/decode.go b/vendor/gopkg.in/square/go-jose.v1/json/decode.go
similarity index 100%
rename from vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/json/decode.go
rename to vendor/gopkg.in/square/go-jose.v1/json/decode.go
diff --git a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/json/encode.go b/vendor/gopkg.in/square/go-jose.v1/json/encode.go
similarity index 100%
rename from vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/json/encode.go
rename to vendor/gopkg.in/square/go-jose.v1/json/encode.go
diff --git a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/json/indent.go b/vendor/gopkg.in/square/go-jose.v1/json/indent.go
similarity index 100%
rename from vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/json/indent.go
rename to vendor/gopkg.in/square/go-jose.v1/json/indent.go
diff --git a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/json/scanner.go b/vendor/gopkg.in/square/go-jose.v1/json/scanner.go
similarity index 100%
rename from vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/json/scanner.go
rename to vendor/gopkg.in/square/go-jose.v1/json/scanner.go
diff --git a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/json/stream.go b/vendor/gopkg.in/square/go-jose.v1/json/stream.go
similarity index 100%
rename from vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/json/stream.go
rename to vendor/gopkg.in/square/go-jose.v1/json/stream.go
diff --git a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/json/tags.go b/vendor/gopkg.in/square/go-jose.v1/json/tags.go
similarity index 100%
rename from vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/json/tags.go
rename to vendor/gopkg.in/square/go-jose.v1/json/tags.go
diff --git a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/json_fork.go b/vendor/gopkg.in/square/go-jose.v1/json_fork.go
similarity index 100%
rename from vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/json_fork.go
rename to vendor/gopkg.in/square/go-jose.v1/json_fork.go
diff --git a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/json_std.go b/vendor/gopkg.in/square/go-jose.v1/json_std.go
similarity index 100%
rename from vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/json_std.go
rename to vendor/gopkg.in/square/go-jose.v1/json_std.go
diff --git a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/jwe.go b/vendor/gopkg.in/square/go-jose.v1/jwe.go
similarity index 100%
rename from vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/jwe.go
rename to vendor/gopkg.in/square/go-jose.v1/jwe.go
diff --git a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/jwk.go b/vendor/gopkg.in/square/go-jose.v1/jwk.go
similarity index 100%
rename from vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/jwk.go
rename to vendor/gopkg.in/square/go-jose.v1/jwk.go
diff --git a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/jws.go b/vendor/gopkg.in/square/go-jose.v1/jws.go
similarity index 100%
rename from vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/jws.go
rename to vendor/gopkg.in/square/go-jose.v1/jws.go
diff --git a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/shared.go b/vendor/gopkg.in/square/go-jose.v1/shared.go
similarity index 100%
rename from vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/shared.go
rename to vendor/gopkg.in/square/go-jose.v1/shared.go
diff --git a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/signing.go b/vendor/gopkg.in/square/go-jose.v1/signing.go
similarity index 100%
rename from vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/signing.go
rename to vendor/gopkg.in/square/go-jose.v1/signing.go
diff --git a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/symmetric.go b/vendor/gopkg.in/square/go-jose.v1/symmetric.go
similarity index 100%
rename from vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/symmetric.go
rename to vendor/gopkg.in/square/go-jose.v1/symmetric.go
diff --git a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/utils.go b/vendor/gopkg.in/square/go-jose.v1/utils.go
similarity index 100%
rename from vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/utils.go
rename to vendor/gopkg.in/square/go-jose.v1/utils.go
diff --git a/vendor/gopkg.in/yaml.v2/LICENSE.libyaml b/vendor/gopkg.in/yaml.v2/LICENSE.libyaml
deleted file mode 100644
index 8da58fbf6..000000000
--- a/vendor/gopkg.in/yaml.v2/LICENSE.libyaml
+++ /dev/null
@@ -1,31 +0,0 @@
-The following files were ported to Go from C files of libyaml, and thus
-are still covered by their original copyright and license:
-
-    apic.go
-    emitterc.go
-    parserc.go
-    readerc.go
-    scannerc.go
-    writerc.go
-    yamlh.go
-    yamlprivateh.go
-
-Copyright (c) 2006 Kirill Simonov
-
-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/gopkg.in/yaml.v2/README.md b/vendor/gopkg.in/yaml.v2/README.md
deleted file mode 100644
index d6c919e60..000000000
--- a/vendor/gopkg.in/yaml.v2/README.md
+++ /dev/null
@@ -1,128 +0,0 @@
-# YAML support for the Go language
-
-Introduction
-------------
-
-The yaml package enables Go programs to comfortably encode and decode YAML
-values. It was developed within [Canonical](https://www.canonical.com) as
-part of the [juju](https://juju.ubuntu.com) project, and is based on a
-pure Go port of the well-known [libyaml](http://pyyaml.org/wiki/LibYAML)
-C library to parse and generate YAML data quickly and reliably.
-
-Compatibility
--------------
-
-The yaml package supports most of YAML 1.1 and 1.2, including support for
-anchors, tags, map merging, etc. Multi-document unmarshalling is not yet
-implemented, and base-60 floats from YAML 1.1 are purposefully not
-supported since they're a poor design and are gone in YAML 1.2.
-
-Installation and usage
-----------------------
-
-The import path for the package is *gopkg.in/yaml.v2*.
-
-To install it, run:
-
-    go get gopkg.in/yaml.v2
-
-API documentation
------------------
-
-If opened in a browser, the import path itself leads to the API documentation:
-
-  * [https://gopkg.in/yaml.v2](https://gopkg.in/yaml.v2)
-
-API stability
--------------
-
-The package API for yaml v2 will remain stable as described in [gopkg.in](https://gopkg.in).
-
-
-License
--------
-
-The yaml package is licensed under the LGPL with an exception that allows it to be linked statically. Please see the LICENSE file for details.
-
-
-Example
--------
-
-```Go
-package main
-
-import (
-        "fmt"
-        "log"
-
-        "gopkg.in/yaml.v2"
-)
-
-var data = `
-a: Easy!
-b:
-  c: 2
-  d: [3, 4]
-`
-
-type T struct {
-        A string
-        B struct{C int; D []int ",flow"}
-}
-
-func main() {
-        t := T{}
-    
-        err := yaml.Unmarshal([]byte(data), &t)
-        if err != nil {
-                log.Fatalf("error: %v", err)
-        }
-        fmt.Printf("--- t:\n%v\n\n", t)
-    
-        d, err := yaml.Marshal(&t)
-        if err != nil {
-                log.Fatalf("error: %v", err)
-        }
-        fmt.Printf("--- t dump:\n%s\n\n", string(d))
-    
-        m := make(map[interface{}]interface{})
-    
-        err = yaml.Unmarshal([]byte(data), &m)
-        if err != nil {
-                log.Fatalf("error: %v", err)
-        }
-        fmt.Printf("--- m:\n%v\n\n", m)
-    
-        d, err = yaml.Marshal(&m)
-        if err != nil {
-                log.Fatalf("error: %v", err)
-        }
-        fmt.Printf("--- m dump:\n%s\n\n", string(d))
-}
-```
-
-This example will generate the following output:
-
-```
---- t:
-{Easy! {2 [3 4]}}
-
---- t dump:
-a: Easy!
-b:
-  c: 2
-  d: [3, 4]
-
-
---- m:
-map[a:Easy! b:map[c:2 d:[3 4]]]
-
---- m dump:
-a: Easy!
-b:
-  c: 2
-  d:
-  - 3
-  - 4
-```
-
diff --git a/vendor/rsc.io/letsencrypt/README b/vendor/rsc.io/letsencrypt/README
deleted file mode 100644
index 98a875f37..000000000
--- a/vendor/rsc.io/letsencrypt/README
+++ /dev/null
@@ -1,152 +0,0 @@
-package letsencrypt // import "rsc.io/letsencrypt"
-
-Package letsencrypt obtains TLS certificates from LetsEncrypt.org.
-
-LetsEncrypt.org is a service that issues free SSL/TLS certificates to
-servers that can prove control over the given domain's DNS records or the
-servers pointed at by those records.
-
-
-Quick Start
-
-A complete HTTP/HTTPS web server using TLS certificates from
-LetsEncrypt.org, redirecting all HTTP access to HTTPS, and maintaining TLS
-certificates in a file letsencrypt.cache across server restarts.
-
-    package main
-
-    import (
-    	"fmt"
-    	"log"
-    	"net/http"
-    	"rsc.io/letsencrypt"
-    )
-
-    func main() {
-    	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
-    		fmt.Fprintf(w, "Hello, TLS!\n")
-    	})
-    	var m letsencrypt.Manager
-    	if err := m.CacheFile("letsencrypt.cache"); err != nil {
-    		log.Fatal(err)
-    	}
-    	log.Fatal(m.Serve())
-    }
-
-
-Overview
-
-The fundamental type in this package is the Manager, which manages obtaining
-and refreshing a collection of TLS certificates, typically for use by an
-HTTPS server. The example above shows the most basic use of a Manager. The
-use can be customized by calling additional methods of the Manager.
-
-
-Registration
-
-A Manager m registers anonymously with LetsEncrypt.org, including agreeing
-to the letsencrypt.org terms of service, the first time it needs to obtain a
-certificate. To register with a particular email address and with the option
-of a prompt for agreement with the terms of service, call m.Register.
-
-
-GetCertificate
-
-The Manager's GetCertificate method returns certificates from the Manager's
-cache, filling the cache by requesting certificates from LetsEncrypt.org. In
-this way, a server with a tls.Config.GetCertificate set to m.GetCertificate
-will demand load a certificate for any host name it serves. To force loading
-of certificates ahead of time, install m.GetCertificate as before but then
-call m.Cert for each host name.
-
-A Manager can only obtain a certificate for a given host name if it can
-prove control of that host name to LetsEncrypt.org. By default it proves
-control by answering an HTTPS-based challenge: when the LetsEncrypt.org
-servers connect to the named host on port 443 (HTTPS), the TLS SNI handshake
-must use m.GetCertificate to obtain a per-host certificate. The most common
-way to satisfy this requirement is for the host name to resolve to the IP
-address of a (single) computer running m.ServeHTTPS, or at least running a
-Go TLS server with tls.Config.GetCertificate set to m.GetCertificate.
-However, other configurations are possible. For example, a group of machines
-could use an implementation of tls.Config.GetCertificate that cached
-certificates but handled cache misses by making RPCs to a Manager m on an
-elected leader machine.
-
-In typical usage, then, the setting of tls.Config.GetCertificate to
-m.GetCertificate serves two purposes: it provides certificates to the TLS
-server for ordinary serving, and it also answers challenges to prove
-ownership of the domains in order to obtain those certificates.
-
-To force the loading of a certificate for a given host into the Manager's
-cache, use m.Cert.
-
-
-Persistent Storage
-
-If a server always starts with a zero Manager m, the server effectively
-fetches a new certificate for each of its host name from LetsEncrypt.org on
-each restart. This is unfortunate both because the server cannot start if
-LetsEncrypt.org is unavailable and because LetsEncrypt.org limits how often
-it will issue a certificate for a given host name (at time of writing, the
-limit is 5 per week for a given host name). To save server state proactively
-to a cache file and to reload the server state from that same file when
-creating a new manager, call m.CacheFile with the name of the file to use.
-
-For alternate storage uses, m.Marshal returns the current state of the
-Manager as an opaque string, m.Unmarshal sets the state of the Manager using
-a string previously returned by m.Marshal (usually a different m), and
-m.Watch returns a channel that receives notifications about state changes.
-
-
-Limits
-
-To avoid hitting basic rate limits on LetsEncrypt.org, a given Manager
-limits all its interactions to at most one request every minute, with an
-initial allowed burst of 20 requests.
-
-By default, if GetCertificate is asked for a certificate it does not have,
-it will in turn ask LetsEncrypt.org for that certificate. This opens a
-potential attack where attackers connect to a server by IP address and
-pretend to be asking for an incorrect host name. Then GetCertificate will
-attempt to obtain a certificate for that host, incorrectly, eventually
-hitting LetsEncrypt.org's rate limit for certificate requests and making it
-impossible to obtain actual certificates. Because servers hold certificates
-for months at a time, however, an attack would need to be sustained over a
-time period of at least a month in order to cause real problems.
-
-To mitigate this kind of attack, a given Manager limits itself to an average
-of one certificate request for a new host every three hours, with an initial
-allowed burst of up to 20 requests. Long-running servers will therefore stay
-within the LetsEncrypt.org limit of 300 failed requests per month.
-Certificate refreshes are not subject to this limit.
-
-To eliminate the attack entirely, call m.SetHosts to enumerate the exact set
-of hosts that are allowed in certificate requests.
-
-
-Web Servers
-
-The basic requirement for use of a Manager is that there be an HTTPS server
-running on port 443 and calling m.GetCertificate to obtain TLS certificates.
-Using standard primitives, the way to do this is:
-
-    srv := &http.Server{
-    	Addr: ":https",
-    	TLSConfig: &tls.Config{
-    		GetCertificate: m.GetCertificate,
-    	},
-    }
-    srv.ListenAndServeTLS("", "")
-
-However, this pattern of serving HTTPS with demand-loaded TLS certificates
-comes up enough to wrap into a single method m.ServeHTTPS.
-
-Similarly, many HTTPS servers prefer to redirect HTTP clients to the HTTPS
-URLs. That functionality is provided by RedirectHTTP.
-
-The combination of serving HTTPS with demand-loaded TLS certificates and
-serving HTTPS redirects to HTTP clients is provided by m.Serve, as used in
-the original example above.
-
-func RedirectHTTP(w http.ResponseWriter, r *http.Request)
-type Manager struct { ... }
diff --git a/vendor/rsc.io/letsencrypt/lets.go b/vendor/rsc.io/letsencrypt/lets.go
index 3a8453630..2e5f81fc9 100644
--- a/vendor/rsc.io/letsencrypt/lets.go
+++ b/vendor/rsc.io/letsencrypt/lets.go
@@ -8,6 +8,30 @@
 // that can prove control over the given domain's DNS records or
 // the servers pointed at by those records.
 //
+// Warning
+//
+// Like any other random code you find on the internet, this package should
+// not be relied upon in important, production systems without thorough testing
+// to ensure that it meets your needs.
+//
+// In the long term you should be using
+// https://golang.org/x/crypto/acme/autocert instead of this package.
+// Send improvements there, not here.
+//
+// This is a package that I wrote for my own personal web sites (swtch.com, rsc.io)
+// in a hurry when my paid-for SSL certificate was expiring. It has no tests,
+// has barely been used, and there is some anecdotal evidence that it does
+// not properly renew certificates in a timely fashion, so servers that run for
+// more than 3 months may run into trouble.
+// I don't run this code anymore: to simplify maintenance, I moved the sites
+// off of Ubuntu VMs and onto Google App Engine, configured with inexpensive
+// long-term certificates purchased from cheapsslsecurity.com.
+//
+// This package was interesting primarily as an example of how simple the API
+// for using LetsEncrypt.org could be made, in contrast to the low-level
+// implementations that existed at the time. In that respect, it helped inform
+// the design of the golang.org/x/crypto/acme/autocert package.
+//
 // Quick Start
 //
 // A complete HTTP/HTTPS web server using TLS certificates from LetsEncrypt.org,
@@ -428,7 +452,9 @@ func (m *Manager) register(email string, prompt func(string) bool) error {
 // Consequently, the state should be kept private.
 func (m *Manager) Marshal() string {
 	m.init()
+	m.mu.Lock()
 	js, err := json.MarshalIndent(&m.state, "", "\t")
+	m.mu.Unlock()
 	if err != nil {
 		panic("unexpected json.Marshal failure")
 	}
@@ -450,7 +476,9 @@ func (m *Manager) Unmarshal(enc string) error {
 		}
 		st.key = key
 	}
+	m.mu.Lock()
 	m.state = st
+	m.mu.Unlock()
 	for host, cert := range m.state.Certs {
 		c, err := cert.toTLS()
 		if err != nil {
@@ -700,7 +728,7 @@ type tlsProvider struct {
 }
 
 func (p tlsProvider) Present(domain, token, keyAuth string) error {
-	cert, dom, err := acme.TLSSNI01ChallengeCertDomain(keyAuth)
+	cert, dom, err := acme.TLSSNI01ChallengeCert(keyAuth)
 	if err != nil {
 		return err
 	}
@@ -713,7 +741,7 @@ func (p tlsProvider) Present(domain, token, keyAuth string) error {
 }
 
 func (p tlsProvider) CleanUp(domain, token, keyAuth string) error {
-	_, dom, err := acme.TLSSNI01ChallengeCertDomain(keyAuth)
+	_, dom, err := acme.TLSSNI01ChallengeCert(keyAuth)
 	if err != nil {
 		return err
 	}
diff --git a/vendor/rsc.io/letsencrypt/vendor/github.com/xenolf/lego/acme/client_test.go b/vendor/rsc.io/letsencrypt/vendor/github.com/xenolf/lego/acme/client_test.go
deleted file mode 100644
index e309554f3..000000000
--- a/vendor/rsc.io/letsencrypt/vendor/github.com/xenolf/lego/acme/client_test.go
+++ /dev/null
@@ -1,198 +0,0 @@
-package acme
-
-import (
-	"crypto"
-	"crypto/rand"
-	"crypto/rsa"
-	"encoding/json"
-	"net"
-	"net/http"
-	"net/http/httptest"
-	"strings"
-	"testing"
-)
-
-func TestNewClient(t *testing.T) {
-	keyBits := 32 // small value keeps test fast
-	keyType := RSA2048
-	key, err := rsa.GenerateKey(rand.Reader, keyBits)
-	if err != nil {
-		t.Fatal("Could not generate test key:", err)
-	}
-	user := mockUser{
-		email:      "test@test.com",
-		regres:     new(RegistrationResource),
-		privatekey: key,
-	}
-
-	ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
-		data, _ := json.Marshal(directory{NewAuthzURL: "http://test", NewCertURL: "http://test", NewRegURL: "http://test", RevokeCertURL: "http://test"})
-		w.Write(data)
-	}))
-
-	client, err := NewClient(ts.URL, user, keyType)
-	if err != nil {
-		t.Fatalf("Could not create client: %v", err)
-	}
-
-	if client.jws == nil {
-		t.Fatalf("Expected client.jws to not be nil")
-	}
-	if expected, actual := key, client.jws.privKey; actual != expected {
-		t.Errorf("Expected jws.privKey to be %p but was %p", expected, actual)
-	}
-
-	if client.keyType != keyType {
-		t.Errorf("Expected keyType to be %s but was %s", keyType, client.keyType)
-	}
-
-	if expected, actual := 2, len(client.solvers); actual != expected {
-		t.Fatalf("Expected %d solver(s), got %d", expected, actual)
-	}
-}
-
-func TestClientOptPort(t *testing.T) {
-	keyBits := 32 // small value keeps test fast
-	key, err := rsa.GenerateKey(rand.Reader, keyBits)
-	if err != nil {
-		t.Fatal("Could not generate test key:", err)
-	}
-	user := mockUser{
-		email:      "test@test.com",
-		regres:     new(RegistrationResource),
-		privatekey: key,
-	}
-
-	ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
-		data, _ := json.Marshal(directory{NewAuthzURL: "http://test", NewCertURL: "http://test", NewRegURL: "http://test", RevokeCertURL: "http://test"})
-		w.Write(data)
-	}))
-
-	optPort := "1234"
-	optHost := ""
-	client, err := NewClient(ts.URL, user, RSA2048)
-	if err != nil {
-		t.Fatalf("Could not create client: %v", err)
-	}
-	client.SetHTTPAddress(net.JoinHostPort(optHost, optPort))
-	client.SetTLSAddress(net.JoinHostPort(optHost, optPort))
-
-	httpSolver, ok := client.solvers[HTTP01].(*httpChallenge)
-	if !ok {
-		t.Fatal("Expected http-01 solver to be httpChallenge type")
-	}
-	if httpSolver.jws != client.jws {
-		t.Error("Expected http-01 to have same jws as client")
-	}
-	if got := httpSolver.provider.(*HTTPProviderServer).port; got != optPort {
-		t.Errorf("Expected http-01 to have port %s but was %s", optPort, got)
-	}
-	if got := httpSolver.provider.(*HTTPProviderServer).iface; got != optHost {
-		t.Errorf("Expected http-01 to have iface %s but was %s", optHost, got)
-	}
-
-	httpsSolver, ok := client.solvers[TLSSNI01].(*tlsSNIChallenge)
-	if !ok {
-		t.Fatal("Expected tls-sni-01 solver to be httpChallenge type")
-	}
-	if httpsSolver.jws != client.jws {
-		t.Error("Expected tls-sni-01 to have same jws as client")
-	}
-	if got := httpsSolver.provider.(*TLSProviderServer).port; got != optPort {
-		t.Errorf("Expected tls-sni-01 to have port %s but was %s", optPort, got)
-	}
-	if got := httpsSolver.provider.(*TLSProviderServer).iface; got != optHost {
-		t.Errorf("Expected tls-sni-01 to have port %s but was %s", optHost, got)
-	}
-
-	// test setting different host
-	optHost = "127.0.0.1"
-	client.SetHTTPAddress(net.JoinHostPort(optHost, optPort))
-	client.SetTLSAddress(net.JoinHostPort(optHost, optPort))
-
-	if got := httpSolver.provider.(*HTTPProviderServer).iface; got != optHost {
-		t.Errorf("Expected http-01 to have iface %s but was %s", optHost, got)
-	}
-	if got := httpsSolver.provider.(*TLSProviderServer).port; got != optPort {
-		t.Errorf("Expected tls-sni-01 to have port %s but was %s", optPort, got)
-	}
-}
-
-func TestValidate(t *testing.T) {
-	var statuses []string
-	ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
-		// Minimal stub ACME server for validation.
-		w.Header().Add("Replay-Nonce", "12345")
-		w.Header().Add("Retry-After", "0")
-		switch r.Method {
-		case "HEAD":
-		case "POST":
-			st := statuses[0]
-			statuses = statuses[1:]
-			writeJSONResponse(w, &challenge{Type: "http-01", Status: st, URI: "http://example.com/", Token: "token"})
-
-		case "GET":
-			st := statuses[0]
-			statuses = statuses[1:]
-			writeJSONResponse(w, &challenge{Type: "http-01", Status: st, URI: "http://example.com/", Token: "token"})
-
-		default:
-			http.Error(w, r.Method, http.StatusMethodNotAllowed)
-		}
-	}))
-	defer ts.Close()
-
-	privKey, _ := rsa.GenerateKey(rand.Reader, 512)
-	j := &jws{privKey: privKey, directoryURL: ts.URL}
-
-	tsts := []struct {
-		name     string
-		statuses []string
-		want     string
-	}{
-		{"POST-unexpected", []string{"weird"}, "unexpected"},
-		{"POST-valid", []string{"valid"}, ""},
-		{"POST-invalid", []string{"invalid"}, "Error Detail"},
-		{"GET-unexpected", []string{"pending", "weird"}, "unexpected"},
-		{"GET-valid", []string{"pending", "valid"}, ""},
-		{"GET-invalid", []string{"pending", "invalid"}, "Error Detail"},
-	}
-
-	for _, tst := range tsts {
-		statuses = tst.statuses
-		if err := validate(j, "example.com", ts.URL, challenge{Type: "http-01", Token: "token"}); err == nil && tst.want != "" {
-			t.Errorf("[%s] validate: got error %v, want something with %q", tst.name, err, tst.want)
-		} else if err != nil && !strings.Contains(err.Error(), tst.want) {
-			t.Errorf("[%s] validate: got error %v, want something with %q", tst.name, err, tst.want)
-		}
-	}
-}
-
-// writeJSONResponse marshals the body as JSON and writes it to the response.
-func writeJSONResponse(w http.ResponseWriter, body interface{}) {
-	bs, err := json.Marshal(body)
-	if err != nil {
-		http.Error(w, err.Error(), http.StatusInternalServerError)
-		return
-	}
-
-	w.Header().Set("Content-Type", "application/json")
-	if _, err := w.Write(bs); err != nil {
-		http.Error(w, err.Error(), http.StatusInternalServerError)
-	}
-}
-
-// stubValidate is like validate, except it does nothing.
-func stubValidate(j *jws, domain, uri string, chlng challenge) error {
-	return nil
-}
-
-type mockUser struct {
-	email      string
-	regres     *RegistrationResource
-	privatekey *rsa.PrivateKey
-}
-
-func (u mockUser) GetEmail() string                       { return u.email }
-func (u mockUser) GetRegistration() *RegistrationResource { return u.regres }
-func (u mockUser) GetPrivateKey() crypto.PrivateKey       { return u.privatekey }
diff --git a/vendor/rsc.io/letsencrypt/vendor/github.com/xenolf/lego/acme/crypto_test.go b/vendor/rsc.io/letsencrypt/vendor/github.com/xenolf/lego/acme/crypto_test.go
deleted file mode 100644
index d2fc5088b..000000000
--- a/vendor/rsc.io/letsencrypt/vendor/github.com/xenolf/lego/acme/crypto_test.go
+++ /dev/null
@@ -1,93 +0,0 @@
-package acme
-
-import (
-	"bytes"
-	"crypto/rand"
-	"crypto/rsa"
-	"testing"
-	"time"
-)
-
-func TestGeneratePrivateKey(t *testing.T) {
-	key, err := generatePrivateKey(RSA2048)
-	if err != nil {
-		t.Error("Error generating private key:", err)
-	}
-	if key == nil {
-		t.Error("Expected key to not be nil, but it was")
-	}
-}
-
-func TestGenerateCSR(t *testing.T) {
-	key, err := rsa.GenerateKey(rand.Reader, 512)
-	if err != nil {
-		t.Fatal("Error generating private key:", err)
-	}
-
-	csr, err := generateCsr(key, "fizz.buzz", nil)
-	if err != nil {
-		t.Error("Error generating CSR:", err)
-	}
-	if csr == nil || len(csr) == 0 {
-		t.Error("Expected CSR with data, but it was nil or length 0")
-	}
-}
-
-func TestPEMEncode(t *testing.T) {
-	buf := bytes.NewBufferString("TestingRSAIsSoMuchFun")
-
-	reader := MockRandReader{b: buf}
-	key, err := rsa.GenerateKey(reader, 32)
-	if err != nil {
-		t.Fatal("Error generating private key:", err)
-	}
-
-	data := pemEncode(key)
-
-	if data == nil {
-		t.Fatal("Expected result to not be nil, but it was")
-	}
-	if len(data) != 127 {
-		t.Errorf("Expected PEM encoding to be length 127, but it was %d", len(data))
-	}
-}
-
-func TestPEMCertExpiration(t *testing.T) {
-	privKey, err := generatePrivateKey(RSA2048)
-	if err != nil {
-		t.Fatal("Error generating private key:", err)
-	}
-
-	expiration := time.Now().Add(365)
-	expiration = expiration.Round(time.Second)
-	certBytes, err := generateDerCert(privKey.(*rsa.PrivateKey), expiration, "test.com")
-	if err != nil {
-		t.Fatal("Error generating cert:", err)
-	}
-
-	buf := bytes.NewBufferString("TestingRSAIsSoMuchFun")
-
-	// Some random string should return an error.
-	if ctime, err := GetPEMCertExpiration(buf.Bytes()); err == nil {
-		t.Errorf("Expected getCertExpiration to return an error for garbage string but returned %v", ctime)
-	}
-
-	// A DER encoded certificate should return an error.
-	if _, err := GetPEMCertExpiration(certBytes); err == nil {
-		t.Errorf("Expected getCertExpiration to return an error for DER certificates but returned none.")
-	}
-
-	// A PEM encoded certificate should work ok.
-	pemCert := pemEncode(derCertificateBytes(certBytes))
-	if ctime, err := GetPEMCertExpiration(pemCert); err != nil || !ctime.Equal(expiration.UTC()) {
-		t.Errorf("Expected getCertExpiration to return %v but returned %v. Error: %v", expiration, ctime, err)
-	}
-}
-
-type MockRandReader struct {
-	b *bytes.Buffer
-}
-
-func (r MockRandReader) Read(p []byte) (int, error) {
-	return r.b.Read(p)
-}
diff --git a/vendor/rsc.io/letsencrypt/vendor/github.com/xenolf/lego/acme/http_challenge_test.go b/vendor/rsc.io/letsencrypt/vendor/github.com/xenolf/lego/acme/http_challenge_test.go
deleted file mode 100644
index fdd8f4d27..000000000
--- a/vendor/rsc.io/letsencrypt/vendor/github.com/xenolf/lego/acme/http_challenge_test.go
+++ /dev/null
@@ -1,57 +0,0 @@
-package acme
-
-import (
-	"crypto/rand"
-	"crypto/rsa"
-	"io/ioutil"
-	"strings"
-	"testing"
-)
-
-func TestHTTPChallenge(t *testing.T) {
-	privKey, _ := rsa.GenerateKey(rand.Reader, 512)
-	j := &jws{privKey: privKey}
-	clientChallenge := challenge{Type: HTTP01, Token: "http1"}
-	mockValidate := func(_ *jws, _, _ string, chlng challenge) error {
-		uri := "http://localhost:23457/.well-known/acme-challenge/" + chlng.Token
-		resp, err := httpGet(uri)
-		if err != nil {
-			return err
-		}
-		defer resp.Body.Close()
-
-		if want := "text/plain"; resp.Header.Get("Content-Type") != want {
-			t.Errorf("Get(%q) Content-Type: got %q, want %q", uri, resp.Header.Get("Content-Type"), want)
-		}
-
-		body, err := ioutil.ReadAll(resp.Body)
-		if err != nil {
-			return err
-		}
-		bodyStr := string(body)
-
-		if bodyStr != chlng.KeyAuthorization {
-			t.Errorf("Get(%q) Body: got %q, want %q", uri, bodyStr, chlng.KeyAuthorization)
-		}
-
-		return nil
-	}
-	solver := &httpChallenge{jws: j, validate: mockValidate, provider: &HTTPProviderServer{port: "23457"}}
-
-	if err := solver.Solve(clientChallenge, "localhost:23457"); err != nil {
-		t.Errorf("Solve error: got %v, want nil", err)
-	}
-}
-
-func TestHTTPChallengeInvalidPort(t *testing.T) {
-	privKey, _ := rsa.GenerateKey(rand.Reader, 128)
-	j := &jws{privKey: privKey}
-	clientChallenge := challenge{Type: HTTP01, Token: "http2"}
-	solver := &httpChallenge{jws: j, validate: stubValidate, provider: &HTTPProviderServer{port: "123456"}}
-
-	if err := solver.Solve(clientChallenge, "localhost:123456"); err == nil {
-		t.Errorf("Solve error: got %v, want error", err)
-	} else if want := "invalid port 123456"; !strings.HasSuffix(err.Error(), want) {
-		t.Errorf("Solve error: got %q, want suffix %q", err.Error(), want)
-	}
-}
diff --git a/vendor/rsc.io/letsencrypt/vendor/github.com/xenolf/lego/acme/http_test.go b/vendor/rsc.io/letsencrypt/vendor/github.com/xenolf/lego/acme/http_test.go
deleted file mode 100644
index 33a48a331..000000000
--- a/vendor/rsc.io/letsencrypt/vendor/github.com/xenolf/lego/acme/http_test.go
+++ /dev/null
@@ -1,100 +0,0 @@
-package acme
-
-import (
-	"net/http"
-	"net/http/httptest"
-	"strings"
-	"testing"
-)
-
-func TestHTTPHeadUserAgent(t *testing.T) {
-	var ua, method string
-	ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
-		ua = r.Header.Get("User-Agent")
-		method = r.Method
-	}))
-	defer ts.Close()
-
-	_, err := httpHead(ts.URL)
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	if method != "HEAD" {
-		t.Errorf("Expected method to be HEAD, got %s", method)
-	}
-	if !strings.Contains(ua, ourUserAgent) {
-		t.Errorf("Expected User-Agent to contain '%s', got: '%s'", ourUserAgent, ua)
-	}
-}
-
-func TestHTTPGetUserAgent(t *testing.T) {
-	var ua, method string
-	ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
-		ua = r.Header.Get("User-Agent")
-		method = r.Method
-	}))
-	defer ts.Close()
-
-	res, err := httpGet(ts.URL)
-	if err != nil {
-		t.Fatal(err)
-	}
-	res.Body.Close()
-
-	if method != "GET" {
-		t.Errorf("Expected method to be GET, got %s", method)
-	}
-	if !strings.Contains(ua, ourUserAgent) {
-		t.Errorf("Expected User-Agent to contain '%s', got: '%s'", ourUserAgent, ua)
-	}
-}
-
-func TestHTTPPostUserAgent(t *testing.T) {
-	var ua, method string
-	ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
-		ua = r.Header.Get("User-Agent")
-		method = r.Method
-	}))
-	defer ts.Close()
-
-	res, err := httpPost(ts.URL, "text/plain", strings.NewReader("falalalala"))
-	if err != nil {
-		t.Fatal(err)
-	}
-	res.Body.Close()
-
-	if method != "POST" {
-		t.Errorf("Expected method to be POST, got %s", method)
-	}
-	if !strings.Contains(ua, ourUserAgent) {
-		t.Errorf("Expected User-Agent to contain '%s', got: '%s'", ourUserAgent, ua)
-	}
-}
-
-func TestUserAgent(t *testing.T) {
-	ua := userAgent()
-
-	if !strings.Contains(ua, defaultGoUserAgent) {
-		t.Errorf("Expected UA to contain %s, got '%s'", defaultGoUserAgent, ua)
-	}
-	if !strings.Contains(ua, ourUserAgent) {
-		t.Errorf("Expected UA to contain %s, got '%s'", ourUserAgent, ua)
-	}
-	if strings.HasSuffix(ua, " ") {
-		t.Errorf("UA should not have trailing spaces; got '%s'", ua)
-	}
-
-	// customize the UA by appending a value
-	UserAgent = "MyApp/1.2.3"
-	ua = userAgent()
-	if !strings.Contains(ua, defaultGoUserAgent) {
-		t.Errorf("Expected UA to contain %s, got '%s'", defaultGoUserAgent, ua)
-	}
-	if !strings.Contains(ua, ourUserAgent) {
-		t.Errorf("Expected UA to contain %s, got '%s'", ourUserAgent, ua)
-	}
-	if !strings.Contains(ua, UserAgent) {
-		t.Errorf("Expected custom UA to contain %s, got '%s'", UserAgent, ua)
-	}
-}
diff --git a/vendor/rsc.io/letsencrypt/vendor/github.com/xenolf/lego/acme/tls_sni_challenge_test.go b/vendor/rsc.io/letsencrypt/vendor/github.com/xenolf/lego/acme/tls_sni_challenge_test.go
deleted file mode 100644
index 3aec74565..000000000
--- a/vendor/rsc.io/letsencrypt/vendor/github.com/xenolf/lego/acme/tls_sni_challenge_test.go
+++ /dev/null
@@ -1,65 +0,0 @@
-package acme
-
-import (
-	"crypto/rand"
-	"crypto/rsa"
-	"crypto/sha256"
-	"crypto/tls"
-	"encoding/hex"
-	"fmt"
-	"strings"
-	"testing"
-)
-
-func TestTLSSNIChallenge(t *testing.T) {
-	privKey, _ := rsa.GenerateKey(rand.Reader, 512)
-	j := &jws{privKey: privKey}
-	clientChallenge := challenge{Type: TLSSNI01, Token: "tlssni1"}
-	mockValidate := func(_ *jws, _, _ string, chlng challenge) error {
-		conn, err := tls.Dial("tcp", "localhost:23457", &tls.Config{
-			InsecureSkipVerify: true,
-		})
-		if err != nil {
-			t.Errorf("Expected to connect to challenge server without an error. %s", err.Error())
-		}
-
-		// Expect the server to only return one certificate
-		connState := conn.ConnectionState()
-		if count := len(connState.PeerCertificates); count != 1 {
-			t.Errorf("Expected the challenge server to return exactly one certificate but got %d", count)
-		}
-
-		remoteCert := connState.PeerCertificates[0]
-		if count := len(remoteCert.DNSNames); count != 1 {
-			t.Errorf("Expected the challenge certificate to have exactly one DNSNames entry but had %d", count)
-		}
-
-		zBytes := sha256.Sum256([]byte(chlng.KeyAuthorization))
-		z := hex.EncodeToString(zBytes[:sha256.Size])
-		domain := fmt.Sprintf("%s.%s.acme.invalid", z[:32], z[32:])
-
-		if remoteCert.DNSNames[0] != domain {
-			t.Errorf("Expected the challenge certificate DNSName to match %s but was %s", domain, remoteCert.DNSNames[0])
-		}
-
-		return nil
-	}
-	solver := &tlsSNIChallenge{jws: j, validate: mockValidate, provider: &TLSProviderServer{port: "23457"}}
-
-	if err := solver.Solve(clientChallenge, "localhost:23457"); err != nil {
-		t.Errorf("Solve error: got %v, want nil", err)
-	}
-}
-
-func TestTLSSNIChallengeInvalidPort(t *testing.T) {
-	privKey, _ := rsa.GenerateKey(rand.Reader, 128)
-	j := &jws{privKey: privKey}
-	clientChallenge := challenge{Type: TLSSNI01, Token: "tlssni2"}
-	solver := &tlsSNIChallenge{jws: j, validate: stubValidate, provider: &TLSProviderServer{port: "123456"}}
-
-	if err := solver.Solve(clientChallenge, "localhost:123456"); err == nil {
-		t.Errorf("Solve error: got %v, want error", err)
-	} else if want := "invalid port 123456"; !strings.HasSuffix(err.Error(), want) {
-		t.Errorf("Solve error: got %q, want suffix %q", err.Error(), want)
-	}
-}
diff --git a/vendor/rsc.io/letsencrypt/vendor/github.com/xenolf/lego/acme/utils_test.go b/vendor/rsc.io/letsencrypt/vendor/github.com/xenolf/lego/acme/utils_test.go
deleted file mode 100644
index 158af4116..000000000
--- a/vendor/rsc.io/letsencrypt/vendor/github.com/xenolf/lego/acme/utils_test.go
+++ /dev/null
@@ -1,26 +0,0 @@
-package acme
-
-import (
-	"testing"
-	"time"
-)
-
-func TestWaitForTimeout(t *testing.T) {
-	c := make(chan error)
-	go func() {
-		err := WaitFor(3*time.Second, 1*time.Second, func() (bool, error) {
-			return false, nil
-		})
-		c <- err
-	}()
-
-	timeout := time.After(4 * time.Second)
-	select {
-	case <-timeout:
-		t.Fatal("timeout exceeded")
-	case err := <-c:
-		if err == nil {
-			t.Errorf("expected timeout error; got %v", err)
-		}
-	}
-}
diff --git a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/BUG-BOUNTY.md b/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/BUG-BOUNTY.md
deleted file mode 100644
index 97e61dbb6..000000000
--- a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/BUG-BOUNTY.md
+++ /dev/null
@@ -1,10 +0,0 @@
-Serious about security
-======================
-
-Square recognizes the important contributions the security research community
-can make. We therefore encourage reporting security issues with the code
-contained in this repository.
-
-If you believe you have discovered a security vulnerability, please follow the
-guidelines at <https://hackerone.com/square-open-source>.
-
diff --git a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/CONTRIBUTING.md b/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/CONTRIBUTING.md
deleted file mode 100644
index 61b183651..000000000
--- a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/CONTRIBUTING.md
+++ /dev/null
@@ -1,14 +0,0 @@
-# Contributing
-
-If you would like to contribute code to go-jose you can do so through GitHub by
-forking the repository and sending a pull request.
-
-When submitting code, please make every effort to follow existing conventions
-and style in order to keep the code as readable as possible. Please also make
-sure all tests pass by running `go test`, and format your code with `go fmt`.
-We also recommend using `golint` and `errcheck`.
-
-Before your code can be accepted into the project you must also sign the
-[Individual Contributor License Agreement][1].
-
- [1]: https://spreadsheets.google.com/spreadsheet/viewform?formkey=dDViT2xzUHAwRkI3X3k5Z0lQM091OGc6MQ&ndplr=1
diff --git a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/README.md b/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/README.md
deleted file mode 100644
index fd859da7a..000000000
--- a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/README.md
+++ /dev/null
@@ -1,209 +0,0 @@
-# Go JOSE 
-
-[![godoc](http://img.shields.io/badge/godoc-reference-blue.svg?style=flat)](https://godoc.org/gopkg.in/square/go-jose.v1) [![license](http://img.shields.io/badge/license-apache_2.0-red.svg?style=flat)](https://raw.githubusercontent.com/square/go-jose/master/LICENSE) [![build](https://travis-ci.org/square/go-jose.svg?branch=master)](https://travis-ci.org/square/go-jose) [![coverage](https://coveralls.io/repos/github/square/go-jose/badge.svg?branch=master)](https://coveralls.io/r/square/go-jose)
-
-Package jose aims to provide an implementation of the Javascript Object Signing
-and Encryption set of standards. For the moment, it mainly focuses on encryption
-and signing based on the JSON Web Encryption and JSON Web Signature standards.
-
-**Disclaimer**: This library contains encryption software that is subject to
-the U.S. Export Administration Regulations. You may not export, re-export,
-transfer or download this code or any part of it in violation of any United
-States law, directive or regulation. In particular this software may not be
-exported or re-exported in any form or on any media to Iran, North Sudan,
-Syria, Cuba, or North Korea, or to denied persons or entities mentioned on any
-US maintained blocked list.
-
-## Overview
-
-The implementation follows the
-[JSON Web Encryption](http://dx.doi.org/10.17487/RFC7516)
-standard (RFC 7516) and
-[JSON Web Signature](http://dx.doi.org/10.17487/RFC7515)
-standard (RFC 7515). Tables of supported algorithms are shown below.
-The library supports both the compact and full serialization formats, and has
-optional support for multiple recipients. It also comes with a small
-command-line utility
-([`jose-util`](https://github.com/square/go-jose/tree/master/jose-util))
-for dealing with JOSE messages in a shell.
-
-**Note**: We use a forked version of the `encoding/json` package from the Go
-standard library which uses case-sensitive matching for member names (instead
-of [case-insensitive matching](https://www.ietf.org/mail-archive/web/json/current/msg03763.html)).
-This is to avoid differences in interpretation of messages between go-jose and
-libraries in other languages. If you do not like this behavior, you can use the
-`std_json` build tag to disable it (though we do not recommend doing so).
-
-### Versions
-
-We use [gopkg.in](https://gopkg.in) for versioning.
-
-[Version 1](https://gopkg.in/square/go-jose.v1) is the current stable version:
-
-    import "gopkg.in/square/go-jose.v1"
-
-The interface for [go-jose.v1](https://gopkg.in/square/go-jose.v1) will remain
-backwards compatible. We're currently sketching out ideas for a new version, to
-clean up the interface a bit. If you have ideas or feature requests [please let
-us know](https://github.com/square/go-jose/issues/64)!
-
-### Supported algorithms
-
-See below for a table of supported algorithms. Algorithm identifiers match
-the names in the
-[JSON Web Algorithms](http://dx.doi.org/10.17487/RFC7518)
-standard where possible. The
-[Godoc reference](https://godoc.org/github.com/square/go-jose#pkg-constants)
-has a list of constants.
-
- Key encryption             | Algorithm identifier(s)
- :------------------------- | :------------------------------
- RSA-PKCS#1v1.5             | RSA1_5
- RSA-OAEP                   | RSA-OAEP, RSA-OAEP-256
- AES key wrap               | A128KW, A192KW, A256KW
- AES-GCM key wrap           | A128GCMKW, A192GCMKW, A256GCMKW
- ECDH-ES + AES key wrap     | ECDH-ES+A128KW, ECDH-ES+A192KW, ECDH-ES+A256KW
- ECDH-ES (direct)           | ECDH-ES<sup>1</sup>
- Direct encryption          | dir<sup>1</sup>
-
-<sup>1. Not supported in multi-recipient mode</sup>
-
- Signing / MAC              | Algorithm identifier(s)
- :------------------------- | :------------------------------
- RSASSA-PKCS#1v1.5          | RS256, RS384, RS512
- RSASSA-PSS                 | PS256, PS384, PS512
- HMAC                       | HS256, HS384, HS512
- ECDSA                      | ES256, ES384, ES512
-
- Content encryption         | Algorithm identifier(s)
- :------------------------- | :------------------------------
- AES-CBC+HMAC               | A128CBC-HS256, A192CBC-HS384, A256CBC-HS512
- AES-GCM                    | A128GCM, A192GCM, A256GCM 
-
- Compression                | Algorithm identifiers(s)
- :------------------------- | -------------------------------
- DEFLATE (RFC 1951)         | DEF
-
-### Supported key types
-
-See below for a table of supported key types. These are understood by the
-library, and can be passed to corresponding functions such as `NewEncrypter` or
-`NewSigner`. Note that if you are creating a new encrypter or signer with a
-JsonWebKey, the key id of the JsonWebKey (if present) will be added to any
-resulting messages.
-
- Algorithm(s)               | Corresponding types
- :------------------------- | -------------------------------
- RSA                        | *[rsa.PublicKey](http://golang.org/pkg/crypto/rsa/#PublicKey), *[rsa.PrivateKey](http://golang.org/pkg/crypto/rsa/#PrivateKey), *[jose.JsonWebKey](https://godoc.org/github.com/square/go-jose#JsonWebKey)
- ECDH, ECDSA                | *[ecdsa.PublicKey](http://golang.org/pkg/crypto/ecdsa/#PublicKey), *[ecdsa.PrivateKey](http://golang.org/pkg/crypto/ecdsa/#PrivateKey), *[jose.JsonWebKey](https://godoc.org/github.com/square/go-jose#JsonWebKey)
- AES, HMAC                  | []byte, *[jose.JsonWebKey](https://godoc.org/github.com/square/go-jose#JsonWebKey)
-
-## Examples
-
-Encryption/decryption example using RSA:
-
-```Go
-// Generate a public/private key pair to use for this example. The library
-// also provides two utility functions (LoadPublicKey and LoadPrivateKey)
-// that can be used to load keys from PEM/DER-encoded data.
-privateKey, err := rsa.GenerateKey(rand.Reader, 2048)
-if err != nil {
-	panic(err)
-}
-
-// Instantiate an encrypter using RSA-OAEP with AES128-GCM. An error would
-// indicate that the selected algorithm(s) are not currently supported.
-publicKey := &privateKey.PublicKey
-encrypter, err := NewEncrypter(RSA_OAEP, A128GCM, publicKey)
-if err != nil {
-	panic(err)
-}
-
-// Encrypt a sample plaintext. Calling the encrypter returns an encrypted
-// JWE object, which can then be serialized for output afterwards. An error
-// would indicate a problem in an underlying cryptographic primitive.
-var plaintext = []byte("Lorem ipsum dolor sit amet")
-object, err := encrypter.Encrypt(plaintext)
-if err != nil {
-	panic(err)
-}
-
-// Serialize the encrypted object using the full serialization format.
-// Alternatively you can also use the compact format here by calling
-// object.CompactSerialize() instead.
-serialized := object.FullSerialize()
-
-// Parse the serialized, encrypted JWE object. An error would indicate that
-// the given input did not represent a valid message.
-object, err = ParseEncrypted(serialized)
-if err != nil {
-	panic(err)
-}
-
-// Now we can decrypt and get back our original plaintext. An error here
-// would indicate the the message failed to decrypt, e.g. because the auth
-// tag was broken or the message was tampered with.
-decrypted, err := object.Decrypt(privateKey)
-if err != nil {
-	panic(err)
-}
-
-fmt.Printf(string(decrypted))
-// output: Lorem ipsum dolor sit amet
-```
-
-Signing/verification example using RSA:
-
-```Go
-// Generate a public/private key pair to use for this example. The library
-// also provides two utility functions (LoadPublicKey and LoadPrivateKey)
-// that can be used to load keys from PEM/DER-encoded data.
-privateKey, err := rsa.GenerateKey(rand.Reader, 2048)
-if err != nil {
-	panic(err)
-}
-
-// Instantiate a signer using RSASSA-PSS (SHA512) with the given private key.
-signer, err := NewSigner(PS512, privateKey)
-if err != nil {
-	panic(err)
-}
-
-// Sign a sample payload. Calling the signer returns a protected JWS object,
-// which can then be serialized for output afterwards. An error would
-// indicate a problem in an underlying cryptographic primitive.
-var payload = []byte("Lorem ipsum dolor sit amet")
-object, err := signer.Sign(payload)
-if err != nil {
-	panic(err)
-}
-
-// Serialize the encrypted object using the full serialization format.
-// Alternatively you can also use the compact format here by calling
-// object.CompactSerialize() instead.
-serialized := object.FullSerialize()
-
-// Parse the serialized, protected JWS object. An error would indicate that
-// the given input did not represent a valid message.
-object, err = ParseSigned(serialized)
-if err != nil {
-	panic(err)
-}
-
-// Now we can verify the signature on the payload. An error here would
-// indicate the the message failed to verify, e.g. because the signature was
-// broken or the message was tampered with.
-output, err := object.Verify(&privateKey.PublicKey)
-if err != nil {
-	panic(err)
-}
-
-fmt.Printf(string(output))
-// output: Lorem ipsum dolor sit amet
-```
-
-More examples can be found in the [Godoc
-reference](https://godoc.org/github.com/square/go-jose) for this package. The
-[`jose-util`](https://github.com/square/go-jose/tree/master/jose-util)
-subdirectory also contains a small command-line utility which might
-be useful as an example.
diff --git a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/asymmetric_test.go b/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/asymmetric_test.go
deleted file mode 100644
index 1c8c8b347..000000000
--- a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/asymmetric_test.go
+++ /dev/null
@@ -1,431 +0,0 @@
-/*-
- * Copyright 2014 Square Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package jose
-
-import (
-	"bytes"
-	"crypto/rand"
-	"crypto/rsa"
-	"errors"
-	"io"
-	"math/big"
-	"testing"
-)
-
-func TestVectorsRSA(t *testing.T) {
-	// Sources:
-	//   http://www.emc.com/emc-plus/rsa-labs/standards-initiatives/pkcs-rsa-cryptography-standard.htm
-	//   ftp://ftp.rsa.com/pub/rsalabs/tmp/pkcs1v15crypt-vectors.txt
-	priv := &rsa.PrivateKey{
-		PublicKey: rsa.PublicKey{
-			N: fromHexInt(`
-				a8b3b284af8eb50b387034a860f146c4919f318763cd6c5598c8
-				ae4811a1e0abc4c7e0b082d693a5e7fced675cf4668512772c0c
-				bc64a742c6c630f533c8cc72f62ae833c40bf25842e984bb78bd
-				bf97c0107d55bdb662f5c4e0fab9845cb5148ef7392dd3aaff93
-				ae1e6b667bb3d4247616d4f5ba10d4cfd226de88d39f16fb`),
-			E: 65537,
-		},
-		D: fromHexInt(`
-				53339cfdb79fc8466a655c7316aca85c55fd8f6dd898fdaf1195
-				17ef4f52e8fd8e258df93fee180fa0e4ab29693cd83b152a553d
-				4ac4d1812b8b9fa5af0e7f55fe7304df41570926f3311f15c4d6
-				5a732c483116ee3d3d2d0af3549ad9bf7cbfb78ad884f84d5beb
-				04724dc7369b31def37d0cf539e9cfcdd3de653729ead5d1`),
-		Primes: []*big.Int{
-			fromHexInt(`
-				d32737e7267ffe1341b2d5c0d150a81b586fb3132bed2f8d5262
-				864a9cb9f30af38be448598d413a172efb802c21acf1c11c520c
-				2f26a471dcad212eac7ca39d`),
-			fromHexInt(`
-				cc8853d1d54da630fac004f471f281c7b8982d8224a490edbeb3
-				3d3e3d5cc93c4765703d1dd791642f1f116a0dd852be2419b2af
-				72bfe9a030e860b0288b5d77`),
-		},
-	}
-
-	input := fromHexBytes(
-		"6628194e12073db03ba94cda9ef9532397d50dba79b987004afefe34")
-
-	expectedPKCS := fromHexBytes(`
-		50b4c14136bd198c2f3c3ed243fce036e168d56517984a263cd66492b808
-		04f169d210f2b9bdfb48b12f9ea05009c77da257cc600ccefe3a6283789d
-		8ea0e607ac58e2690ec4ebc10146e8cbaa5ed4d5cce6fe7b0ff9efc1eabb
-		564dbf498285f449ee61dd7b42ee5b5892cb90601f30cda07bf26489310b
-		cd23b528ceab3c31`)
-
-	expectedOAEP := fromHexBytes(`
-		354fe67b4a126d5d35fe36c777791a3f7ba13def484e2d3908aff722fad4
-		68fb21696de95d0be911c2d3174f8afcc201035f7b6d8e69402de5451618
-		c21a535fa9d7bfc5b8dd9fc243f8cf927db31322d6e881eaa91a996170e6
-		57a05a266426d98c88003f8477c1227094a0d9fa1e8c4024309ce1ecccb5
-		210035d47ac72e8a`)
-
-	// Mock random reader
-	randReader = bytes.NewReader(fromHexBytes(`
-		017341ae3875d5f87101f8cc4fa9b9bc156bb04628fccdb2f4f11e905bd3
-		a155d376f593bd7304210874eba08a5e22bcccb4c9d3882a93a54db022f5
-		03d16338b6b7ce16dc7f4bbf9a96b59772d6606e9747c7649bf9e083db98
-		1884a954ab3c6f18b776ea21069d69776a33e96bad48e1dda0a5ef`))
-	defer resetRandReader()
-
-	// RSA-PKCS1v1.5 encrypt
-	enc := new(rsaEncrypterVerifier)
-	enc.publicKey = &priv.PublicKey
-	encryptedPKCS, err := enc.encrypt(input, RSA1_5)
-	if err != nil {
-		t.Error("Encryption failed:", err)
-		return
-	}
-
-	if bytes.Compare(encryptedPKCS, expectedPKCS) != 0 {
-		t.Error("Output does not match expected value (PKCS1v1.5)")
-	}
-
-	// RSA-OAEP encrypt
-	encryptedOAEP, err := enc.encrypt(input, RSA_OAEP)
-	if err != nil {
-		t.Error("Encryption failed:", err)
-		return
-	}
-
-	if bytes.Compare(encryptedOAEP, expectedOAEP) != 0 {
-		t.Error("Output does not match expected value (OAEP)")
-	}
-
-	// Need fake cipher for PKCS1v1.5 decrypt
-	resetRandReader()
-	aes := newAESGCM(len(input))
-
-	keygen := randomKeyGenerator{
-		size: aes.keySize(),
-	}
-
-	// RSA-PKCS1v1.5 decrypt
-	dec := new(rsaDecrypterSigner)
-	dec.privateKey = priv
-	decryptedPKCS, err := dec.decrypt(encryptedPKCS, RSA1_5, keygen)
-	if err != nil {
-		t.Error("Decryption failed:", err)
-		return
-	}
-
-	if bytes.Compare(input, decryptedPKCS) != 0 {
-		t.Error("Output does not match expected value (PKCS1v1.5)")
-	}
-
-	// RSA-OAEP decrypt
-	decryptedOAEP, err := dec.decrypt(encryptedOAEP, RSA_OAEP, keygen)
-	if err != nil {
-		t.Error("decryption failed:", err)
-		return
-	}
-
-	if bytes.Compare(input, decryptedOAEP) != 0 {
-		t.Error("output does not match expected value (OAEP)")
-	}
-}
-
-func TestInvalidAlgorithmsRSA(t *testing.T) {
-	_, err := newRSARecipient("XYZ", nil)
-	if err != ErrUnsupportedAlgorithm {
-		t.Error("should return error on invalid algorithm")
-	}
-
-	_, err = newRSASigner("XYZ", nil)
-	if err != ErrUnsupportedAlgorithm {
-		t.Error("should return error on invalid algorithm")
-	}
-
-	enc := new(rsaEncrypterVerifier)
-	enc.publicKey = &rsaTestKey.PublicKey
-	_, err = enc.encryptKey([]byte{}, "XYZ")
-	if err != ErrUnsupportedAlgorithm {
-		t.Error("should return error on invalid algorithm")
-	}
-
-	err = enc.verifyPayload([]byte{}, []byte{}, "XYZ")
-	if err != ErrUnsupportedAlgorithm {
-		t.Error("should return error on invalid algorithm")
-	}
-
-	dec := new(rsaDecrypterSigner)
-	dec.privateKey = rsaTestKey
-	_, err = dec.decrypt(make([]byte, 256), "XYZ", randomKeyGenerator{size: 16})
-	if err != ErrUnsupportedAlgorithm {
-		t.Error("should return error on invalid algorithm")
-	}
-
-	_, err = dec.signPayload([]byte{}, "XYZ")
-	if err != ErrUnsupportedAlgorithm {
-		t.Error("should return error on invalid algorithm")
-	}
-}
-
-type failingKeyGenerator struct{}
-
-func (ctx failingKeyGenerator) keySize() int {
-	return 0
-}
-
-func (ctx failingKeyGenerator) genKey() ([]byte, rawHeader, error) {
-	return nil, rawHeader{}, errors.New("failed to generate key")
-}
-
-func TestPKCSKeyGeneratorFailure(t *testing.T) {
-	dec := new(rsaDecrypterSigner)
-	dec.privateKey = rsaTestKey
-	generator := failingKeyGenerator{}
-	_, err := dec.decrypt(make([]byte, 256), RSA1_5, generator)
-	if err != ErrCryptoFailure {
-		t.Error("should return error on invalid algorithm")
-	}
-}
-
-func TestInvalidAlgorithmsEC(t *testing.T) {
-	_, err := newECDHRecipient("XYZ", nil)
-	if err != ErrUnsupportedAlgorithm {
-		t.Error("should return error on invalid algorithm")
-	}
-
-	_, err = newECDSASigner("XYZ", nil)
-	if err != ErrUnsupportedAlgorithm {
-		t.Error("should return error on invalid algorithm")
-	}
-
-	enc := new(ecEncrypterVerifier)
-	enc.publicKey = &ecTestKey256.PublicKey
-	_, err = enc.encryptKey([]byte{}, "XYZ")
-	if err != ErrUnsupportedAlgorithm {
-		t.Error("should return error on invalid algorithm")
-	}
-}
-
-func TestInvalidECKeyGen(t *testing.T) {
-	gen := ecKeyGenerator{
-		size:      16,
-		algID:     "A128GCM",
-		publicKey: &ecTestKey256.PublicKey,
-	}
-
-	if gen.keySize() != 16 {
-		t.Error("ec key generator reported incorrect key size")
-	}
-
-	_, _, err := gen.genKey()
-	if err != nil {
-		t.Error("ec key generator failed to generate key", err)
-	}
-}
-
-func TestInvalidECDecrypt(t *testing.T) {
-	dec := ecDecrypterSigner{
-		privateKey: ecTestKey256,
-	}
-
-	generator := randomKeyGenerator{size: 16}
-
-	// Missing epk header
-	headers := rawHeader{
-		Alg: string(ECDH_ES),
-	}
-
-	_, err := dec.decryptKey(headers, nil, generator)
-	if err == nil {
-		t.Error("ec decrypter accepted object with missing epk header")
-	}
-
-	// Invalid epk header
-	headers.Epk = &JsonWebKey{}
-
-	_, err = dec.decryptKey(headers, nil, generator)
-	if err == nil {
-		t.Error("ec decrypter accepted object with invalid epk header")
-	}
-}
-
-func TestDecryptWithIncorrectSize(t *testing.T) {
-	priv, err := rsa.GenerateKey(rand.Reader, 2048)
-	if err != nil {
-		t.Error(err)
-		return
-	}
-
-	dec := new(rsaDecrypterSigner)
-	dec.privateKey = priv
-	aes := newAESGCM(16)
-
-	keygen := randomKeyGenerator{
-		size: aes.keySize(),
-	}
-
-	payload := make([]byte, 254)
-	_, err = dec.decrypt(payload, RSA1_5, keygen)
-	if err == nil {
-		t.Error("Invalid payload size should return error")
-	}
-
-	payload = make([]byte, 257)
-	_, err = dec.decrypt(payload, RSA1_5, keygen)
-	if err == nil {
-		t.Error("Invalid payload size should return error")
-	}
-}
-
-func TestPKCSDecryptNeverFails(t *testing.T) {
-	// We don't want RSA-PKCS1 v1.5 decryption to ever fail, in order to prevent
-	// side-channel timing attacks (Bleichenbacher attack in particular).
-	priv, err := rsa.GenerateKey(rand.Reader, 2048)
-	if err != nil {
-		t.Error(err)
-		return
-	}
-
-	dec := new(rsaDecrypterSigner)
-	dec.privateKey = priv
-	aes := newAESGCM(16)
-
-	keygen := randomKeyGenerator{
-		size: aes.keySize(),
-	}
-
-	for i := 1; i < 50; i++ {
-		payload := make([]byte, 256)
-		_, err := io.ReadFull(rand.Reader, payload)
-		if err != nil {
-			t.Error("Unable to get random data:", err)
-			return
-		}
-		_, err = dec.decrypt(payload, RSA1_5, keygen)
-		if err != nil {
-			t.Error("PKCS1v1.5 decrypt should never fail:", err)
-			return
-		}
-	}
-}
-
-func BenchmarkPKCSDecryptWithValidPayloads(b *testing.B) {
-	priv, err := rsa.GenerateKey(rand.Reader, 2048)
-	if err != nil {
-		panic(err)
-	}
-
-	enc := new(rsaEncrypterVerifier)
-	enc.publicKey = &priv.PublicKey
-	dec := new(rsaDecrypterSigner)
-	dec.privateKey = priv
-	aes := newAESGCM(32)
-
-	b.StopTimer()
-	b.ResetTimer()
-	for i := 0; i < b.N; i++ {
-		plaintext := make([]byte, 32)
-		_, err = io.ReadFull(rand.Reader, plaintext)
-		if err != nil {
-			panic(err)
-		}
-
-		ciphertext, err := enc.encrypt(plaintext, RSA1_5)
-		if err != nil {
-			panic(err)
-		}
-
-		keygen := randomKeyGenerator{
-			size: aes.keySize(),
-		}
-
-		b.StartTimer()
-		_, err = dec.decrypt(ciphertext, RSA1_5, keygen)
-		b.StopTimer()
-		if err != nil {
-			panic(err)
-		}
-	}
-}
-
-func BenchmarkPKCSDecryptWithInvalidPayloads(b *testing.B) {
-	priv, err := rsa.GenerateKey(rand.Reader, 2048)
-	if err != nil {
-		panic(err)
-	}
-
-	enc := new(rsaEncrypterVerifier)
-	enc.publicKey = &priv.PublicKey
-	dec := new(rsaDecrypterSigner)
-	dec.privateKey = priv
-	aes := newAESGCM(16)
-
-	keygen := randomKeyGenerator{
-		size: aes.keySize(),
-	}
-
-	b.StopTimer()
-	b.ResetTimer()
-	for i := 0; i < b.N; i++ {
-		plaintext := make([]byte, 16)
-		_, err = io.ReadFull(rand.Reader, plaintext)
-		if err != nil {
-			panic(err)
-		}
-
-		ciphertext, err := enc.encrypt(plaintext, RSA1_5)
-		if err != nil {
-			panic(err)
-		}
-
-		// Do some simple scrambling
-		ciphertext[128] ^= 0xFF
-
-		b.StartTimer()
-		_, err = dec.decrypt(ciphertext, RSA1_5, keygen)
-		b.StopTimer()
-		if err != nil {
-			panic(err)
-		}
-	}
-}
-
-func TestInvalidEllipticCurve(t *testing.T) {
-	signer256 := ecDecrypterSigner{privateKey: ecTestKey256}
-	signer384 := ecDecrypterSigner{privateKey: ecTestKey384}
-	signer521 := ecDecrypterSigner{privateKey: ecTestKey521}
-
-	_, err := signer256.signPayload([]byte{}, ES384)
-	if err == nil {
-		t.Error("should not generate ES384 signature with P-256 key")
-	}
-	_, err = signer256.signPayload([]byte{}, ES512)
-	if err == nil {
-		t.Error("should not generate ES512 signature with P-256 key")
-	}
-	_, err = signer384.signPayload([]byte{}, ES256)
-	if err == nil {
-		t.Error("should not generate ES256 signature with P-384 key")
-	}
-	_, err = signer384.signPayload([]byte{}, ES512)
-	if err == nil {
-		t.Error("should not generate ES512 signature with P-384 key")
-	}
-	_, err = signer521.signPayload([]byte{}, ES256)
-	if err == nil {
-		t.Error("should not generate ES256 signature with P-521 key")
-	}
-	_, err = signer521.signPayload([]byte{}, ES384)
-	if err == nil {
-		t.Error("should not generate ES384 signature with P-521 key")
-	}
-}
diff --git a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/cipher/cbc_hmac_test.go b/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/cipher/cbc_hmac_test.go
deleted file mode 100644
index c230271b5..000000000
--- a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/cipher/cbc_hmac_test.go
+++ /dev/null
@@ -1,498 +0,0 @@
-/*-
- * Copyright 2014 Square Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package josecipher
-
-import (
-	"bytes"
-	"crypto/aes"
-	"crypto/cipher"
-	"crypto/rand"
-	"io"
-	"strings"
-	"testing"
-)
-
-func TestInvalidInputs(t *testing.T) {
-	key := []byte{
-		0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
-		0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
-	}
-
-	nonce := []byte{
-		92, 80, 104, 49, 133, 25, 161, 215, 173, 101, 219, 211, 136, 91, 210, 145}
-
-	aead, _ := NewCBCHMAC(key, aes.NewCipher)
-	ciphertext := aead.Seal(nil, nonce, []byte("plaintext"), []byte("aad"))
-
-	// Changed AAD, must fail
-	_, err := aead.Open(nil, nonce, ciphertext, []byte("INVALID"))
-	if err == nil {
-		t.Error("must detect invalid aad")
-	}
-
-	// Empty ciphertext, must fail
-	_, err = aead.Open(nil, nonce, []byte{}, []byte("aad"))
-	if err == nil {
-		t.Error("must detect invalid/empty ciphertext")
-	}
-
-	// Corrupt ciphertext, must fail
-	corrupt := make([]byte, len(ciphertext))
-	copy(corrupt, ciphertext)
-	corrupt[0] ^= 0xFF
-
-	_, err = aead.Open(nil, nonce, corrupt, []byte("aad"))
-	if err == nil {
-		t.Error("must detect corrupt ciphertext")
-	}
-
-	// Corrupt authtag, must fail
-	copy(corrupt, ciphertext)
-	corrupt[len(ciphertext)-1] ^= 0xFF
-
-	_, err = aead.Open(nil, nonce, corrupt, []byte("aad"))
-	if err == nil {
-		t.Error("must detect corrupt authtag")
-	}
-
-	// Truncated data, must fail
-	_, err = aead.Open(nil, nonce, ciphertext[:10], []byte("aad"))
-	if err == nil {
-		t.Error("must detect corrupt authtag")
-	}
-}
-
-func TestVectorsAESCBC128(t *testing.T) {
-	// Source: http://tools.ietf.org/html/draft-ietf-jose-json-web-encryption-29#appendix-A.2
-	plaintext := []byte{
-		76, 105, 118, 101, 32, 108, 111, 110, 103, 32, 97, 110, 100, 32,
-		112, 114, 111, 115, 112, 101, 114, 46}
-
-	aad := []byte{
-		101, 121, 74, 104, 98, 71, 99, 105, 79, 105, 74, 83, 85, 48, 69,
-		120, 88, 122, 85, 105, 76, 67, 74, 108, 98, 109, 77, 105, 79, 105,
-		74, 66, 77, 84, 73, 52, 81, 48, 74, 68, 76, 85, 104, 84, 77, 106, 85,
-		50, 73, 110, 48}
-
-	expectedCiphertext := []byte{
-		40, 57, 83, 181, 119, 33, 133, 148, 198, 185, 243, 24, 152, 230, 6,
-		75, 129, 223, 127, 19, 210, 82, 183, 230, 168, 33, 215, 104, 143,
-		112, 56, 102}
-
-	expectedAuthtag := []byte{
-		246, 17, 244, 190, 4, 95, 98, 3, 231, 0, 115, 157, 242, 203, 100,
-		191}
-
-	key := []byte{
-		4, 211, 31, 197, 84, 157, 252, 254, 11, 100, 157, 250, 63, 170, 106, 206,
-		107, 124, 212, 45, 111, 107, 9, 219, 200, 177, 0, 240, 143, 156, 44, 207}
-
-	nonce := []byte{
-		3, 22, 60, 12, 43, 67, 104, 105, 108, 108, 105, 99, 111, 116, 104, 101}
-
-	enc, err := NewCBCHMAC(key, aes.NewCipher)
-	out := enc.Seal(nil, nonce, plaintext, aad)
-	if err != nil {
-		t.Error("Unable to encrypt:", err)
-		return
-	}
-
-	if bytes.Compare(out[:len(out)-16], expectedCiphertext) != 0 {
-		t.Error("Ciphertext did not match")
-	}
-	if bytes.Compare(out[len(out)-16:], expectedAuthtag) != 0 {
-		t.Error("Auth tag did not match")
-	}
-}
-
-func TestVectorsAESCBC256(t *testing.T) {
-	// Source: https://tools.ietf.org/html/draft-mcgrew-aead-aes-cbc-hmac-sha2-05#section-5.4
-	plaintext := []byte{
-		0x41, 0x20, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, 0x20, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x20,
-		0x6d, 0x75, 0x73, 0x74, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75,
-		0x69, 0x72, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x73, 0x65, 0x63, 0x72, 0x65,
-		0x74, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x69, 0x74, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62,
-		0x65, 0x20, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x66, 0x61, 0x6c, 0x6c, 0x20, 0x69,
-		0x6e, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x73, 0x20, 0x6f, 0x66,
-		0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6e, 0x65, 0x6d, 0x79, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6f,
-		0x75, 0x74, 0x20, 0x69, 0x6e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x6e, 0x69, 0x65, 0x6e, 0x63, 0x65}
-
-	aad := []byte{
-		0x54, 0x68, 0x65, 0x20, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x70, 0x72, 0x69, 0x6e, 0x63,
-		0x69, 0x70, 0x6c, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x41, 0x75, 0x67, 0x75, 0x73, 0x74, 0x65, 0x20,
-		0x4b, 0x65, 0x72, 0x63, 0x6b, 0x68, 0x6f, 0x66, 0x66, 0x73}
-
-	expectedCiphertext := []byte{
-		0x4a, 0xff, 0xaa, 0xad, 0xb7, 0x8c, 0x31, 0xc5, 0xda, 0x4b, 0x1b, 0x59, 0x0d, 0x10, 0xff, 0xbd,
-		0x3d, 0xd8, 0xd5, 0xd3, 0x02, 0x42, 0x35, 0x26, 0x91, 0x2d, 0xa0, 0x37, 0xec, 0xbc, 0xc7, 0xbd,
-		0x82, 0x2c, 0x30, 0x1d, 0xd6, 0x7c, 0x37, 0x3b, 0xcc, 0xb5, 0x84, 0xad, 0x3e, 0x92, 0x79, 0xc2,
-		0xe6, 0xd1, 0x2a, 0x13, 0x74, 0xb7, 0x7f, 0x07, 0x75, 0x53, 0xdf, 0x82, 0x94, 0x10, 0x44, 0x6b,
-		0x36, 0xeb, 0xd9, 0x70, 0x66, 0x29, 0x6a, 0xe6, 0x42, 0x7e, 0xa7, 0x5c, 0x2e, 0x08, 0x46, 0xa1,
-		0x1a, 0x09, 0xcc, 0xf5, 0x37, 0x0d, 0xc8, 0x0b, 0xfe, 0xcb, 0xad, 0x28, 0xc7, 0x3f, 0x09, 0xb3,
-		0xa3, 0xb7, 0x5e, 0x66, 0x2a, 0x25, 0x94, 0x41, 0x0a, 0xe4, 0x96, 0xb2, 0xe2, 0xe6, 0x60, 0x9e,
-		0x31, 0xe6, 0xe0, 0x2c, 0xc8, 0x37, 0xf0, 0x53, 0xd2, 0x1f, 0x37, 0xff, 0x4f, 0x51, 0x95, 0x0b,
-		0xbe, 0x26, 0x38, 0xd0, 0x9d, 0xd7, 0xa4, 0x93, 0x09, 0x30, 0x80, 0x6d, 0x07, 0x03, 0xb1, 0xf6}
-
-	expectedAuthtag := []byte{
-		0x4d, 0xd3, 0xb4, 0xc0, 0x88, 0xa7, 0xf4, 0x5c, 0x21, 0x68, 0x39, 0x64, 0x5b, 0x20, 0x12, 0xbf,
-		0x2e, 0x62, 0x69, 0xa8, 0xc5, 0x6a, 0x81, 0x6d, 0xbc, 0x1b, 0x26, 0x77, 0x61, 0x95, 0x5b, 0xc5}
-
-	key := []byte{
-		0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
-		0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
-		0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
-		0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f}
-
-	nonce := []byte{
-		0x1a, 0xf3, 0x8c, 0x2d, 0xc2, 0xb9, 0x6f, 0xfd, 0xd8, 0x66, 0x94, 0x09, 0x23, 0x41, 0xbc, 0x04}
-
-	enc, err := NewCBCHMAC(key, aes.NewCipher)
-	out := enc.Seal(nil, nonce, plaintext, aad)
-	if err != nil {
-		t.Error("Unable to encrypt:", err)
-		return
-	}
-
-	if bytes.Compare(out[:len(out)-32], expectedCiphertext) != 0 {
-		t.Error("Ciphertext did not match, got", out[:len(out)-32], "wanted", expectedCiphertext)
-	}
-	if bytes.Compare(out[len(out)-32:], expectedAuthtag) != 0 {
-		t.Error("Auth tag did not match, got", out[len(out)-32:], "wanted", expectedAuthtag)
-	}
-}
-
-func TestAESCBCRoundtrip(t *testing.T) {
-	key128 := []byte{
-		0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
-		0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}
-
-	key192 := []byte{
-		0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
-		0, 1, 2, 3, 4, 5, 6, 7,
-		0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
-		0, 1, 2, 3, 4, 5, 6, 7}
-
-	key256 := []byte{
-		0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
-		0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
-		0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
-		0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}
-
-	nonce := []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}
-
-	RunRoundtrip(t, key128, nonce)
-	RunRoundtrip(t, key192, nonce)
-	RunRoundtrip(t, key256, nonce)
-}
-
-func RunRoundtrip(t *testing.T, key, nonce []byte) {
-	aead, err := NewCBCHMAC(key, aes.NewCipher)
-	if err != nil {
-		panic(err)
-	}
-
-	if aead.NonceSize() != len(nonce) {
-		panic("invalid nonce")
-	}
-
-	// Test pre-existing data in dst buffer
-	dst := []byte{15, 15, 15, 15}
-	plaintext := []byte{0, 0, 0, 0}
-	aad := []byte{4, 3, 2, 1}
-
-	result := aead.Seal(dst, nonce, plaintext, aad)
-	if bytes.Compare(dst, result[:4]) != 0 {
-		t.Error("Existing data in dst not preserved")
-	}
-
-	// Test pre-existing (empty) dst buffer with sufficient capacity
-	dst = make([]byte, 256)[:0]
-	result, err = aead.Open(dst, nonce, result[4:], aad)
-	if err != nil {
-		panic(err)
-	}
-
-	if bytes.Compare(result, plaintext) != 0 {
-		t.Error("Plaintext does not match output")
-	}
-}
-
-func TestAESCBCOverhead(t *testing.T) {
-	aead, err := NewCBCHMAC(make([]byte, 32), aes.NewCipher)
-	if err != nil {
-		panic(err)
-	}
-
-	if aead.Overhead() != 32 {
-		t.Error("CBC-HMAC reports incorrect overhead value")
-	}
-}
-
-func TestPadding(t *testing.T) {
-	for i := 0; i < 256; i++ {
-		slice := make([]byte, i)
-		padded := padBuffer(slice, 16)
-		if len(padded)%16 != 0 {
-			t.Error("failed to pad slice properly", i)
-			return
-		}
-		unpadded, err := unpadBuffer(padded, 16)
-		if err != nil || len(unpadded) != i {
-			t.Error("failed to unpad slice properly", i)
-			return
-		}
-	}
-}
-
-func TestInvalidKey(t *testing.T) {
-	key := make([]byte, 30)
-	_, err := NewCBCHMAC(key, aes.NewCipher)
-	if err == nil {
-		t.Error("should not be able to instantiate CBC-HMAC with invalid key")
-	}
-}
-
-func TestTruncatedCiphertext(t *testing.T) {
-	key := make([]byte, 32)
-	nonce := make([]byte, 16)
-	data := make([]byte, 32)
-
-	io.ReadFull(rand.Reader, key)
-	io.ReadFull(rand.Reader, nonce)
-
-	aead, err := NewCBCHMAC(key, aes.NewCipher)
-	if err != nil {
-		panic(err)
-	}
-
-	ctx := aead.(*cbcAEAD)
-	ct := aead.Seal(nil, nonce, data, nil)
-
-	// Truncated ciphertext, but with correct auth tag
-	truncated, tail := resize(ct[:len(ct)-ctx.authtagBytes-2], len(ct)-2)
-	copy(tail, ctx.computeAuthTag(nil, nonce, truncated[:len(truncated)-ctx.authtagBytes]))
-
-	// Open should fail
-	_, err = aead.Open(nil, nonce, truncated, nil)
-	if err == nil {
-		t.Error("open on truncated ciphertext should fail")
-	}
-}
-
-func TestInvalidPaddingOpen(t *testing.T) {
-	key := make([]byte, 32)
-	nonce := make([]byte, 16)
-
-	// Plaintext with invalid padding
-	plaintext := padBuffer(make([]byte, 28), aes.BlockSize)
-	plaintext[len(plaintext)-1] = 0xFF
-
-	io.ReadFull(rand.Reader, key)
-	io.ReadFull(rand.Reader, nonce)
-
-	block, _ := aes.NewCipher(key)
-	cbc := cipher.NewCBCEncrypter(block, nonce)
-	buffer := append([]byte{}, plaintext...)
-	cbc.CryptBlocks(buffer, buffer)
-
-	aead, _ := NewCBCHMAC(key, aes.NewCipher)
-	ctx := aead.(*cbcAEAD)
-
-	// Mutated ciphertext, but with correct auth tag
-	size := len(buffer)
-	ciphertext, tail := resize(buffer, size+(len(key)/2))
-	copy(tail, ctx.computeAuthTag(nil, nonce, ciphertext[:size]))
-
-	// Open should fail (b/c of invalid padding, even though tag matches)
-	_, err := aead.Open(nil, nonce, ciphertext, nil)
-	if err == nil || !strings.Contains(err.Error(), "invalid padding") {
-		t.Error("no or unexpected error on open with invalid padding:", err)
-	}
-}
-
-func TestInvalidPadding(t *testing.T) {
-	for i := 0; i < 256; i++ {
-		slice := make([]byte, i)
-		padded := padBuffer(slice, 16)
-		if len(padded)%16 != 0 {
-			t.Error("failed to pad slice properly", i)
-			return
-		}
-
-		paddingBytes := 16 - (i % 16)
-
-		// Mutate padding for testing
-		for j := 1; j <= paddingBytes; j++ {
-			mutated := make([]byte, len(padded))
-			copy(mutated, padded)
-			mutated[len(mutated)-j] ^= 0xFF
-
-			_, err := unpadBuffer(mutated, 16)
-			if err == nil {
-				t.Error("unpad on invalid padding should fail", i)
-				return
-			}
-		}
-
-		// Test truncated padding
-		_, err := unpadBuffer(padded[:len(padded)-1], 16)
-		if err == nil {
-			t.Error("unpad on truncated padding should fail", i)
-			return
-		}
-	}
-}
-
-func TestZeroLengthPadding(t *testing.T) {
-	data := make([]byte, 16)
-	data, err := unpadBuffer(data, 16)
-	if err == nil {
-		t.Error("padding with 0x00 should never be valid")
-	}
-}
-
-func benchEncryptCBCHMAC(b *testing.B, keySize, chunkSize int) {
-	key := make([]byte, keySize*2)
-	nonce := make([]byte, 16)
-
-	io.ReadFull(rand.Reader, key)
-	io.ReadFull(rand.Reader, nonce)
-
-	chunk := make([]byte, chunkSize)
-
-	aead, err := NewCBCHMAC(key, aes.NewCipher)
-	if err != nil {
-		panic(err)
-	}
-
-	b.SetBytes(int64(chunkSize))
-	b.ResetTimer()
-	for i := 0; i < b.N; i++ {
-		aead.Seal(nil, nonce, chunk, nil)
-	}
-}
-
-func benchDecryptCBCHMAC(b *testing.B, keySize, chunkSize int) {
-	key := make([]byte, keySize*2)
-	nonce := make([]byte, 16)
-
-	io.ReadFull(rand.Reader, key)
-	io.ReadFull(rand.Reader, nonce)
-
-	chunk := make([]byte, chunkSize)
-
-	aead, err := NewCBCHMAC(key, aes.NewCipher)
-	if err != nil {
-		panic(err)
-	}
-
-	out := aead.Seal(nil, nonce, chunk, nil)
-
-	b.SetBytes(int64(chunkSize))
-	b.ResetTimer()
-	for i := 0; i < b.N; i++ {
-		aead.Open(nil, nonce, out, nil)
-	}
-}
-
-func BenchmarkEncryptAES128_CBCHMAC_1k(b *testing.B) {
-	benchEncryptCBCHMAC(b, 16, 1024)
-}
-
-func BenchmarkEncryptAES128_CBCHMAC_64k(b *testing.B) {
-	benchEncryptCBCHMAC(b, 16, 65536)
-}
-
-func BenchmarkEncryptAES128_CBCHMAC_1MB(b *testing.B) {
-	benchEncryptCBCHMAC(b, 16, 1048576)
-}
-
-func BenchmarkEncryptAES128_CBCHMAC_64MB(b *testing.B) {
-	benchEncryptCBCHMAC(b, 16, 67108864)
-}
-
-func BenchmarkDecryptAES128_CBCHMAC_1k(b *testing.B) {
-	benchDecryptCBCHMAC(b, 16, 1024)
-}
-
-func BenchmarkDecryptAES128_CBCHMAC_64k(b *testing.B) {
-	benchDecryptCBCHMAC(b, 16, 65536)
-}
-
-func BenchmarkDecryptAES128_CBCHMAC_1MB(b *testing.B) {
-	benchDecryptCBCHMAC(b, 16, 1048576)
-}
-
-func BenchmarkDecryptAES128_CBCHMAC_64MB(b *testing.B) {
-	benchDecryptCBCHMAC(b, 16, 67108864)
-}
-
-func BenchmarkEncryptAES192_CBCHMAC_64k(b *testing.B) {
-	benchEncryptCBCHMAC(b, 24, 65536)
-}
-
-func BenchmarkEncryptAES192_CBCHMAC_1MB(b *testing.B) {
-	benchEncryptCBCHMAC(b, 24, 1048576)
-}
-
-func BenchmarkEncryptAES192_CBCHMAC_64MB(b *testing.B) {
-	benchEncryptCBCHMAC(b, 24, 67108864)
-}
-
-func BenchmarkDecryptAES192_CBCHMAC_1k(b *testing.B) {
-	benchDecryptCBCHMAC(b, 24, 1024)
-}
-
-func BenchmarkDecryptAES192_CBCHMAC_64k(b *testing.B) {
-	benchDecryptCBCHMAC(b, 24, 65536)
-}
-
-func BenchmarkDecryptAES192_CBCHMAC_1MB(b *testing.B) {
-	benchDecryptCBCHMAC(b, 24, 1048576)
-}
-
-func BenchmarkDecryptAES192_CBCHMAC_64MB(b *testing.B) {
-	benchDecryptCBCHMAC(b, 24, 67108864)
-}
-
-func BenchmarkEncryptAES256_CBCHMAC_64k(b *testing.B) {
-	benchEncryptCBCHMAC(b, 32, 65536)
-}
-
-func BenchmarkEncryptAES256_CBCHMAC_1MB(b *testing.B) {
-	benchEncryptCBCHMAC(b, 32, 1048576)
-}
-
-func BenchmarkEncryptAES256_CBCHMAC_64MB(b *testing.B) {
-	benchEncryptCBCHMAC(b, 32, 67108864)
-}
-
-func BenchmarkDecryptAES256_CBCHMAC_1k(b *testing.B) {
-	benchDecryptCBCHMAC(b, 32, 1032)
-}
-
-func BenchmarkDecryptAES256_CBCHMAC_64k(b *testing.B) {
-	benchDecryptCBCHMAC(b, 32, 65536)
-}
-
-func BenchmarkDecryptAES256_CBCHMAC_1MB(b *testing.B) {
-	benchDecryptCBCHMAC(b, 32, 1048576)
-}
-
-func BenchmarkDecryptAES256_CBCHMAC_64MB(b *testing.B) {
-	benchDecryptCBCHMAC(b, 32, 67108864)
-}
diff --git a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/cipher/concat_kdf_test.go b/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/cipher/concat_kdf_test.go
deleted file mode 100644
index 48219b3e1..000000000
--- a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/cipher/concat_kdf_test.go
+++ /dev/null
@@ -1,150 +0,0 @@
-/*-
- * Copyright 2014 Square Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package josecipher
-
-import (
-	"bytes"
-	"crypto"
-	"testing"
-)
-
-// Taken from: https://tools.ietf.org/id/draft-ietf-jose-json-web-algorithms-38.txt
-func TestVectorConcatKDF(t *testing.T) {
-	z := []byte{
-		158, 86, 217, 29, 129, 113, 53, 211, 114, 131, 66, 131, 191, 132,
-		38, 156, 251, 49, 110, 163, 218, 128, 106, 72, 246, 218, 167, 121,
-		140, 254, 144, 196}
-
-	algID := []byte{0, 0, 0, 7, 65, 49, 50, 56, 71, 67, 77}
-
-	ptyUInfo := []byte{0, 0, 0, 5, 65, 108, 105, 99, 101}
-	ptyVInfo := []byte{0, 0, 0, 3, 66, 111, 98}
-
-	supPubInfo := []byte{0, 0, 0, 128}
-	supPrivInfo := []byte{}
-
-	expected := []byte{
-		86, 170, 141, 234, 248, 35, 109, 32, 92, 34, 40, 205, 113, 167, 16, 26}
-
-	ckdf := NewConcatKDF(crypto.SHA256, z, algID, ptyUInfo, ptyVInfo, supPubInfo, supPrivInfo)
-
-	out0 := make([]byte, 9)
-	out1 := make([]byte, 7)
-
-	read0, err := ckdf.Read(out0)
-	if err != nil {
-		t.Error("error when reading from concat kdf reader", err)
-		return
-	}
-
-	read1, err := ckdf.Read(out1)
-	if err != nil {
-		t.Error("error when reading from concat kdf reader", err)
-		return
-	}
-
-	if read0+read1 != len(out0)+len(out1) {
-		t.Error("did not receive enough bytes from concat kdf reader")
-		return
-	}
-
-	out := []byte{}
-	out = append(out, out0...)
-	out = append(out, out1...)
-
-	if bytes.Compare(out, expected) != 0 {
-		t.Error("did not receive expected output from concat kdf reader")
-		return
-	}
-}
-
-func TestCache(t *testing.T) {
-	z := []byte{
-		158, 86, 217, 29, 129, 113, 53, 211, 114, 131, 66, 131, 191, 132,
-		38, 156, 251, 49, 110, 163, 218, 128, 106, 72, 246, 218, 167, 121,
-		140, 254, 144, 196}
-
-	algID := []byte{1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4}
-
-	ptyUInfo := []byte{1, 2, 3, 4}
-	ptyVInfo := []byte{4, 3, 2, 1}
-
-	supPubInfo := []byte{}
-	supPrivInfo := []byte{}
-
-	outputs := [][]byte{}
-
-	// Read the same amount of data in different chunk sizes
-	chunkSizes := []int{1, 2, 4, 8, 16, 32, 64, 128, 256, 512}
-
-	for _, c := range chunkSizes {
-		out := make([]byte, 1024)
-		reader := NewConcatKDF(crypto.SHA256, z, algID, ptyUInfo, ptyVInfo, supPubInfo, supPrivInfo)
-
-		for i := 0; i < 1024; i += c {
-			_, _ = reader.Read(out[i : i+c])
-		}
-
-		outputs = append(outputs, out)
-	}
-
-	for i := range outputs {
-		if bytes.Compare(outputs[i], outputs[(i+1)%len(outputs)]) != 0 {
-			t.Error("not all outputs from KDF matched")
-		}
-	}
-}
-
-func benchmarkKDF(b *testing.B, total int) {
-	z := []byte{
-		158, 86, 217, 29, 129, 113, 53, 211, 114, 131, 66, 131, 191, 132,
-		38, 156, 251, 49, 110, 163, 218, 128, 106, 72, 246, 218, 167, 121,
-		140, 254, 144, 196}
-
-	algID := []byte{1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4}
-
-	ptyUInfo := []byte{1, 2, 3, 4}
-	ptyVInfo := []byte{4, 3, 2, 1}
-
-	supPubInfo := []byte{}
-	supPrivInfo := []byte{}
-
-	out := make([]byte, total)
-	reader := NewConcatKDF(crypto.SHA256, z, algID, ptyUInfo, ptyVInfo, supPubInfo, supPrivInfo)
-
-	b.ResetTimer()
-	b.SetBytes(int64(total))
-	for i := 0; i < b.N; i++ {
-		_, _ = reader.Read(out)
-	}
-}
-
-func BenchmarkConcatKDF_1k(b *testing.B) {
-	benchmarkKDF(b, 1024)
-}
-
-func BenchmarkConcatKDF_64k(b *testing.B) {
-	benchmarkKDF(b, 65536)
-}
-
-func BenchmarkConcatKDF_1MB(b *testing.B) {
-	benchmarkKDF(b, 1048576)
-}
-
-func BenchmarkConcatKDF_64MB(b *testing.B) {
-	benchmarkKDF(b, 67108864)
-}
diff --git a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/cipher/ecdh_es_test.go b/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/cipher/ecdh_es_test.go
deleted file mode 100644
index f92abb175..000000000
--- a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/cipher/ecdh_es_test.go
+++ /dev/null
@@ -1,98 +0,0 @@
-/*-
- * Copyright 2014 Square Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package josecipher
-
-import (
-	"bytes"
-	"crypto/ecdsa"
-	"crypto/elliptic"
-	"encoding/base64"
-	"math/big"
-	"testing"
-)
-
-// Example keys from JWA, Appendix C
-var aliceKey = &ecdsa.PrivateKey{
-	PublicKey: ecdsa.PublicKey{
-		Curve: elliptic.P256(),
-		X:     fromBase64Int("gI0GAILBdu7T53akrFmMyGcsF3n5dO7MmwNBHKW5SV0="),
-		Y:     fromBase64Int("SLW_xSffzlPWrHEVI30DHM_4egVwt3NQqeUD7nMFpps="),
-	},
-	D: fromBase64Int("0_NxaRPUMQoAJt50Gz8YiTr8gRTwyEaCumd-MToTmIo="),
-}
-
-var bobKey = &ecdsa.PrivateKey{
-	PublicKey: ecdsa.PublicKey{
-		Curve: elliptic.P256(),
-		X:     fromBase64Int("weNJy2HscCSM6AEDTDg04biOvhFhyyWvOHQfeF_PxMQ="),
-		Y:     fromBase64Int("e8lnCO-AlStT-NJVX-crhB7QRYhiix03illJOVAOyck="),
-	},
-	D: fromBase64Int("VEmDZpDXXK8p8N0Cndsxs924q6nS1RXFASRl6BfUqdw="),
-}
-
-// Build big int from base64-encoded string. Strips whitespace (for testing).
-func fromBase64Int(data string) *big.Int {
-	val, err := base64.URLEncoding.DecodeString(data)
-	if err != nil {
-		panic("Invalid test data")
-	}
-	return new(big.Int).SetBytes(val)
-}
-
-func TestVectorECDHES(t *testing.T) {
-	apuData := []byte("Alice")
-	apvData := []byte("Bob")
-
-	expected := []byte{
-		86, 170, 141, 234, 248, 35, 109, 32, 92, 34, 40, 205, 113, 167, 16, 26}
-
-	output := DeriveECDHES("A128GCM", apuData, apvData, bobKey, &aliceKey.PublicKey, 16)
-
-	if bytes.Compare(output, expected) != 0 {
-		t.Error("output did not match what we expect, got", output, "wanted", expected)
-	}
-}
-
-func BenchmarkECDHES_128(b *testing.B) {
-	apuData := []byte("APU")
-	apvData := []byte("APV")
-
-	b.ResetTimer()
-	for i := 0; i < b.N; i++ {
-		DeriveECDHES("ID", apuData, apvData, bobKey, &aliceKey.PublicKey, 16)
-	}
-}
-
-func BenchmarkECDHES_192(b *testing.B) {
-	apuData := []byte("APU")
-	apvData := []byte("APV")
-
-	b.ResetTimer()
-	for i := 0; i < b.N; i++ {
-		DeriveECDHES("ID", apuData, apvData, bobKey, &aliceKey.PublicKey, 24)
-	}
-}
-
-func BenchmarkECDHES_256(b *testing.B) {
-	apuData := []byte("APU")
-	apvData := []byte("APV")
-
-	b.ResetTimer()
-	for i := 0; i < b.N; i++ {
-		DeriveECDHES("ID", apuData, apvData, bobKey, &aliceKey.PublicKey, 32)
-	}
-}
diff --git a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/cipher/key_wrap_test.go b/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/cipher/key_wrap_test.go
deleted file mode 100644
index ceecf812b..000000000
--- a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/cipher/key_wrap_test.go
+++ /dev/null
@@ -1,133 +0,0 @@
-/*-
- * Copyright 2014 Square Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package josecipher
-
-import (
-	"bytes"
-	"crypto/aes"
-	"encoding/hex"
-	"testing"
-)
-
-func TestAesKeyWrap(t *testing.T) {
-	// Test vectors from: http://csrc.nist.gov/groups/ST/toolkit/documents/kms/key-wrap.pdf
-	kek0, _ := hex.DecodeString("000102030405060708090A0B0C0D0E0F")
-	cek0, _ := hex.DecodeString("00112233445566778899AABBCCDDEEFF")
-
-	expected0, _ := hex.DecodeString("1FA68B0A8112B447AEF34BD8FB5A7B829D3E862371D2CFE5")
-
-	kek1, _ := hex.DecodeString("000102030405060708090A0B0C0D0E0F1011121314151617")
-	cek1, _ := hex.DecodeString("00112233445566778899AABBCCDDEEFF")
-
-	expected1, _ := hex.DecodeString("96778B25AE6CA435F92B5B97C050AED2468AB8A17AD84E5D")
-
-	kek2, _ := hex.DecodeString("000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F")
-	cek2, _ := hex.DecodeString("00112233445566778899AABBCCDDEEFF0001020304050607")
-
-	expected2, _ := hex.DecodeString("A8F9BC1612C68B3FF6E6F4FBE30E71E4769C8B80A32CB8958CD5D17D6B254DA1")
-
-	block0, _ := aes.NewCipher(kek0)
-	block1, _ := aes.NewCipher(kek1)
-	block2, _ := aes.NewCipher(kek2)
-
-	out0, _ := KeyWrap(block0, cek0)
-	out1, _ := KeyWrap(block1, cek1)
-	out2, _ := KeyWrap(block2, cek2)
-
-	if bytes.Compare(out0, expected0) != 0 {
-		t.Error("output 0 not as expected, got", out0, "wanted", expected0)
-	}
-
-	if bytes.Compare(out1, expected1) != 0 {
-		t.Error("output 1 not as expected, got", out1, "wanted", expected1)
-	}
-
-	if bytes.Compare(out2, expected2) != 0 {
-		t.Error("output 2 not as expected, got", out2, "wanted", expected2)
-	}
-
-	unwrap0, _ := KeyUnwrap(block0, out0)
-	unwrap1, _ := KeyUnwrap(block1, out1)
-	unwrap2, _ := KeyUnwrap(block2, out2)
-
-	if bytes.Compare(unwrap0, cek0) != 0 {
-		t.Error("key unwrap did not return original input, got", unwrap0, "wanted", cek0)
-	}
-
-	if bytes.Compare(unwrap1, cek1) != 0 {
-		t.Error("key unwrap did not return original input, got", unwrap1, "wanted", cek1)
-	}
-
-	if bytes.Compare(unwrap2, cek2) != 0 {
-		t.Error("key unwrap did not return original input, got", unwrap2, "wanted", cek2)
-	}
-}
-
-func TestAesKeyWrapInvalid(t *testing.T) {
-	kek, _ := hex.DecodeString("000102030405060708090A0B0C0D0E0F")
-
-	// Invalid unwrap input (bit flipped)
-	input0, _ := hex.DecodeString("1EA68C1A8112B447AEF34BD8FB5A7B828D3E862371D2CFE5")
-
-	block, _ := aes.NewCipher(kek)
-
-	_, err := KeyUnwrap(block, input0)
-	if err == nil {
-		t.Error("key unwrap failed to detect invalid input")
-	}
-
-	// Invalid unwrap input (truncated)
-	input1, _ := hex.DecodeString("1EA68C1A8112B447AEF34BD8FB5A7B828D3E862371D2CF")
-
-	_, err = KeyUnwrap(block, input1)
-	if err == nil {
-		t.Error("key unwrap failed to detect truncated input")
-	}
-
-	// Invalid wrap input (not multiple of 8)
-	input2, _ := hex.DecodeString("0123456789ABCD")
-
-	_, err = KeyWrap(block, input2)
-	if err == nil {
-		t.Error("key wrap accepted invalid input")
-	}
-
-}
-
-func BenchmarkAesKeyWrap(b *testing.B) {
-	kek, _ := hex.DecodeString("000102030405060708090A0B0C0D0E0F")
-	key, _ := hex.DecodeString("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF")
-
-	block, _ := aes.NewCipher(kek)
-
-	b.ResetTimer()
-	for i := 0; i < b.N; i++ {
-		KeyWrap(block, key)
-	}
-}
-
-func BenchmarkAesKeyUnwrap(b *testing.B) {
-	kek, _ := hex.DecodeString("000102030405060708090A0B0C0D0E0F")
-	input, _ := hex.DecodeString("1FA68B0A8112B447AEF34BD8FB5A7B829D3E862371D2CFE5")
-
-	block, _ := aes.NewCipher(kek)
-
-	b.ResetTimer()
-	for i := 0; i < b.N; i++ {
-		KeyUnwrap(block, input)
-	}
-}
diff --git a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/crypter_test.go b/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/crypter_test.go
deleted file mode 100644
index 86b8fc0a9..000000000
--- a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/crypter_test.go
+++ /dev/null
@@ -1,784 +0,0 @@
-/*-
- * Copyright 2014 Square Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package jose
-
-import (
-	"bytes"
-	"crypto/ecdsa"
-	"crypto/elliptic"
-	"crypto/rand"
-	"crypto/rsa"
-	"fmt"
-	"io"
-	"testing"
-)
-
-// We generate only a single RSA and EC key for testing, speeds up tests.
-var rsaTestKey, _ = rsa.GenerateKey(rand.Reader, 2048)
-
-var ecTestKey256, _ = ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
-var ecTestKey384, _ = ecdsa.GenerateKey(elliptic.P384(), rand.Reader)
-var ecTestKey521, _ = ecdsa.GenerateKey(elliptic.P521(), rand.Reader)
-
-func RoundtripJWE(keyAlg KeyAlgorithm, encAlg ContentEncryption, compressionAlg CompressionAlgorithm, serializer func(*JsonWebEncryption) (string, error), corrupter func(*JsonWebEncryption) bool, aad []byte, encryptionKey interface{}, decryptionKey interface{}) error {
-	enc, err := NewEncrypter(keyAlg, encAlg, encryptionKey)
-	if err != nil {
-		return fmt.Errorf("error on new encrypter: %s", err)
-	}
-
-	enc.SetCompression(compressionAlg)
-
-	input := []byte("Lorem ipsum dolor sit amet")
-	obj, err := enc.EncryptWithAuthData(input, aad)
-	if err != nil {
-		return fmt.Errorf("error in encrypt: %s", err)
-	}
-
-	msg, err := serializer(obj)
-	if err != nil {
-		return fmt.Errorf("error in serializer: %s", err)
-	}
-
-	parsed, err := ParseEncrypted(msg)
-	if err != nil {
-		return fmt.Errorf("error in parse: %s, on msg '%s'", err, msg)
-	}
-
-	// (Maybe) mangle object
-	skip := corrupter(parsed)
-	if skip {
-		return fmt.Errorf("corrupter indicated message should be skipped")
-	}
-
-	if bytes.Compare(parsed.GetAuthData(), aad) != 0 {
-		return fmt.Errorf("auth data in parsed object does not match")
-	}
-
-	output, err := parsed.Decrypt(decryptionKey)
-	if err != nil {
-		return fmt.Errorf("error on decrypt: %s", err)
-	}
-
-	if bytes.Compare(input, output) != 0 {
-		return fmt.Errorf("Decrypted output does not match input, got '%s' but wanted '%s'", output, input)
-	}
-
-	return nil
-}
-
-func TestRoundtripsJWE(t *testing.T) {
-	// Test matrix
-	keyAlgs := []KeyAlgorithm{
-		DIRECT, ECDH_ES, ECDH_ES_A128KW, ECDH_ES_A192KW, ECDH_ES_A256KW, A128KW, A192KW, A256KW,
-		RSA1_5, RSA_OAEP, RSA_OAEP_256, A128GCMKW, A192GCMKW, A256GCMKW}
-	encAlgs := []ContentEncryption{A128GCM, A192GCM, A256GCM, A128CBC_HS256, A192CBC_HS384, A256CBC_HS512}
-	zipAlgs := []CompressionAlgorithm{NONE, DEFLATE}
-
-	serializers := []func(*JsonWebEncryption) (string, error){
-		func(obj *JsonWebEncryption) (string, error) { return obj.CompactSerialize() },
-		func(obj *JsonWebEncryption) (string, error) { return obj.FullSerialize(), nil },
-	}
-
-	corrupter := func(obj *JsonWebEncryption) bool { return false }
-
-	// Note: can't use AAD with compact serialization
-	aads := [][]byte{
-		nil,
-		[]byte("Ut enim ad minim veniam"),
-	}
-
-	// Test all different configurations
-	for _, alg := range keyAlgs {
-		for _, enc := range encAlgs {
-			for _, key := range generateTestKeys(alg, enc) {
-				for _, zip := range zipAlgs {
-					for i, serializer := range serializers {
-						err := RoundtripJWE(alg, enc, zip, serializer, corrupter, aads[i], key.enc, key.dec)
-						if err != nil {
-							t.Error(err, alg, enc, zip, i)
-						}
-					}
-				}
-			}
-		}
-	}
-}
-
-func TestRoundtripsJWECorrupted(t *testing.T) {
-	// Test matrix
-	keyAlgs := []KeyAlgorithm{DIRECT, ECDH_ES, ECDH_ES_A128KW, A128KW, RSA1_5, RSA_OAEP, RSA_OAEP_256, A128GCMKW}
-	encAlgs := []ContentEncryption{A128GCM, A192GCM, A256GCM, A128CBC_HS256, A192CBC_HS384, A256CBC_HS512}
-	zipAlgs := []CompressionAlgorithm{NONE, DEFLATE}
-
-	serializers := []func(*JsonWebEncryption) (string, error){
-		func(obj *JsonWebEncryption) (string, error) { return obj.CompactSerialize() },
-		func(obj *JsonWebEncryption) (string, error) { return obj.FullSerialize(), nil },
-	}
-
-	bitflip := func(slice []byte) bool {
-		if len(slice) > 0 {
-			slice[0] ^= 0xFF
-			return false
-		}
-		return true
-	}
-
-	corrupters := []func(*JsonWebEncryption) bool{
-		func(obj *JsonWebEncryption) bool {
-			// Set invalid ciphertext
-			return bitflip(obj.ciphertext)
-		},
-		func(obj *JsonWebEncryption) bool {
-			// Set invalid auth tag
-			return bitflip(obj.tag)
-		},
-		func(obj *JsonWebEncryption) bool {
-			// Set invalid AAD
-			return bitflip(obj.aad)
-		},
-		func(obj *JsonWebEncryption) bool {
-			// Mess with encrypted key
-			return bitflip(obj.recipients[0].encryptedKey)
-		},
-		func(obj *JsonWebEncryption) bool {
-			// Mess with GCM-KW auth tag
-			return bitflip(obj.protected.Tag.bytes())
-		},
-	}
-
-	// Note: can't use AAD with compact serialization
-	aads := [][]byte{
-		nil,
-		[]byte("Ut enim ad minim veniam"),
-	}
-
-	// Test all different configurations
-	for _, alg := range keyAlgs {
-		for _, enc := range encAlgs {
-			for _, key := range generateTestKeys(alg, enc) {
-				for _, zip := range zipAlgs {
-					for i, serializer := range serializers {
-						for j, corrupter := range corrupters {
-							err := RoundtripJWE(alg, enc, zip, serializer, corrupter, aads[i], key.enc, key.dec)
-							if err == nil {
-								t.Error("failed to detect corrupt data", err, alg, enc, zip, i, j)
-							}
-						}
-					}
-				}
-			}
-		}
-	}
-}
-
-func TestEncrypterWithJWKAndKeyID(t *testing.T) {
-	enc, err := NewEncrypter(A128KW, A128GCM, &JsonWebKey{
-		KeyID: "test-id",
-		Key:   []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15},
-	})
-	if err != nil {
-		t.Error(err)
-	}
-
-	ciphertext, _ := enc.Encrypt([]byte("Lorem ipsum dolor sit amet"))
-
-	serialized1, _ := ciphertext.CompactSerialize()
-	serialized2 := ciphertext.FullSerialize()
-
-	parsed1, _ := ParseEncrypted(serialized1)
-	parsed2, _ := ParseEncrypted(serialized2)
-
-	if parsed1.Header.KeyID != "test-id" {
-		t.Errorf("expected message to have key id from JWK, but found '%s' instead", parsed1.Header.KeyID)
-	}
-	if parsed2.Header.KeyID != "test-id" {
-		t.Errorf("expected message to have key id from JWK, but found '%s' instead", parsed2.Header.KeyID)
-	}
-}
-
-func TestEncrypterWithBrokenRand(t *testing.T) {
-	keyAlgs := []KeyAlgorithm{ECDH_ES_A128KW, A128KW, RSA1_5, RSA_OAEP, RSA_OAEP_256, A128GCMKW}
-	encAlgs := []ContentEncryption{A128GCM, A192GCM, A256GCM, A128CBC_HS256, A192CBC_HS384, A256CBC_HS512}
-
-	serializer := func(obj *JsonWebEncryption) (string, error) { return obj.CompactSerialize() }
-	corrupter := func(obj *JsonWebEncryption) bool { return false }
-
-	// Break rand reader
-	readers := []func() io.Reader{
-		// Totally broken
-		func() io.Reader { return bytes.NewReader([]byte{}) },
-		// Not enough bytes
-		func() io.Reader { return io.LimitReader(rand.Reader, 20) },
-	}
-
-	defer resetRandReader()
-
-	for _, alg := range keyAlgs {
-		for _, enc := range encAlgs {
-			for _, key := range generateTestKeys(alg, enc) {
-				for i, getReader := range readers {
-					randReader = getReader()
-					err := RoundtripJWE(alg, enc, NONE, serializer, corrupter, nil, key.enc, key.dec)
-					if err == nil {
-						t.Error("encrypter should fail if rand is broken", i)
-					}
-				}
-			}
-		}
-	}
-}
-
-func TestNewEncrypterErrors(t *testing.T) {
-	_, err := NewEncrypter("XYZ", "XYZ", nil)
-	if err == nil {
-		t.Error("was able to instantiate encrypter with invalid cipher")
-	}
-
-	_, err = NewMultiEncrypter("XYZ")
-	if err == nil {
-		t.Error("was able to instantiate multi-encrypter with invalid cipher")
-	}
-
-	_, err = NewEncrypter(DIRECT, A128GCM, nil)
-	if err == nil {
-		t.Error("was able to instantiate encrypter with invalid direct key")
-	}
-
-	_, err = NewEncrypter(ECDH_ES, A128GCM, nil)
-	if err == nil {
-		t.Error("was able to instantiate encrypter with invalid EC key")
-	}
-}
-
-func TestMultiRecipientJWE(t *testing.T) {
-	enc, err := NewMultiEncrypter(A128GCM)
-	if err != nil {
-		panic(err)
-	}
-
-	err = enc.AddRecipient(RSA_OAEP, &rsaTestKey.PublicKey)
-	if err != nil {
-		t.Error("error when adding RSA recipient", err)
-	}
-
-	sharedKey := []byte{
-		0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
-		0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
-	}
-
-	err = enc.AddRecipient(A256GCMKW, sharedKey)
-	if err != nil {
-		t.Error("error when adding AES recipient: ", err)
-		return
-	}
-
-	input := []byte("Lorem ipsum dolor sit amet")
-	obj, err := enc.Encrypt(input)
-	if err != nil {
-		t.Error("error in encrypt: ", err)
-		return
-	}
-
-	msg := obj.FullSerialize()
-
-	parsed, err := ParseEncrypted(msg)
-	if err != nil {
-		t.Error("error in parse: ", err)
-		return
-	}
-
-	output, err := parsed.Decrypt(rsaTestKey)
-	if err != nil {
-		t.Error("error on decrypt with RSA: ", err)
-		return
-	}
-
-	if bytes.Compare(input, output) != 0 {
-		t.Error("Decrypted output does not match input: ", output, input)
-		return
-	}
-
-	output, err = parsed.Decrypt(sharedKey)
-	if err != nil {
-		t.Error("error on decrypt with AES: ", err)
-		return
-	}
-
-	if bytes.Compare(input, output) != 0 {
-		t.Error("Decrypted output does not match input", output, input)
-		return
-	}
-}
-
-func TestMultiRecipientErrors(t *testing.T) {
-	enc, err := NewMultiEncrypter(A128GCM)
-	if err != nil {
-		panic(err)
-	}
-
-	input := []byte("Lorem ipsum dolor sit amet")
-	_, err = enc.Encrypt(input)
-	if err == nil {
-		t.Error("should fail when encrypting to zero recipients")
-	}
-
-	err = enc.AddRecipient(DIRECT, nil)
-	if err == nil {
-		t.Error("should reject DIRECT mode when encrypting to multiple recipients")
-	}
-
-	err = enc.AddRecipient(ECDH_ES, nil)
-	if err == nil {
-		t.Error("should reject ECDH_ES mode when encrypting to multiple recipients")
-	}
-
-	err = enc.AddRecipient(RSA1_5, nil)
-	if err == nil {
-		t.Error("should reject invalid recipient key")
-	}
-}
-
-type testKey struct {
-	enc, dec interface{}
-}
-
-func symmetricTestKey(size int) []testKey {
-	key, _, _ := randomKeyGenerator{size: size}.genKey()
-
-	return []testKey{
-		testKey{
-			enc: key,
-			dec: key,
-		},
-		testKey{
-			enc: &JsonWebKey{KeyID: "test", Key: key},
-			dec: &JsonWebKey{KeyID: "test", Key: key},
-		},
-	}
-}
-
-func generateTestKeys(keyAlg KeyAlgorithm, encAlg ContentEncryption) []testKey {
-	switch keyAlg {
-	case DIRECT:
-		return symmetricTestKey(getContentCipher(encAlg).keySize())
-	case ECDH_ES, ECDH_ES_A128KW, ECDH_ES_A192KW, ECDH_ES_A256KW:
-		return []testKey{
-			testKey{
-				dec: ecTestKey256,
-				enc: &ecTestKey256.PublicKey,
-			},
-			testKey{
-				dec: ecTestKey384,
-				enc: &ecTestKey384.PublicKey,
-			},
-			testKey{
-				dec: ecTestKey521,
-				enc: &ecTestKey521.PublicKey,
-			},
-			testKey{
-				dec: &JsonWebKey{KeyID: "test", Key: ecTestKey256},
-				enc: &JsonWebKey{KeyID: "test", Key: &ecTestKey256.PublicKey},
-			},
-		}
-	case A128GCMKW, A128KW:
-		return symmetricTestKey(16)
-	case A192GCMKW, A192KW:
-		return symmetricTestKey(24)
-	case A256GCMKW, A256KW:
-		return symmetricTestKey(32)
-	case RSA1_5, RSA_OAEP, RSA_OAEP_256:
-		return []testKey{testKey{
-			dec: rsaTestKey,
-			enc: &rsaTestKey.PublicKey,
-		}}
-	}
-
-	panic("Must update test case")
-}
-
-func RunRoundtripsJWE(b *testing.B, alg KeyAlgorithm, enc ContentEncryption, zip CompressionAlgorithm, priv, pub interface{}) {
-	serializer := func(obj *JsonWebEncryption) (string, error) {
-		return obj.CompactSerialize()
-	}
-
-	corrupter := func(obj *JsonWebEncryption) bool { return false }
-
-	b.ResetTimer()
-	for i := 0; i < b.N; i++ {
-		err := RoundtripJWE(alg, enc, zip, serializer, corrupter, nil, pub, priv)
-		if err != nil {
-			b.Error(err)
-		}
-	}
-}
-
-var (
-	chunks = map[string][]byte{
-		"1B":   make([]byte, 1),
-		"64B":  make([]byte, 64),
-		"1KB":  make([]byte, 1024),
-		"64KB": make([]byte, 65536),
-		"1MB":  make([]byte, 1048576),
-		"64MB": make([]byte, 67108864),
-	}
-
-	symKey, _, _ = randomKeyGenerator{size: 32}.genKey()
-
-	encrypters = map[string]Encrypter{
-		"OAEPAndGCM":          mustEncrypter(RSA_OAEP, A128GCM, &rsaTestKey.PublicKey),
-		"PKCSAndGCM":          mustEncrypter(RSA1_5, A128GCM, &rsaTestKey.PublicKey),
-		"OAEPAndCBC":          mustEncrypter(RSA_OAEP, A128CBC_HS256, &rsaTestKey.PublicKey),
-		"PKCSAndCBC":          mustEncrypter(RSA1_5, A128CBC_HS256, &rsaTestKey.PublicKey),
-		"DirectGCM128":        mustEncrypter(DIRECT, A128GCM, symKey),
-		"DirectCBC128":        mustEncrypter(DIRECT, A128CBC_HS256, symKey),
-		"DirectGCM256":        mustEncrypter(DIRECT, A256GCM, symKey),
-		"DirectCBC256":        mustEncrypter(DIRECT, A256CBC_HS512, symKey),
-		"AESKWAndGCM128":      mustEncrypter(A128KW, A128GCM, symKey),
-		"AESKWAndCBC256":      mustEncrypter(A256KW, A256GCM, symKey),
-		"ECDHOnP256AndGCM128": mustEncrypter(ECDH_ES, A128GCM, &ecTestKey256.PublicKey),
-		"ECDHOnP384AndGCM128": mustEncrypter(ECDH_ES, A128GCM, &ecTestKey384.PublicKey),
-		"ECDHOnP521AndGCM128": mustEncrypter(ECDH_ES, A128GCM, &ecTestKey521.PublicKey),
-	}
-)
-
-func BenchmarkEncrypt1BWithOAEPAndGCM(b *testing.B)   { benchEncrypt("1B", "OAEPAndGCM", b) }
-func BenchmarkEncrypt64BWithOAEPAndGCM(b *testing.B)  { benchEncrypt("64B", "OAEPAndGCM", b) }
-func BenchmarkEncrypt1KBWithOAEPAndGCM(b *testing.B)  { benchEncrypt("1KB", "OAEPAndGCM", b) }
-func BenchmarkEncrypt64KBWithOAEPAndGCM(b *testing.B) { benchEncrypt("64KB", "OAEPAndGCM", b) }
-func BenchmarkEncrypt1MBWithOAEPAndGCM(b *testing.B)  { benchEncrypt("1MB", "OAEPAndGCM", b) }
-func BenchmarkEncrypt64MBWithOAEPAndGCM(b *testing.B) { benchEncrypt("64MB", "OAEPAndGCM", b) }
-
-func BenchmarkEncrypt1BWithPKCSAndGCM(b *testing.B)   { benchEncrypt("1B", "PKCSAndGCM", b) }
-func BenchmarkEncrypt64BWithPKCSAndGCM(b *testing.B)  { benchEncrypt("64B", "PKCSAndGCM", b) }
-func BenchmarkEncrypt1KBWithPKCSAndGCM(b *testing.B)  { benchEncrypt("1KB", "PKCSAndGCM", b) }
-func BenchmarkEncrypt64KBWithPKCSAndGCM(b *testing.B) { benchEncrypt("64KB", "PKCSAndGCM", b) }
-func BenchmarkEncrypt1MBWithPKCSAndGCM(b *testing.B)  { benchEncrypt("1MB", "PKCSAndGCM", b) }
-func BenchmarkEncrypt64MBWithPKCSAndGCM(b *testing.B) { benchEncrypt("64MB", "PKCSAndGCM", b) }
-
-func BenchmarkEncrypt1BWithOAEPAndCBC(b *testing.B)   { benchEncrypt("1B", "OAEPAndCBC", b) }
-func BenchmarkEncrypt64BWithOAEPAndCBC(b *testing.B)  { benchEncrypt("64B", "OAEPAndCBC", b) }
-func BenchmarkEncrypt1KBWithOAEPAndCBC(b *testing.B)  { benchEncrypt("1KB", "OAEPAndCBC", b) }
-func BenchmarkEncrypt64KBWithOAEPAndCBC(b *testing.B) { benchEncrypt("64KB", "OAEPAndCBC", b) }
-func BenchmarkEncrypt1MBWithOAEPAndCBC(b *testing.B)  { benchEncrypt("1MB", "OAEPAndCBC", b) }
-func BenchmarkEncrypt64MBWithOAEPAndCBC(b *testing.B) { benchEncrypt("64MB", "OAEPAndCBC", b) }
-
-func BenchmarkEncrypt1BWithPKCSAndCBC(b *testing.B)   { benchEncrypt("1B", "PKCSAndCBC", b) }
-func BenchmarkEncrypt64BWithPKCSAndCBC(b *testing.B)  { benchEncrypt("64B", "PKCSAndCBC", b) }
-func BenchmarkEncrypt1KBWithPKCSAndCBC(b *testing.B)  { benchEncrypt("1KB", "PKCSAndCBC", b) }
-func BenchmarkEncrypt64KBWithPKCSAndCBC(b *testing.B) { benchEncrypt("64KB", "PKCSAndCBC", b) }
-func BenchmarkEncrypt1MBWithPKCSAndCBC(b *testing.B)  { benchEncrypt("1MB", "PKCSAndCBC", b) }
-func BenchmarkEncrypt64MBWithPKCSAndCBC(b *testing.B) { benchEncrypt("64MB", "PKCSAndCBC", b) }
-
-func BenchmarkEncrypt1BWithDirectGCM128(b *testing.B)   { benchEncrypt("1B", "DirectGCM128", b) }
-func BenchmarkEncrypt64BWithDirectGCM128(b *testing.B)  { benchEncrypt("64B", "DirectGCM128", b) }
-func BenchmarkEncrypt1KBWithDirectGCM128(b *testing.B)  { benchEncrypt("1KB", "DirectGCM128", b) }
-func BenchmarkEncrypt64KBWithDirectGCM128(b *testing.B) { benchEncrypt("64KB", "DirectGCM128", b) }
-func BenchmarkEncrypt1MBWithDirectGCM128(b *testing.B)  { benchEncrypt("1MB", "DirectGCM128", b) }
-func BenchmarkEncrypt64MBWithDirectGCM128(b *testing.B) { benchEncrypt("64MB", "DirectGCM128", b) }
-
-func BenchmarkEncrypt1BWithDirectCBC128(b *testing.B)   { benchEncrypt("1B", "DirectCBC128", b) }
-func BenchmarkEncrypt64BWithDirectCBC128(b *testing.B)  { benchEncrypt("64B", "DirectCBC128", b) }
-func BenchmarkEncrypt1KBWithDirectCBC128(b *testing.B)  { benchEncrypt("1KB", "DirectCBC128", b) }
-func BenchmarkEncrypt64KBWithDirectCBC128(b *testing.B) { benchEncrypt("64KB", "DirectCBC128", b) }
-func BenchmarkEncrypt1MBWithDirectCBC128(b *testing.B)  { benchEncrypt("1MB", "DirectCBC128", b) }
-func BenchmarkEncrypt64MBWithDirectCBC128(b *testing.B) { benchEncrypt("64MB", "DirectCBC128", b) }
-
-func BenchmarkEncrypt1BWithDirectGCM256(b *testing.B)   { benchEncrypt("1B", "DirectGCM256", b) }
-func BenchmarkEncrypt64BWithDirectGCM256(b *testing.B)  { benchEncrypt("64B", "DirectGCM256", b) }
-func BenchmarkEncrypt1KBWithDirectGCM256(b *testing.B)  { benchEncrypt("1KB", "DirectGCM256", b) }
-func BenchmarkEncrypt64KBWithDirectGCM256(b *testing.B) { benchEncrypt("64KB", "DirectGCM256", b) }
-func BenchmarkEncrypt1MBWithDirectGCM256(b *testing.B)  { benchEncrypt("1MB", "DirectGCM256", b) }
-func BenchmarkEncrypt64MBWithDirectGCM256(b *testing.B) { benchEncrypt("64MB", "DirectGCM256", b) }
-
-func BenchmarkEncrypt1BWithDirectCBC256(b *testing.B)   { benchEncrypt("1B", "DirectCBC256", b) }
-func BenchmarkEncrypt64BWithDirectCBC256(b *testing.B)  { benchEncrypt("64B", "DirectCBC256", b) }
-func BenchmarkEncrypt1KBWithDirectCBC256(b *testing.B)  { benchEncrypt("1KB", "DirectCBC256", b) }
-func BenchmarkEncrypt64KBWithDirectCBC256(b *testing.B) { benchEncrypt("64KB", "DirectCBC256", b) }
-func BenchmarkEncrypt1MBWithDirectCBC256(b *testing.B)  { benchEncrypt("1MB", "DirectCBC256", b) }
-func BenchmarkEncrypt64MBWithDirectCBC256(b *testing.B) { benchEncrypt("64MB", "DirectCBC256", b) }
-
-func BenchmarkEncrypt1BWithAESKWAndGCM128(b *testing.B)   { benchEncrypt("1B", "AESKWAndGCM128", b) }
-func BenchmarkEncrypt64BWithAESKWAndGCM128(b *testing.B)  { benchEncrypt("64B", "AESKWAndGCM128", b) }
-func BenchmarkEncrypt1KBWithAESKWAndGCM128(b *testing.B)  { benchEncrypt("1KB", "AESKWAndGCM128", b) }
-func BenchmarkEncrypt64KBWithAESKWAndGCM128(b *testing.B) { benchEncrypt("64KB", "AESKWAndGCM128", b) }
-func BenchmarkEncrypt1MBWithAESKWAndGCM128(b *testing.B)  { benchEncrypt("1MB", "AESKWAndGCM128", b) }
-func BenchmarkEncrypt64MBWithAESKWAndGCM128(b *testing.B) { benchEncrypt("64MB", "AESKWAndGCM128", b) }
-
-func BenchmarkEncrypt1BWithAESKWAndCBC256(b *testing.B)   { benchEncrypt("1B", "AESKWAndCBC256", b) }
-func BenchmarkEncrypt64BWithAESKWAndCBC256(b *testing.B)  { benchEncrypt("64B", "AESKWAndCBC256", b) }
-func BenchmarkEncrypt1KBWithAESKWAndCBC256(b *testing.B)  { benchEncrypt("1KB", "AESKWAndCBC256", b) }
-func BenchmarkEncrypt64KBWithAESKWAndCBC256(b *testing.B) { benchEncrypt("64KB", "AESKWAndCBC256", b) }
-func BenchmarkEncrypt1MBWithAESKWAndCBC256(b *testing.B)  { benchEncrypt("1MB", "AESKWAndCBC256", b) }
-func BenchmarkEncrypt64MBWithAESKWAndCBC256(b *testing.B) { benchEncrypt("64MB", "AESKWAndCBC256", b) }
-
-func BenchmarkEncrypt1BWithECDHOnP256AndGCM128(b *testing.B) {
-	benchEncrypt("1B", "ECDHOnP256AndGCM128", b)
-}
-func BenchmarkEncrypt64BWithECDHOnP256AndGCM128(b *testing.B) {
-	benchEncrypt("64B", "ECDHOnP256AndGCM128", b)
-}
-func BenchmarkEncrypt1KBWithECDHOnP256AndGCM128(b *testing.B) {
-	benchEncrypt("1KB", "ECDHOnP256AndGCM128", b)
-}
-func BenchmarkEncrypt64KBWithECDHOnP256AndGCM128(b *testing.B) {
-	benchEncrypt("64KB", "ECDHOnP256AndGCM128", b)
-}
-func BenchmarkEncrypt1MBWithECDHOnP256AndGCM128(b *testing.B) {
-	benchEncrypt("1MB", "ECDHOnP256AndGCM128", b)
-}
-func BenchmarkEncrypt64MBWithECDHOnP256AndGCM128(b *testing.B) {
-	benchEncrypt("64MB", "ECDHOnP256AndGCM128", b)
-}
-
-func BenchmarkEncrypt1BWithECDHOnP384AndGCM128(b *testing.B) {
-	benchEncrypt("1B", "ECDHOnP384AndGCM128", b)
-}
-func BenchmarkEncrypt64BWithECDHOnP384AndGCM128(b *testing.B) {
-	benchEncrypt("64B", "ECDHOnP384AndGCM128", b)
-}
-func BenchmarkEncrypt1KBWithECDHOnP384AndGCM128(b *testing.B) {
-	benchEncrypt("1KB", "ECDHOnP384AndGCM128", b)
-}
-func BenchmarkEncrypt64KBWithECDHOnP384AndGCM128(b *testing.B) {
-	benchEncrypt("64KB", "ECDHOnP384AndGCM128", b)
-}
-func BenchmarkEncrypt1MBWithECDHOnP384AndGCM128(b *testing.B) {
-	benchEncrypt("1MB", "ECDHOnP384AndGCM128", b)
-}
-func BenchmarkEncrypt64MBWithECDHOnP384AndGCM128(b *testing.B) {
-	benchEncrypt("64MB", "ECDHOnP384AndGCM128", b)
-}
-
-func BenchmarkEncrypt1BWithECDHOnP521AndGCM128(b *testing.B) {
-	benchEncrypt("1B", "ECDHOnP521AndGCM128", b)
-}
-func BenchmarkEncrypt64BWithECDHOnP521AndGCM128(b *testing.B) {
-	benchEncrypt("64B", "ECDHOnP521AndGCM128", b)
-}
-func BenchmarkEncrypt1KBWithECDHOnP521AndGCM128(b *testing.B) {
-	benchEncrypt("1KB", "ECDHOnP521AndGCM128", b)
-}
-func BenchmarkEncrypt64KBWithECDHOnP521AndGCM128(b *testing.B) {
-	benchEncrypt("64KB", "ECDHOnP521AndGCM128", b)
-}
-func BenchmarkEncrypt1MBWithECDHOnP521AndGCM128(b *testing.B) {
-	benchEncrypt("1MB", "ECDHOnP521AndGCM128", b)
-}
-func BenchmarkEncrypt64MBWithECDHOnP521AndGCM128(b *testing.B) {
-	benchEncrypt("64MB", "ECDHOnP521AndGCM128", b)
-}
-
-func benchEncrypt(chunkKey, primKey string, b *testing.B) {
-	data, ok := chunks[chunkKey]
-	if !ok {
-		b.Fatalf("unknown chunk size %s", chunkKey)
-	}
-
-	enc, ok := encrypters[primKey]
-	if !ok {
-		b.Fatalf("unknown encrypter %s", primKey)
-	}
-
-	b.SetBytes(int64(len(data)))
-	for i := 0; i < b.N; i++ {
-		enc.Encrypt(data)
-	}
-}
-
-var (
-	decryptionKeys = map[string]interface{}{
-		"OAEPAndGCM": rsaTestKey,
-		"PKCSAndGCM": rsaTestKey,
-		"OAEPAndCBC": rsaTestKey,
-		"PKCSAndCBC": rsaTestKey,
-
-		"DirectGCM128": symKey,
-		"DirectCBC128": symKey,
-		"DirectGCM256": symKey,
-		"DirectCBC256": symKey,
-
-		"AESKWAndGCM128": symKey,
-		"AESKWAndCBC256": symKey,
-
-		"ECDHOnP256AndGCM128": ecTestKey256,
-		"ECDHOnP384AndGCM128": ecTestKey384,
-		"ECDHOnP521AndGCM128": ecTestKey521,
-	}
-)
-
-func BenchmarkDecrypt1BWithOAEPAndGCM(b *testing.B)   { benchDecrypt("1B", "OAEPAndGCM", b) }
-func BenchmarkDecrypt64BWithOAEPAndGCM(b *testing.B)  { benchDecrypt("64B", "OAEPAndGCM", b) }
-func BenchmarkDecrypt1KBWithOAEPAndGCM(b *testing.B)  { benchDecrypt("1KB", "OAEPAndGCM", b) }
-func BenchmarkDecrypt64KBWithOAEPAndGCM(b *testing.B) { benchDecrypt("64KB", "OAEPAndGCM", b) }
-func BenchmarkDecrypt1MBWithOAEPAndGCM(b *testing.B)  { benchDecrypt("1MB", "OAEPAndGCM", b) }
-func BenchmarkDecrypt64MBWithOAEPAndGCM(b *testing.B) { benchDecrypt("64MB", "OAEPAndGCM", b) }
-
-func BenchmarkDecrypt1BWithPKCSAndGCM(b *testing.B)   { benchDecrypt("1B", "PKCSAndGCM", b) }
-func BenchmarkDecrypt64BWithPKCSAndGCM(b *testing.B)  { benchDecrypt("64B", "PKCSAndGCM", b) }
-func BenchmarkDecrypt1KBWithPKCSAndGCM(b *testing.B)  { benchDecrypt("1KB", "PKCSAndGCM", b) }
-func BenchmarkDecrypt64KBWithPKCSAndGCM(b *testing.B) { benchDecrypt("64KB", "PKCSAndGCM", b) }
-func BenchmarkDecrypt1MBWithPKCSAndGCM(b *testing.B)  { benchDecrypt("1MB", "PKCSAndGCM", b) }
-func BenchmarkDecrypt64MBWithPKCSAndGCM(b *testing.B) { benchDecrypt("64MB", "PKCSAndGCM", b) }
-
-func BenchmarkDecrypt1BWithOAEPAndCBC(b *testing.B)   { benchDecrypt("1B", "OAEPAndCBC", b) }
-func BenchmarkDecrypt64BWithOAEPAndCBC(b *testing.B)  { benchDecrypt("64B", "OAEPAndCBC", b) }
-func BenchmarkDecrypt1KBWithOAEPAndCBC(b *testing.B)  { benchDecrypt("1KB", "OAEPAndCBC", b) }
-func BenchmarkDecrypt64KBWithOAEPAndCBC(b *testing.B) { benchDecrypt("64KB", "OAEPAndCBC", b) }
-func BenchmarkDecrypt1MBWithOAEPAndCBC(b *testing.B)  { benchDecrypt("1MB", "OAEPAndCBC", b) }
-func BenchmarkDecrypt64MBWithOAEPAndCBC(b *testing.B) { benchDecrypt("64MB", "OAEPAndCBC", b) }
-
-func BenchmarkDecrypt1BWithPKCSAndCBC(b *testing.B)   { benchDecrypt("1B", "PKCSAndCBC", b) }
-func BenchmarkDecrypt64BWithPKCSAndCBC(b *testing.B)  { benchDecrypt("64B", "PKCSAndCBC", b) }
-func BenchmarkDecrypt1KBWithPKCSAndCBC(b *testing.B)  { benchDecrypt("1KB", "PKCSAndCBC", b) }
-func BenchmarkDecrypt64KBWithPKCSAndCBC(b *testing.B) { benchDecrypt("64KB", "PKCSAndCBC", b) }
-func BenchmarkDecrypt1MBWithPKCSAndCBC(b *testing.B)  { benchDecrypt("1MB", "PKCSAndCBC", b) }
-func BenchmarkDecrypt64MBWithPKCSAndCBC(b *testing.B) { benchDecrypt("64MB", "PKCSAndCBC", b) }
-
-func BenchmarkDecrypt1BWithDirectGCM128(b *testing.B)   { benchDecrypt("1B", "DirectGCM128", b) }
-func BenchmarkDecrypt64BWithDirectGCM128(b *testing.B)  { benchDecrypt("64B", "DirectGCM128", b) }
-func BenchmarkDecrypt1KBWithDirectGCM128(b *testing.B)  { benchDecrypt("1KB", "DirectGCM128", b) }
-func BenchmarkDecrypt64KBWithDirectGCM128(b *testing.B) { benchDecrypt("64KB", "DirectGCM128", b) }
-func BenchmarkDecrypt1MBWithDirectGCM128(b *testing.B)  { benchDecrypt("1MB", "DirectGCM128", b) }
-func BenchmarkDecrypt64MBWithDirectGCM128(b *testing.B) { benchDecrypt("64MB", "DirectGCM128", b) }
-
-func BenchmarkDecrypt1BWithDirectCBC128(b *testing.B)   { benchDecrypt("1B", "DirectCBC128", b) }
-func BenchmarkDecrypt64BWithDirectCBC128(b *testing.B)  { benchDecrypt("64B", "DirectCBC128", b) }
-func BenchmarkDecrypt1KBWithDirectCBC128(b *testing.B)  { benchDecrypt("1KB", "DirectCBC128", b) }
-func BenchmarkDecrypt64KBWithDirectCBC128(b *testing.B) { benchDecrypt("64KB", "DirectCBC128", b) }
-func BenchmarkDecrypt1MBWithDirectCBC128(b *testing.B)  { benchDecrypt("1MB", "DirectCBC128", b) }
-func BenchmarkDecrypt64MBWithDirectCBC128(b *testing.B) { benchDecrypt("64MB", "DirectCBC128", b) }
-
-func BenchmarkDecrypt1BWithDirectGCM256(b *testing.B)   { benchDecrypt("1B", "DirectGCM256", b) }
-func BenchmarkDecrypt64BWithDirectGCM256(b *testing.B)  { benchDecrypt("64B", "DirectGCM256", b) }
-func BenchmarkDecrypt1KBWithDirectGCM256(b *testing.B)  { benchDecrypt("1KB", "DirectGCM256", b) }
-func BenchmarkDecrypt64KBWithDirectGCM256(b *testing.B) { benchDecrypt("64KB", "DirectGCM256", b) }
-func BenchmarkDecrypt1MBWithDirectGCM256(b *testing.B)  { benchDecrypt("1MB", "DirectGCM256", b) }
-func BenchmarkDecrypt64MBWithDirectGCM256(b *testing.B) { benchDecrypt("64MB", "DirectGCM256", b) }
-
-func BenchmarkDecrypt1BWithDirectCBC256(b *testing.B)   { benchDecrypt("1B", "DirectCBC256", b) }
-func BenchmarkDecrypt64BWithDirectCBC256(b *testing.B)  { benchDecrypt("64B", "DirectCBC256", b) }
-func BenchmarkDecrypt1KBWithDirectCBC256(b *testing.B)  { benchDecrypt("1KB", "DirectCBC256", b) }
-func BenchmarkDecrypt64KBWithDirectCBC256(b *testing.B) { benchDecrypt("64KB", "DirectCBC256", b) }
-func BenchmarkDecrypt1MBWithDirectCBC256(b *testing.B)  { benchDecrypt("1MB", "DirectCBC256", b) }
-func BenchmarkDecrypt64MBWithDirectCBC256(b *testing.B) { benchDecrypt("64MB", "DirectCBC256", b) }
-
-func BenchmarkDecrypt1BWithAESKWAndGCM128(b *testing.B)   { benchDecrypt("1B", "AESKWAndGCM128", b) }
-func BenchmarkDecrypt64BWithAESKWAndGCM128(b *testing.B)  { benchDecrypt("64B", "AESKWAndGCM128", b) }
-func BenchmarkDecrypt1KBWithAESKWAndGCM128(b *testing.B)  { benchDecrypt("1KB", "AESKWAndGCM128", b) }
-func BenchmarkDecrypt64KBWithAESKWAndGCM128(b *testing.B) { benchDecrypt("64KB", "AESKWAndGCM128", b) }
-func BenchmarkDecrypt1MBWithAESKWAndGCM128(b *testing.B)  { benchDecrypt("1MB", "AESKWAndGCM128", b) }
-func BenchmarkDecrypt64MBWithAESKWAndGCM128(b *testing.B) { benchDecrypt("64MB", "AESKWAndGCM128", b) }
-
-func BenchmarkDecrypt1BWithAESKWAndCBC256(b *testing.B)   { benchDecrypt("1B", "AESKWAndCBC256", b) }
-func BenchmarkDecrypt64BWithAESKWAndCBC256(b *testing.B)  { benchDecrypt("64B", "AESKWAndCBC256", b) }
-func BenchmarkDecrypt1KBWithAESKWAndCBC256(b *testing.B)  { benchDecrypt("1KB", "AESKWAndCBC256", b) }
-func BenchmarkDecrypt64KBWithAESKWAndCBC256(b *testing.B) { benchDecrypt("64KB", "AESKWAndCBC256", b) }
-func BenchmarkDecrypt1MBWithAESKWAndCBC256(b *testing.B)  { benchDecrypt("1MB", "AESKWAndCBC256", b) }
-func BenchmarkDecrypt64MBWithAESKWAndCBC256(b *testing.B) { benchDecrypt("64MB", "AESKWAndCBC256", b) }
-
-func BenchmarkDecrypt1BWithECDHOnP256AndGCM128(b *testing.B) {
-	benchDecrypt("1B", "ECDHOnP256AndGCM128", b)
-}
-func BenchmarkDecrypt64BWithECDHOnP256AndGCM128(b *testing.B) {
-	benchDecrypt("64B", "ECDHOnP256AndGCM128", b)
-}
-func BenchmarkDecrypt1KBWithECDHOnP256AndGCM128(b *testing.B) {
-	benchDecrypt("1KB", "ECDHOnP256AndGCM128", b)
-}
-func BenchmarkDecrypt64KBWithECDHOnP256AndGCM128(b *testing.B) {
-	benchDecrypt("64KB", "ECDHOnP256AndGCM128", b)
-}
-func BenchmarkDecrypt1MBWithECDHOnP256AndGCM128(b *testing.B) {
-	benchDecrypt("1MB", "ECDHOnP256AndGCM128", b)
-}
-func BenchmarkDecrypt64MBWithECDHOnP256AndGCM128(b *testing.B) {
-	benchDecrypt("64MB", "ECDHOnP256AndGCM128", b)
-}
-
-func BenchmarkDecrypt1BWithECDHOnP384AndGCM128(b *testing.B) {
-	benchDecrypt("1B", "ECDHOnP384AndGCM128", b)
-}
-func BenchmarkDecrypt64BWithECDHOnP384AndGCM128(b *testing.B) {
-	benchDecrypt("64B", "ECDHOnP384AndGCM128", b)
-}
-func BenchmarkDecrypt1KBWithECDHOnP384AndGCM128(b *testing.B) {
-	benchDecrypt("1KB", "ECDHOnP384AndGCM128", b)
-}
-func BenchmarkDecrypt64KBWithECDHOnP384AndGCM128(b *testing.B) {
-	benchDecrypt("64KB", "ECDHOnP384AndGCM128", b)
-}
-func BenchmarkDecrypt1MBWithECDHOnP384AndGCM128(b *testing.B) {
-	benchDecrypt("1MB", "ECDHOnP384AndGCM128", b)
-}
-func BenchmarkDecrypt64MBWithECDHOnP384AndGCM128(b *testing.B) {
-	benchDecrypt("64MB", "ECDHOnP384AndGCM128", b)
-}
-
-func BenchmarkDecrypt1BWithECDHOnP521AndGCM128(b *testing.B) {
-	benchDecrypt("1B", "ECDHOnP521AndGCM128", b)
-}
-func BenchmarkDecrypt64BWithECDHOnP521AndGCM128(b *testing.B) {
-	benchDecrypt("64B", "ECDHOnP521AndGCM128", b)
-}
-func BenchmarkDecrypt1KBWithECDHOnP521AndGCM128(b *testing.B) {
-	benchDecrypt("1KB", "ECDHOnP521AndGCM128", b)
-}
-func BenchmarkDecrypt64KBWithECDHOnP521AndGCM128(b *testing.B) {
-	benchDecrypt("64KB", "ECDHOnP521AndGCM128", b)
-}
-func BenchmarkDecrypt1MBWithECDHOnP521AndGCM128(b *testing.B) {
-	benchDecrypt("1MB", "ECDHOnP521AndGCM128", b)
-}
-func BenchmarkDecrypt64MBWithECDHOnP521AndGCM128(b *testing.B) {
-	benchDecrypt("64MB", "ECDHOnP521AndGCM128", b)
-}
-
-func benchDecrypt(chunkKey, primKey string, b *testing.B) {
-	chunk, ok := chunks[chunkKey]
-	if !ok {
-		b.Fatalf("unknown chunk size %s", chunkKey)
-	}
-
-	enc, ok := encrypters[primKey]
-	if !ok {
-		b.Fatalf("unknown encrypter %s", primKey)
-	}
-
-	dec, ok := decryptionKeys[primKey]
-	if !ok {
-		b.Fatalf("unknown decryption key %s", primKey)
-	}
-
-	data, err := enc.Encrypt(chunk)
-	if err != nil {
-		b.Fatal(err)
-	}
-
-	b.SetBytes(int64(len(chunk)))
-	b.ResetTimer()
-	for i := 0; i < b.N; i++ {
-		data.Decrypt(dec)
-	}
-}
-
-func mustEncrypter(keyAlg KeyAlgorithm, encAlg ContentEncryption, encryptionKey interface{}) Encrypter {
-	enc, err := NewEncrypter(keyAlg, encAlg, encryptionKey)
-	if err != nil {
-		panic(err)
-	}
-	return enc
-}
diff --git a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/doc_test.go b/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/doc_test.go
deleted file mode 100644
index 50468295d..000000000
--- a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/doc_test.go
+++ /dev/null
@@ -1,226 +0,0 @@
-/*-
- * Copyright 2014 Square Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package jose
-
-import (
-	"crypto/ecdsa"
-	"crypto/rand"
-	"crypto/rsa"
-	"fmt"
-)
-
-// Dummy encrypter for use in examples
-var encrypter, _ = NewEncrypter(DIRECT, A128GCM, []byte{})
-
-func Example_jWE() {
-	// Generate a public/private key pair to use for this example. The library
-	// also provides two utility functions (LoadPublicKey and LoadPrivateKey)
-	// that can be used to load keys from PEM/DER-encoded data.
-	privateKey, err := rsa.GenerateKey(rand.Reader, 2048)
-	if err != nil {
-		panic(err)
-	}
-
-	// Instantiate an encrypter using RSA-OAEP with AES128-GCM. An error would
-	// indicate that the selected algorithm(s) are not currently supported.
-	publicKey := &privateKey.PublicKey
-	encrypter, err := NewEncrypter(RSA_OAEP, A128GCM, publicKey)
-	if err != nil {
-		panic(err)
-	}
-
-	// Encrypt a sample plaintext. Calling the encrypter returns an encrypted
-	// JWE object, which can then be serialized for output afterwards. An error
-	// would indicate a problem in an underlying cryptographic primitive.
-	var plaintext = []byte("Lorem ipsum dolor sit amet")
-	object, err := encrypter.Encrypt(plaintext)
-	if err != nil {
-		panic(err)
-	}
-
-	// Serialize the encrypted object using the full serialization format.
-	// Alternatively you can also use the compact format here by calling
-	// object.CompactSerialize() instead.
-	serialized := object.FullSerialize()
-
-	// Parse the serialized, encrypted JWE object. An error would indicate that
-	// the given input did not represent a valid message.
-	object, err = ParseEncrypted(serialized)
-	if err != nil {
-		panic(err)
-	}
-
-	// Now we can decrypt and get back our original plaintext. An error here
-	// would indicate the the message failed to decrypt, e.g. because the auth
-	// tag was broken or the message was tampered with.
-	decrypted, err := object.Decrypt(privateKey)
-	if err != nil {
-		panic(err)
-	}
-
-	fmt.Printf(string(decrypted))
-	// output: Lorem ipsum dolor sit amet
-}
-
-func Example_jWS() {
-	// Generate a public/private key pair to use for this example. The library
-	// also provides two utility functions (LoadPublicKey and LoadPrivateKey)
-	// that can be used to load keys from PEM/DER-encoded data.
-	privateKey, err := rsa.GenerateKey(rand.Reader, 2048)
-	if err != nil {
-		panic(err)
-	}
-
-	// Instantiate a signer using RSASSA-PSS (SHA512) with the given private key.
-	signer, err := NewSigner(PS512, privateKey)
-	if err != nil {
-		panic(err)
-	}
-
-	// Sign a sample payload. Calling the signer returns a protected JWS object,
-	// which can then be serialized for output afterwards. An error would
-	// indicate a problem in an underlying cryptographic primitive.
-	var payload = []byte("Lorem ipsum dolor sit amet")
-	object, err := signer.Sign(payload)
-	if err != nil {
-		panic(err)
-	}
-
-	// Serialize the encrypted object using the full serialization format.
-	// Alternatively you can also use the compact format here by calling
-	// object.CompactSerialize() instead.
-	serialized := object.FullSerialize()
-
-	// Parse the serialized, protected JWS object. An error would indicate that
-	// the given input did not represent a valid message.
-	object, err = ParseSigned(serialized)
-	if err != nil {
-		panic(err)
-	}
-
-	// Now we can verify the signature on the payload. An error here would
-	// indicate the the message failed to verify, e.g. because the signature was
-	// broken or the message was tampered with.
-	output, err := object.Verify(&privateKey.PublicKey)
-	if err != nil {
-		panic(err)
-	}
-
-	fmt.Printf(string(output))
-	// output: Lorem ipsum dolor sit amet
-}
-
-func ExampleNewEncrypter_publicKey() {
-	var publicKey *rsa.PublicKey
-
-	// Instantiate an encrypter using RSA-OAEP with AES128-GCM.
-	NewEncrypter(RSA_OAEP, A128GCM, publicKey)
-
-	// Instantiate an encrypter using RSA-PKCS1v1.5 with AES128-CBC+HMAC.
-	NewEncrypter(RSA1_5, A128CBC_HS256, publicKey)
-}
-
-func ExampleNewEncrypter_symmetric() {
-	var sharedKey []byte
-
-	// Instantiate an encrypter using AES128-GCM with AES-GCM key wrap.
-	NewEncrypter(A128GCMKW, A128GCM, sharedKey)
-
-	// Instantiate an encrypter using AES256-GCM directly, w/o key wrapping.
-	NewEncrypter(DIRECT, A256GCM, sharedKey)
-}
-
-func ExampleNewSigner_publicKey() {
-	var rsaPrivateKey *rsa.PrivateKey
-	var ecdsaPrivateKey *ecdsa.PrivateKey
-
-	// Instantiate a signer using RSA-PKCS#1v1.5 with SHA-256.
-	NewSigner(RS256, rsaPrivateKey)
-
-	// Instantiate a signer using ECDSA with SHA-384.
-	NewSigner(ES384, ecdsaPrivateKey)
-}
-
-func ExampleNewSigner_symmetric() {
-	var sharedKey []byte
-
-	// Instantiate an signer using HMAC-SHA256.
-	NewSigner(HS256, sharedKey)
-
-	// Instantiate an signer using HMAC-SHA512.
-	NewSigner(HS512, sharedKey)
-}
-
-func ExampleNewMultiEncrypter() {
-	var publicKey *rsa.PublicKey
-	var sharedKey []byte
-
-	// Instantiate an encrypter using AES-GCM.
-	encrypter, err := NewMultiEncrypter(A128GCM)
-	if err != nil {
-		panic(err)
-	}
-
-	// Add a recipient using a shared key with AES-GCM key wap
-	err = encrypter.AddRecipient(A128GCMKW, sharedKey)
-	if err != nil {
-		panic(err)
-	}
-
-	// Add a recipient using an RSA public key with RSA-OAEP
-	err = encrypter.AddRecipient(RSA_OAEP, publicKey)
-	if err != nil {
-		panic(err)
-	}
-}
-
-func ExampleNewMultiSigner() {
-	var privateKey *rsa.PrivateKey
-	var sharedKey []byte
-
-	// Instantiate a signer for multiple recipients.
-	signer := NewMultiSigner()
-
-	// Add a recipient using a shared key with HMAC-SHA256
-	err := signer.AddRecipient(HS256, sharedKey)
-	if err != nil {
-		panic(err)
-	}
-
-	// Add a recipient using an RSA private key with RSASSA-PSS with SHA384
-	err = signer.AddRecipient(PS384, privateKey)
-	if err != nil {
-		panic(err)
-	}
-}
-
-func ExampleEncrypter_encrypt() {
-	// Encrypt a plaintext in order to get an encrypted JWE object.
-	var plaintext = []byte("This is a secret message")
-
-	encrypter.Encrypt(plaintext)
-}
-
-func ExampleEncrypter_encryptWithAuthData() {
-	// Encrypt a plaintext in order to get an encrypted JWE object. Also attach
-	// some additional authenticated data (AAD) to the object. Note that objects
-	// with attached AAD can only be represented using full serialization.
-	var plaintext = []byte("This is a secret message")
-	var aad = []byte("This is authenticated, but public data")
-
-	encrypter.EncryptWithAuthData(plaintext, aad)
-}
diff --git a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/encoding_test.go b/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/encoding_test.go
deleted file mode 100644
index e2f8d979c..000000000
--- a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/encoding_test.go
+++ /dev/null
@@ -1,173 +0,0 @@
-/*-
- * Copyright 2014 Square Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package jose
-
-import (
-	"bytes"
-	"strings"
-	"testing"
-)
-
-func TestBase64URLEncode(t *testing.T) {
-	// Test arrays with various sizes
-	if base64URLEncode([]byte{}) != "" {
-		t.Error("failed to encode empty array")
-	}
-
-	if base64URLEncode([]byte{0}) != "AA" {
-		t.Error("failed to encode [0x00]")
-	}
-
-	if base64URLEncode([]byte{0, 1}) != "AAE" {
-		t.Error("failed to encode [0x00, 0x01]")
-	}
-
-	if base64URLEncode([]byte{0, 1, 2}) != "AAEC" {
-		t.Error("failed to encode [0x00, 0x01, 0x02]")
-	}
-
-	if base64URLEncode([]byte{0, 1, 2, 3}) != "AAECAw" {
-		t.Error("failed to encode [0x00, 0x01, 0x02, 0x03]")
-	}
-}
-
-func TestBase64URLDecode(t *testing.T) {
-	// Test arrays with various sizes
-	val, err := base64URLDecode("")
-	if err != nil || !bytes.Equal(val, []byte{}) {
-		t.Error("failed to decode empty array")
-	}
-
-	val, err = base64URLDecode("AA")
-	if err != nil || !bytes.Equal(val, []byte{0}) {
-		t.Error("failed to decode [0x00]")
-	}
-
-	val, err = base64URLDecode("AAE")
-	if err != nil || !bytes.Equal(val, []byte{0, 1}) {
-		t.Error("failed to decode [0x00, 0x01]")
-	}
-
-	val, err = base64URLDecode("AAEC")
-	if err != nil || !bytes.Equal(val, []byte{0, 1, 2}) {
-		t.Error("failed to decode [0x00, 0x01, 0x02]")
-	}
-
-	val, err = base64URLDecode("AAECAw")
-	if err != nil || !bytes.Equal(val, []byte{0, 1, 2, 3}) {
-		t.Error("failed to decode [0x00, 0x01, 0x02, 0x03]")
-	}
-}
-
-func TestDeflateRoundtrip(t *testing.T) {
-	original := []byte("Lorem ipsum dolor sit amet")
-
-	compressed, err := deflate(original)
-	if err != nil {
-		panic(err)
-	}
-
-	output, err := inflate(compressed)
-	if err != nil {
-		panic(err)
-	}
-
-	if bytes.Compare(output, original) != 0 {
-		t.Error("Input and output do not match")
-	}
-}
-
-func TestInvalidCompression(t *testing.T) {
-	_, err := compress("XYZ", []byte{})
-	if err == nil {
-		t.Error("should not accept invalid algorithm")
-	}
-
-	_, err = decompress("XYZ", []byte{})
-	if err == nil {
-		t.Error("should not accept invalid algorithm")
-	}
-
-	_, err = decompress(DEFLATE, []byte{1, 2, 3, 4})
-	if err == nil {
-		t.Error("should not accept invalid data")
-	}
-}
-
-func TestByteBufferTrim(t *testing.T) {
-	buf := newBufferFromInt(1)
-	if !bytes.Equal(buf.data, []byte{1}) {
-		t.Error("Byte buffer for integer '1' should contain [0x01]")
-	}
-
-	buf = newBufferFromInt(65537)
-	if !bytes.Equal(buf.data, []byte{1, 0, 1}) {
-		t.Error("Byte buffer for integer '65537' should contain [0x01, 0x00, 0x01]")
-	}
-}
-
-func TestFixedSizeBuffer(t *testing.T) {
-	data0 := []byte{}
-	data1 := []byte{1}
-	data2 := []byte{1, 2}
-	data3 := []byte{1, 2, 3}
-	data4 := []byte{1, 2, 3, 4}
-
-	buf0 := newFixedSizeBuffer(data0, 4)
-	buf1 := newFixedSizeBuffer(data1, 4)
-	buf2 := newFixedSizeBuffer(data2, 4)
-	buf3 := newFixedSizeBuffer(data3, 4)
-	buf4 := newFixedSizeBuffer(data4, 4)
-
-	if !bytes.Equal(buf0.data, []byte{0, 0, 0, 0}) {
-		t.Error("Invalid padded buffer for buf0")
-	}
-	if !bytes.Equal(buf1.data, []byte{0, 0, 0, 1}) {
-		t.Error("Invalid padded buffer for buf1")
-	}
-	if !bytes.Equal(buf2.data, []byte{0, 0, 1, 2}) {
-		t.Error("Invalid padded buffer for buf2")
-	}
-	if !bytes.Equal(buf3.data, []byte{0, 1, 2, 3}) {
-		t.Error("Invalid padded buffer for buf3")
-	}
-	if !bytes.Equal(buf4.data, []byte{1, 2, 3, 4}) {
-		t.Error("Invalid padded buffer for buf4")
-	}
-}
-
-func TestSerializeJSONRejectsNil(t *testing.T) {
-	defer func() {
-		r := recover()
-		if r == nil || !strings.Contains(r.(string), "nil pointer") {
-			t.Error("serialize function should not accept nil pointer")
-		}
-	}()
-
-	mustSerializeJSON(nil)
-}
-
-func TestFixedSizeBufferTooLarge(t *testing.T) {
-	defer func() {
-		r := recover()
-		if r == nil {
-			t.Error("should not be able to create fixed size buffer with oversized data")
-		}
-	}()
-
-	newFixedSizeBuffer(make([]byte, 2), 1)
-}
diff --git a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/json/README.md b/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/json/README.md
deleted file mode 100644
index 86de5e558..000000000
--- a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/json/README.md
+++ /dev/null
@@ -1,13 +0,0 @@
-# Safe JSON
-
-This repository contains a fork of the `encoding/json` package from Go 1.6.
-
-The following changes were made:
-
-* Object deserialization uses case-sensitive member name matching instead of
-  [case-insensitive matching](https://www.ietf.org/mail-archive/web/json/current/msg03763.html).
-  This is to avoid differences in the interpretation of JOSE messages between
-  go-jose and libraries written in other languages.
-* When deserializing a JSON object, we check for duplicate keys and reject the
-  input whenever we detect a duplicate. Rather than trying to work with malformed
-  data, we prefer to reject it right away.
diff --git a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/json/bench_test.go b/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/json/bench_test.go
deleted file mode 100644
index ed89d1156..000000000
--- a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/json/bench_test.go
+++ /dev/null
@@ -1,223 +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.
-
-// Large data benchmark.
-// The JSON data is a summary of agl's changes in the
-// go, webkit, and chromium open source projects.
-// We benchmark converting between the JSON form
-// and in-memory data structures.
-
-package json
-
-import (
-	"bytes"
-	"compress/gzip"
-	"io/ioutil"
-	"os"
-	"strings"
-	"testing"
-)
-
-type codeResponse struct {
-	Tree     *codeNode `json:"tree"`
-	Username string    `json:"username"`
-}
-
-type codeNode struct {
-	Name     string      `json:"name"`
-	Kids     []*codeNode `json:"kids"`
-	CLWeight float64     `json:"cl_weight"`
-	Touches  int         `json:"touches"`
-	MinT     int64       `json:"min_t"`
-	MaxT     int64       `json:"max_t"`
-	MeanT    int64       `json:"mean_t"`
-}
-
-var codeJSON []byte
-var codeStruct codeResponse
-
-func codeInit() {
-	f, err := os.Open("testdata/code.json.gz")
-	if err != nil {
-		panic(err)
-	}
-	defer f.Close()
-	gz, err := gzip.NewReader(f)
-	if err != nil {
-		panic(err)
-	}
-	data, err := ioutil.ReadAll(gz)
-	if err != nil {
-		panic(err)
-	}
-
-	codeJSON = data
-
-	if err := Unmarshal(codeJSON, &codeStruct); err != nil {
-		panic("unmarshal code.json: " + err.Error())
-	}
-
-	if data, err = Marshal(&codeStruct); err != nil {
-		panic("marshal code.json: " + err.Error())
-	}
-
-	if !bytes.Equal(data, codeJSON) {
-		println("different lengths", len(data), len(codeJSON))
-		for i := 0; i < len(data) && i < len(codeJSON); i++ {
-			if data[i] != codeJSON[i] {
-				println("re-marshal: changed at byte", i)
-				println("orig: ", string(codeJSON[i-10:i+10]))
-				println("new: ", string(data[i-10:i+10]))
-				break
-			}
-		}
-		panic("re-marshal code.json: different result")
-	}
-}
-
-func BenchmarkCodeEncoder(b *testing.B) {
-	if codeJSON == nil {
-		b.StopTimer()
-		codeInit()
-		b.StartTimer()
-	}
-	enc := NewEncoder(ioutil.Discard)
-	for i := 0; i < b.N; i++ {
-		if err := enc.Encode(&codeStruct); err != nil {
-			b.Fatal("Encode:", err)
-		}
-	}
-	b.SetBytes(int64(len(codeJSON)))
-}
-
-func BenchmarkCodeMarshal(b *testing.B) {
-	if codeJSON == nil {
-		b.StopTimer()
-		codeInit()
-		b.StartTimer()
-	}
-	for i := 0; i < b.N; i++ {
-		if _, err := Marshal(&codeStruct); err != nil {
-			b.Fatal("Marshal:", err)
-		}
-	}
-	b.SetBytes(int64(len(codeJSON)))
-}
-
-func BenchmarkCodeDecoder(b *testing.B) {
-	if codeJSON == nil {
-		b.StopTimer()
-		codeInit()
-		b.StartTimer()
-	}
-	var buf bytes.Buffer
-	dec := NewDecoder(&buf)
-	var r codeResponse
-	for i := 0; i < b.N; i++ {
-		buf.Write(codeJSON)
-		// hide EOF
-		buf.WriteByte('\n')
-		buf.WriteByte('\n')
-		buf.WriteByte('\n')
-		if err := dec.Decode(&r); err != nil {
-			b.Fatal("Decode:", err)
-		}
-	}
-	b.SetBytes(int64(len(codeJSON)))
-}
-
-func BenchmarkDecoderStream(b *testing.B) {
-	b.StopTimer()
-	var buf bytes.Buffer
-	dec := NewDecoder(&buf)
-	buf.WriteString(`"` + strings.Repeat("x", 1000000) + `"` + "\n\n\n")
-	var x interface{}
-	if err := dec.Decode(&x); err != nil {
-		b.Fatal("Decode:", err)
-	}
-	ones := strings.Repeat(" 1\n", 300000) + "\n\n\n"
-	b.StartTimer()
-	for i := 0; i < b.N; i++ {
-		if i%300000 == 0 {
-			buf.WriteString(ones)
-		}
-		x = nil
-		if err := dec.Decode(&x); err != nil || x != 1.0 {
-			b.Fatalf("Decode: %v after %d", err, i)
-		}
-	}
-}
-
-func BenchmarkCodeUnmarshal(b *testing.B) {
-	if codeJSON == nil {
-		b.StopTimer()
-		codeInit()
-		b.StartTimer()
-	}
-	for i := 0; i < b.N; i++ {
-		var r codeResponse
-		if err := Unmarshal(codeJSON, &r); err != nil {
-			b.Fatal("Unmmarshal:", err)
-		}
-	}
-	b.SetBytes(int64(len(codeJSON)))
-}
-
-func BenchmarkCodeUnmarshalReuse(b *testing.B) {
-	if codeJSON == nil {
-		b.StopTimer()
-		codeInit()
-		b.StartTimer()
-	}
-	var r codeResponse
-	for i := 0; i < b.N; i++ {
-		if err := Unmarshal(codeJSON, &r); err != nil {
-			b.Fatal("Unmmarshal:", err)
-		}
-	}
-}
-
-func BenchmarkUnmarshalString(b *testing.B) {
-	data := []byte(`"hello, world"`)
-	var s string
-
-	for i := 0; i < b.N; i++ {
-		if err := Unmarshal(data, &s); err != nil {
-			b.Fatal("Unmarshal:", err)
-		}
-	}
-}
-
-func BenchmarkUnmarshalFloat64(b *testing.B) {
-	var f float64
-	data := []byte(`3.14`)
-
-	for i := 0; i < b.N; i++ {
-		if err := Unmarshal(data, &f); err != nil {
-			b.Fatal("Unmarshal:", err)
-		}
-	}
-}
-
-func BenchmarkUnmarshalInt64(b *testing.B) {
-	var x int64
-	data := []byte(`3`)
-
-	for i := 0; i < b.N; i++ {
-		if err := Unmarshal(data, &x); err != nil {
-			b.Fatal("Unmarshal:", err)
-		}
-	}
-}
-
-func BenchmarkIssue10335(b *testing.B) {
-	b.ReportAllocs()
-	var s struct{}
-	j := []byte(`{"a":{ }}`)
-	for n := 0; n < b.N; n++ {
-		if err := Unmarshal(j, &s); err != nil {
-			b.Fatal(err)
-		}
-	}
-}
diff --git a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/json/decode_test.go b/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/json/decode_test.go
deleted file mode 100644
index 7577b21ac..000000000
--- a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/json/decode_test.go
+++ /dev/null
@@ -1,1474 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package json
-
-import (
-	"bytes"
-	"encoding"
-	"fmt"
-	"image"
-	"net"
-	"reflect"
-	"strings"
-	"testing"
-	"time"
-)
-
-type T struct {
-	X string
-	Y int
-	Z int `json:"-"`
-}
-
-type U struct {
-	Alphabet string `json:"alpha"`
-}
-
-type V struct {
-	F1 interface{}
-	F2 int32
-	F3 Number
-}
-
-// ifaceNumAsFloat64/ifaceNumAsNumber are used to test unmarshaling with and
-// without UseNumber
-var ifaceNumAsFloat64 = map[string]interface{}{
-	"k1": float64(1),
-	"k2": "s",
-	"k3": []interface{}{float64(1), float64(2.0), float64(3e-3)},
-	"k4": map[string]interface{}{"kk1": "s", "kk2": float64(2)},
-}
-
-var ifaceNumAsNumber = map[string]interface{}{
-	"k1": Number("1"),
-	"k2": "s",
-	"k3": []interface{}{Number("1"), Number("2.0"), Number("3e-3")},
-	"k4": map[string]interface{}{"kk1": "s", "kk2": Number("2")},
-}
-
-type tx struct {
-	x int
-}
-
-// A type that can unmarshal itself.
-
-type unmarshaler struct {
-	T bool
-}
-
-func (u *unmarshaler) UnmarshalJSON(b []byte) error {
-	*u = unmarshaler{true} // All we need to see that UnmarshalJSON is called.
-	return nil
-}
-
-type ustruct struct {
-	M unmarshaler
-}
-
-type unmarshalerText struct {
-	T bool
-}
-
-// needed for re-marshaling tests
-func (u *unmarshalerText) MarshalText() ([]byte, error) {
-	return []byte(""), nil
-}
-
-func (u *unmarshalerText) UnmarshalText(b []byte) error {
-	*u = unmarshalerText{true} // All we need to see that UnmarshalText is called.
-	return nil
-}
-
-var _ encoding.TextUnmarshaler = (*unmarshalerText)(nil)
-
-type ustructText struct {
-	M unmarshalerText
-}
-
-var (
-	um0, um1 unmarshaler // target2 of unmarshaling
-	ump      = &um1
-	umtrue   = unmarshaler{true}
-	umslice  = []unmarshaler{{true}}
-	umslicep = new([]unmarshaler)
-	umstruct = ustruct{unmarshaler{true}}
-
-	um0T, um1T unmarshalerText // target2 of unmarshaling
-	umpT       = &um1T
-	umtrueT    = unmarshalerText{true}
-	umsliceT   = []unmarshalerText{{true}}
-	umslicepT  = new([]unmarshalerText)
-	umstructT  = ustructText{unmarshalerText{true}}
-)
-
-// Test data structures for anonymous fields.
-
-type Point struct {
-	Z int
-}
-
-type Top struct {
-	Level0 int
-	Embed0
-	*Embed0a
-	*Embed0b `json:"e,omitempty"` // treated as named
-	Embed0c  `json:"-"`           // ignored
-	Loop
-	Embed0p // has Point with X, Y, used
-	Embed0q // has Point with Z, used
-	embed   // contains exported field
-}
-
-type Embed0 struct {
-	Level1a int // overridden by Embed0a's Level1a with json tag
-	Level1b int // used because Embed0a's Level1b is renamed
-	Level1c int // used because Embed0a's Level1c is ignored
-	Level1d int // annihilated by Embed0a's Level1d
-	Level1e int `json:"x"` // annihilated by Embed0a.Level1e
-}
-
-type Embed0a struct {
-	Level1a int `json:"Level1a,omitempty"`
-	Level1b int `json:"LEVEL1B,omitempty"`
-	Level1c int `json:"-"`
-	Level1d int // annihilated by Embed0's Level1d
-	Level1f int `json:"x"` // annihilated by Embed0's Level1e
-}
-
-type Embed0b Embed0
-
-type Embed0c Embed0
-
-type Embed0p struct {
-	image.Point
-}
-
-type Embed0q struct {
-	Point
-}
-
-type embed struct {
-	Q int
-}
-
-type Loop struct {
-	Loop1 int `json:",omitempty"`
-	Loop2 int `json:",omitempty"`
-	*Loop
-}
-
-// From reflect test:
-// The X in S6 and S7 annihilate, but they also block the X in S8.S9.
-type S5 struct {
-	S6
-	S7
-	S8
-}
-
-type S6 struct {
-	X int
-}
-
-type S7 S6
-
-type S8 struct {
-	S9
-}
-
-type S9 struct {
-	X int
-	Y int
-}
-
-// From reflect test:
-// The X in S11.S6 and S12.S6 annihilate, but they also block the X in S13.S8.S9.
-type S10 struct {
-	S11
-	S12
-	S13
-}
-
-type S11 struct {
-	S6
-}
-
-type S12 struct {
-	S6
-}
-
-type S13 struct {
-	S8
-}
-
-type unmarshalTest struct {
-	in        string
-	ptr       interface{}
-	out       interface{}
-	err       error
-	useNumber bool
-}
-
-type XYZ struct {
-	X interface{}
-	Y interface{}
-	Z interface{}
-}
-
-func sliceAddr(x []int) *[]int                 { return &x }
-func mapAddr(x map[string]int) *map[string]int { return &x }
-
-var unmarshalTests = []unmarshalTest{
-	// basic types
-	{in: `true`, ptr: new(bool), out: true},
-	{in: `1`, ptr: new(int), out: 1},
-	{in: `1.2`, ptr: new(float64), out: 1.2},
-	{in: `-5`, ptr: new(int16), out: int16(-5)},
-	{in: `2`, ptr: new(Number), out: Number("2"), useNumber: true},
-	{in: `2`, ptr: new(Number), out: Number("2")},
-	{in: `2`, ptr: new(interface{}), out: float64(2.0)},
-	{in: `2`, ptr: new(interface{}), out: Number("2"), useNumber: true},
-	{in: `"a\u1234"`, ptr: new(string), out: "a\u1234"},
-	{in: `"http:\/\/"`, ptr: new(string), out: "http://"},
-	{in: `"g-clef: \uD834\uDD1E"`, ptr: new(string), out: "g-clef: \U0001D11E"},
-	{in: `"invalid: \uD834x\uDD1E"`, ptr: new(string), out: "invalid: \uFFFDx\uFFFD"},
-	{in: "null", ptr: new(interface{}), out: nil},
-	{in: `{"X": [1,2,3], "Y": 4}`, ptr: new(T), out: T{Y: 4}, err: &UnmarshalTypeError{"array", reflect.TypeOf(""), 7}},
-	{in: `{"x": 1}`, ptr: new(tx), out: tx{}},
-	{in: `{"F1":1,"F2":2,"F3":3}`, ptr: new(V), out: V{F1: float64(1), F2: int32(2), F3: Number("3")}},
-	{in: `{"F1":1,"F2":2,"F3":3}`, ptr: new(V), out: V{F1: Number("1"), F2: int32(2), F3: Number("3")}, useNumber: true},
-	{in: `{"k1":1,"k2":"s","k3":[1,2.0,3e-3],"k4":{"kk1":"s","kk2":2}}`, ptr: new(interface{}), out: ifaceNumAsFloat64},
-	{in: `{"k1":1,"k2":"s","k3":[1,2.0,3e-3],"k4":{"kk1":"s","kk2":2}}`, ptr: new(interface{}), out: ifaceNumAsNumber, useNumber: true},
-
-	// raw values with whitespace
-	{in: "\n true ", ptr: new(bool), out: true},
-	{in: "\t 1 ", ptr: new(int), out: 1},
-	{in: "\r 1.2 ", ptr: new(float64), out: 1.2},
-	{in: "\t -5 \n", ptr: new(int16), out: int16(-5)},
-	{in: "\t \"a\\u1234\" \n", ptr: new(string), out: "a\u1234"},
-
-	// Z has a "-" tag.
-	{in: `{"Y": 1, "Z": 2}`, ptr: new(T), out: T{Y: 1}},
-
-	{in: `{"alpha": "abc", "alphabet": "xyz"}`, ptr: new(U), out: U{Alphabet: "abc"}},
-	{in: `{"alpha": "abc"}`, ptr: new(U), out: U{Alphabet: "abc"}},
-	{in: `{"alphabet": "xyz"}`, ptr: new(U), out: U{}},
-
-	// syntax errors
-	{in: `{"X": "foo", "Y"}`, err: &SyntaxError{"invalid character '}' after object key", 17}},
-	{in: `[1, 2, 3+]`, err: &SyntaxError{"invalid character '+' after array element", 9}},
-	{in: `{"X":12x}`, err: &SyntaxError{"invalid character 'x' after object key:value pair", 8}, useNumber: true},
-
-	// raw value errors
-	{in: "\x01 42", err: &SyntaxError{"invalid character '\\x01' looking for beginning of value", 1}},
-	{in: " 42 \x01", err: &SyntaxError{"invalid character '\\x01' after top-level value", 5}},
-	{in: "\x01 true", err: &SyntaxError{"invalid character '\\x01' looking for beginning of value", 1}},
-	{in: " false \x01", err: &SyntaxError{"invalid character '\\x01' after top-level value", 8}},
-	{in: "\x01 1.2", err: &SyntaxError{"invalid character '\\x01' looking for beginning of value", 1}},
-	{in: " 3.4 \x01", err: &SyntaxError{"invalid character '\\x01' after top-level value", 6}},
-	{in: "\x01 \"string\"", err: &SyntaxError{"invalid character '\\x01' looking for beginning of value", 1}},
-	{in: " \"string\" \x01", err: &SyntaxError{"invalid character '\\x01' after top-level value", 11}},
-
-	// array tests
-	{in: `[1, 2, 3]`, ptr: new([3]int), out: [3]int{1, 2, 3}},
-	{in: `[1, 2, 3]`, ptr: new([1]int), out: [1]int{1}},
-	{in: `[1, 2, 3]`, ptr: new([5]int), out: [5]int{1, 2, 3, 0, 0}},
-
-	// empty array to interface test
-	{in: `[]`, ptr: new([]interface{}), out: []interface{}{}},
-	{in: `null`, ptr: new([]interface{}), out: []interface{}(nil)},
-	{in: `{"T":[]}`, ptr: new(map[string]interface{}), out: map[string]interface{}{"T": []interface{}{}}},
-	{in: `{"T":null}`, ptr: new(map[string]interface{}), out: map[string]interface{}{"T": interface{}(nil)}},
-
-	// composite tests
-	{in: allValueIndent, ptr: new(All), out: allValue},
-	{in: allValueCompact, ptr: new(All), out: allValue},
-	{in: allValueIndent, ptr: new(*All), out: &allValue},
-	{in: allValueCompact, ptr: new(*All), out: &allValue},
-	{in: pallValueIndent, ptr: new(All), out: pallValue},
-	{in: pallValueCompact, ptr: new(All), out: pallValue},
-	{in: pallValueIndent, ptr: new(*All), out: &pallValue},
-	{in: pallValueCompact, ptr: new(*All), out: &pallValue},
-
-	// unmarshal interface test
-	{in: `{"T":false}`, ptr: &um0, out: umtrue}, // use "false" so test will fail if custom unmarshaler is not called
-	{in: `{"T":false}`, ptr: &ump, out: &umtrue},
-	{in: `[{"T":false}]`, ptr: &umslice, out: umslice},
-	{in: `[{"T":false}]`, ptr: &umslicep, out: &umslice},
-	{in: `{"M":{"T":false}}`, ptr: &umstruct, out: umstruct},
-
-	// UnmarshalText interface test
-	{in: `"X"`, ptr: &um0T, out: umtrueT}, // use "false" so test will fail if custom unmarshaler is not called
-	{in: `"X"`, ptr: &umpT, out: &umtrueT},
-	{in: `["X"]`, ptr: &umsliceT, out: umsliceT},
-	{in: `["X"]`, ptr: &umslicepT, out: &umsliceT},
-	{in: `{"M":"X"}`, ptr: &umstructT, out: umstructT},
-
-	// Overwriting of data.
-	// This is different from package xml, but it's what we've always done.
-	// Now documented and tested.
-	{in: `[2]`, ptr: sliceAddr([]int{1}), out: []int{2}},
-	{in: `{"key": 2}`, ptr: mapAddr(map[string]int{"old": 0, "key": 1}), out: map[string]int{"key": 2}},
-
-	{
-		in: `{
-			"Level0": 1,
-			"Level1b": 2,
-			"Level1c": 3,
-			"x": 4,
-			"Level1a": 5,
-			"LEVEL1B": 6,
-			"e": {
-				"Level1a": 8,
-				"Level1b": 9,
-				"Level1c": 10,
-				"Level1d": 11,
-				"x": 12
-			},
-			"Loop1": 13,
-			"Loop2": 14,
-			"X": 15,
-			"Y": 16,
-			"Z": 17,
-			"Q": 18
-		}`,
-		ptr: new(Top),
-		out: Top{
-			Level0: 1,
-			Embed0: Embed0{
-				Level1b: 2,
-				Level1c: 3,
-			},
-			Embed0a: &Embed0a{
-				Level1a: 5,
-				Level1b: 6,
-			},
-			Embed0b: &Embed0b{
-				Level1a: 8,
-				Level1b: 9,
-				Level1c: 10,
-				Level1d: 11,
-				Level1e: 12,
-			},
-			Loop: Loop{
-				Loop1: 13,
-				Loop2: 14,
-			},
-			Embed0p: Embed0p{
-				Point: image.Point{X: 15, Y: 16},
-			},
-			Embed0q: Embed0q{
-				Point: Point{Z: 17},
-			},
-			embed: embed{
-				Q: 18,
-			},
-		},
-	},
-	{
-		in:  `{"X": 1,"Y":2}`,
-		ptr: new(S5),
-		out: S5{S8: S8{S9: S9{Y: 2}}},
-	},
-	{
-		in:  `{"X": 1,"Y":2}`,
-		ptr: new(S10),
-		out: S10{S13: S13{S8: S8{S9: S9{Y: 2}}}},
-	},
-
-	// invalid UTF-8 is coerced to valid UTF-8.
-	{
-		in:  "\"hello\xffworld\"",
-		ptr: new(string),
-		out: "hello\ufffdworld",
-	},
-	{
-		in:  "\"hello\xc2\xc2world\"",
-		ptr: new(string),
-		out: "hello\ufffd\ufffdworld",
-	},
-	{
-		in:  "\"hello\xc2\xffworld\"",
-		ptr: new(string),
-		out: "hello\ufffd\ufffdworld",
-	},
-	{
-		in:  "\"hello\\ud800world\"",
-		ptr: new(string),
-		out: "hello\ufffdworld",
-	},
-	{
-		in:  "\"hello\\ud800\\ud800world\"",
-		ptr: new(string),
-		out: "hello\ufffd\ufffdworld",
-	},
-	{
-		in:  "\"hello\\ud800\\ud800world\"",
-		ptr: new(string),
-		out: "hello\ufffd\ufffdworld",
-	},
-	{
-		in:  "\"hello\xed\xa0\x80\xed\xb0\x80world\"",
-		ptr: new(string),
-		out: "hello\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdworld",
-	},
-
-	// issue 8305
-	{
-		in:  `{"2009-11-10T23:00:00Z": "hello world"}`,
-		ptr: &map[time.Time]string{},
-		err: &UnmarshalTypeError{"object", reflect.TypeOf(map[time.Time]string{}), 1},
-	},
-}
-
-func TestMarshal(t *testing.T) {
-	b, err := Marshal(allValue)
-	if err != nil {
-		t.Fatalf("Marshal allValue: %v", err)
-	}
-	if string(b) != allValueCompact {
-		t.Errorf("Marshal allValueCompact")
-		diff(t, b, []byte(allValueCompact))
-		return
-	}
-
-	b, err = Marshal(pallValue)
-	if err != nil {
-		t.Fatalf("Marshal pallValue: %v", err)
-	}
-	if string(b) != pallValueCompact {
-		t.Errorf("Marshal pallValueCompact")
-		diff(t, b, []byte(pallValueCompact))
-		return
-	}
-}
-
-var badUTF8 = []struct {
-	in, out string
-}{
-	{"hello\xffworld", `"hello\ufffdworld"`},
-	{"", `""`},
-	{"\xff", `"\ufffd"`},
-	{"\xff\xff", `"\ufffd\ufffd"`},
-	{"a\xffb", `"a\ufffdb"`},
-	{"\xe6\x97\xa5\xe6\x9c\xac\xff\xaa\x9e", `"日本\ufffd\ufffd\ufffd"`},
-}
-
-func TestMarshalBadUTF8(t *testing.T) {
-	for _, tt := range badUTF8 {
-		b, err := Marshal(tt.in)
-		if string(b) != tt.out || err != nil {
-			t.Errorf("Marshal(%q) = %#q, %v, want %#q, nil", tt.in, b, err, tt.out)
-		}
-	}
-}
-
-func TestMarshalNumberZeroVal(t *testing.T) {
-	var n Number
-	out, err := Marshal(n)
-	if err != nil {
-		t.Fatal(err)
-	}
-	outStr := string(out)
-	if outStr != "0" {
-		t.Fatalf("Invalid zero val for Number: %q", outStr)
-	}
-}
-
-func TestMarshalEmbeds(t *testing.T) {
-	top := &Top{
-		Level0: 1,
-		Embed0: Embed0{
-			Level1b: 2,
-			Level1c: 3,
-		},
-		Embed0a: &Embed0a{
-			Level1a: 5,
-			Level1b: 6,
-		},
-		Embed0b: &Embed0b{
-			Level1a: 8,
-			Level1b: 9,
-			Level1c: 10,
-			Level1d: 11,
-			Level1e: 12,
-		},
-		Loop: Loop{
-			Loop1: 13,
-			Loop2: 14,
-		},
-		Embed0p: Embed0p{
-			Point: image.Point{X: 15, Y: 16},
-		},
-		Embed0q: Embed0q{
-			Point: Point{Z: 17},
-		},
-		embed: embed{
-			Q: 18,
-		},
-	}
-	b, err := Marshal(top)
-	if err != nil {
-		t.Fatal(err)
-	}
-	want := "{\"Level0\":1,\"Level1b\":2,\"Level1c\":3,\"Level1a\":5,\"LEVEL1B\":6,\"e\":{\"Level1a\":8,\"Level1b\":9,\"Level1c\":10,\"Level1d\":11,\"x\":12},\"Loop1\":13,\"Loop2\":14,\"X\":15,\"Y\":16,\"Z\":17,\"Q\":18}"
-	if string(b) != want {
-		t.Errorf("Wrong marshal result.\n got: %q\nwant: %q", b, want)
-	}
-}
-
-func TestUnmarshal(t *testing.T) {
-	for i, tt := range unmarshalTests {
-		var scan scanner
-		in := []byte(tt.in)
-		if err := checkValid(in, &scan); err != nil {
-			if !reflect.DeepEqual(err, tt.err) {
-				t.Errorf("#%d: checkValid: %#v", i, err)
-				continue
-			}
-		}
-		if tt.ptr == nil {
-			continue
-		}
-
-		// v = new(right-type)
-		v := reflect.New(reflect.TypeOf(tt.ptr).Elem())
-		dec := NewDecoder(bytes.NewReader(in))
-		if tt.useNumber {
-			dec.UseNumber()
-		}
-		if err := dec.Decode(v.Interface()); !reflect.DeepEqual(err, tt.err) {
-			t.Errorf("#%d: %v, want %v", i, err, tt.err)
-			continue
-		} else if err != nil {
-			continue
-		}
-		if !reflect.DeepEqual(v.Elem().Interface(), tt.out) {
-			t.Errorf("#%d: mismatch\nhave: %#+v\nwant: %#+v", i, v.Elem().Interface(), tt.out)
-			data, _ := Marshal(v.Elem().Interface())
-			println(string(data))
-			data, _ = Marshal(tt.out)
-			println(string(data))
-			continue
-		}
-
-		// Check round trip.
-		if tt.err == nil {
-			enc, err := Marshal(v.Interface())
-			if err != nil {
-				t.Errorf("#%d: error re-marshaling: %v", i, err)
-				continue
-			}
-			vv := reflect.New(reflect.TypeOf(tt.ptr).Elem())
-			dec = NewDecoder(bytes.NewReader(enc))
-			if tt.useNumber {
-				dec.UseNumber()
-			}
-			if err := dec.Decode(vv.Interface()); err != nil {
-				t.Errorf("#%d: error re-unmarshaling %#q: %v", i, enc, err)
-				continue
-			}
-			if !reflect.DeepEqual(v.Elem().Interface(), vv.Elem().Interface()) {
-				t.Errorf("#%d: mismatch\nhave: %#+v\nwant: %#+v", i, v.Elem().Interface(), vv.Elem().Interface())
-				t.Errorf("     In: %q", strings.Map(noSpace, string(in)))
-				t.Errorf("Marshal: %q", strings.Map(noSpace, string(enc)))
-				continue
-			}
-		}
-	}
-}
-
-func TestUnmarshalMarshal(t *testing.T) {
-	initBig()
-	var v interface{}
-	if err := Unmarshal(jsonBig, &v); err != nil {
-		t.Fatalf("Unmarshal: %v", err)
-	}
-	b, err := Marshal(v)
-	if err != nil {
-		t.Fatalf("Marshal: %v", err)
-	}
-	if !bytes.Equal(jsonBig, b) {
-		t.Errorf("Marshal jsonBig")
-		diff(t, b, jsonBig)
-		return
-	}
-}
-
-var numberTests = []struct {
-	in       string
-	i        int64
-	intErr   string
-	f        float64
-	floatErr string
-}{
-	{in: "-1.23e1", intErr: "strconv.ParseInt: parsing \"-1.23e1\": invalid syntax", f: -1.23e1},
-	{in: "-12", i: -12, f: -12.0},
-	{in: "1e1000", intErr: "strconv.ParseInt: parsing \"1e1000\": invalid syntax", floatErr: "strconv.ParseFloat: parsing \"1e1000\": value out of range"},
-}
-
-// Independent of Decode, basic coverage of the accessors in Number
-func TestNumberAccessors(t *testing.T) {
-	for _, tt := range numberTests {
-		n := Number(tt.in)
-		if s := n.String(); s != tt.in {
-			t.Errorf("Number(%q).String() is %q", tt.in, s)
-		}
-		if i, err := n.Int64(); err == nil && tt.intErr == "" && i != tt.i {
-			t.Errorf("Number(%q).Int64() is %d", tt.in, i)
-		} else if (err == nil && tt.intErr != "") || (err != nil && err.Error() != tt.intErr) {
-			t.Errorf("Number(%q).Int64() wanted error %q but got: %v", tt.in, tt.intErr, err)
-		}
-		if f, err := n.Float64(); err == nil && tt.floatErr == "" && f != tt.f {
-			t.Errorf("Number(%q).Float64() is %g", tt.in, f)
-		} else if (err == nil && tt.floatErr != "") || (err != nil && err.Error() != tt.floatErr) {
-			t.Errorf("Number(%q).Float64() wanted error %q but got: %v", tt.in, tt.floatErr, err)
-		}
-	}
-}
-
-func TestLargeByteSlice(t *testing.T) {
-	s0 := make([]byte, 2000)
-	for i := range s0 {
-		s0[i] = byte(i)
-	}
-	b, err := Marshal(s0)
-	if err != nil {
-		t.Fatalf("Marshal: %v", err)
-	}
-	var s1 []byte
-	if err := Unmarshal(b, &s1); err != nil {
-		t.Fatalf("Unmarshal: %v", err)
-	}
-	if !bytes.Equal(s0, s1) {
-		t.Errorf("Marshal large byte slice")
-		diff(t, s0, s1)
-	}
-}
-
-type Xint struct {
-	X int
-}
-
-func TestUnmarshalInterface(t *testing.T) {
-	var xint Xint
-	var i interface{} = &xint
-	if err := Unmarshal([]byte(`{"X":1}`), &i); err != nil {
-		t.Fatalf("Unmarshal: %v", err)
-	}
-	if xint.X != 1 {
-		t.Fatalf("Did not write to xint")
-	}
-}
-
-func TestUnmarshalPtrPtr(t *testing.T) {
-	var xint Xint
-	pxint := &xint
-	if err := Unmarshal([]byte(`{"X":1}`), &pxint); err != nil {
-		t.Fatalf("Unmarshal: %v", err)
-	}
-	if xint.X != 1 {
-		t.Fatalf("Did not write to xint")
-	}
-}
-
-func TestEscape(t *testing.T) {
-	const input = `"foobar"<html>` + " [\u2028 \u2029]"
-	const expected = `"\"foobar\"\u003chtml\u003e [\u2028 \u2029]"`
-	b, err := Marshal(input)
-	if err != nil {
-		t.Fatalf("Marshal error: %v", err)
-	}
-	if s := string(b); s != expected {
-		t.Errorf("Encoding of [%s]:\n got [%s]\nwant [%s]", input, s, expected)
-	}
-}
-
-// WrongString is a struct that's misusing the ,string modifier.
-type WrongString struct {
-	Message string `json:"result,string"`
-}
-
-type wrongStringTest struct {
-	in, err string
-}
-
-var wrongStringTests = []wrongStringTest{
-	{`{"result":"x"}`, `json: invalid use of ,string struct tag, trying to unmarshal "x" into string`},
-	{`{"result":"foo"}`, `json: invalid use of ,string struct tag, trying to unmarshal "foo" into string`},
-	{`{"result":"123"}`, `json: invalid use of ,string struct tag, trying to unmarshal "123" into string`},
-	{`{"result":123}`, `json: invalid use of ,string struct tag, trying to unmarshal unquoted value into string`},
-}
-
-// If people misuse the ,string modifier, the error message should be
-// helpful, telling the user that they're doing it wrong.
-func TestErrorMessageFromMisusedString(t *testing.T) {
-	for n, tt := range wrongStringTests {
-		r := strings.NewReader(tt.in)
-		var s WrongString
-		err := NewDecoder(r).Decode(&s)
-		got := fmt.Sprintf("%v", err)
-		if got != tt.err {
-			t.Errorf("%d. got err = %q, want %q", n, got, tt.err)
-		}
-	}
-}
-
-func noSpace(c rune) rune {
-	if isSpace(byte(c)) { //only used for ascii
-		return -1
-	}
-	return c
-}
-
-type All struct {
-	Bool    bool
-	Int     int
-	Int8    int8
-	Int16   int16
-	Int32   int32
-	Int64   int64
-	Uint    uint
-	Uint8   uint8
-	Uint16  uint16
-	Uint32  uint32
-	Uint64  uint64
-	Uintptr uintptr
-	Float32 float32
-	Float64 float64
-
-	Foo  string `json:"bar"`
-	Foo2 string `json:"bar2,dummyopt"`
-
-	IntStr int64 `json:",string"`
-
-	PBool    *bool
-	PInt     *int
-	PInt8    *int8
-	PInt16   *int16
-	PInt32   *int32
-	PInt64   *int64
-	PUint    *uint
-	PUint8   *uint8
-	PUint16  *uint16
-	PUint32  *uint32
-	PUint64  *uint64
-	PUintptr *uintptr
-	PFloat32 *float32
-	PFloat64 *float64
-
-	String  string
-	PString *string
-
-	Map   map[string]Small
-	MapP  map[string]*Small
-	PMap  *map[string]Small
-	PMapP *map[string]*Small
-
-	EmptyMap map[string]Small
-	NilMap   map[string]Small
-
-	Slice   []Small
-	SliceP  []*Small
-	PSlice  *[]Small
-	PSliceP *[]*Small
-
-	EmptySlice []Small
-	NilSlice   []Small
-
-	StringSlice []string
-	ByteSlice   []byte
-
-	Small   Small
-	PSmall  *Small
-	PPSmall **Small
-
-	Interface  interface{}
-	PInterface *interface{}
-
-	unexported int
-}
-
-type Small struct {
-	Tag string
-}
-
-var allValue = All{
-	Bool:    true,
-	Int:     2,
-	Int8:    3,
-	Int16:   4,
-	Int32:   5,
-	Int64:   6,
-	Uint:    7,
-	Uint8:   8,
-	Uint16:  9,
-	Uint32:  10,
-	Uint64:  11,
-	Uintptr: 12,
-	Float32: 14.1,
-	Float64: 15.1,
-	Foo:     "foo",
-	Foo2:    "foo2",
-	IntStr:  42,
-	String:  "16",
-	Map: map[string]Small{
-		"17": {Tag: "tag17"},
-		"18": {Tag: "tag18"},
-	},
-	MapP: map[string]*Small{
-		"19": {Tag: "tag19"},
-		"20": nil,
-	},
-	EmptyMap:    map[string]Small{},
-	Slice:       []Small{{Tag: "tag20"}, {Tag: "tag21"}},
-	SliceP:      []*Small{{Tag: "tag22"}, nil, {Tag: "tag23"}},
-	EmptySlice:  []Small{},
-	StringSlice: []string{"str24", "str25", "str26"},
-	ByteSlice:   []byte{27, 28, 29},
-	Small:       Small{Tag: "tag30"},
-	PSmall:      &Small{Tag: "tag31"},
-	Interface:   5.2,
-}
-
-var pallValue = All{
-	PBool:      &allValue.Bool,
-	PInt:       &allValue.Int,
-	PInt8:      &allValue.Int8,
-	PInt16:     &allValue.Int16,
-	PInt32:     &allValue.Int32,
-	PInt64:     &allValue.Int64,
-	PUint:      &allValue.Uint,
-	PUint8:     &allValue.Uint8,
-	PUint16:    &allValue.Uint16,
-	PUint32:    &allValue.Uint32,
-	PUint64:    &allValue.Uint64,
-	PUintptr:   &allValue.Uintptr,
-	PFloat32:   &allValue.Float32,
-	PFloat64:   &allValue.Float64,
-	PString:    &allValue.String,
-	PMap:       &allValue.Map,
-	PMapP:      &allValue.MapP,
-	PSlice:     &allValue.Slice,
-	PSliceP:    &allValue.SliceP,
-	PPSmall:    &allValue.PSmall,
-	PInterface: &allValue.Interface,
-}
-
-var allValueIndent = `{
-	"Bool": true,
-	"Int": 2,
-	"Int8": 3,
-	"Int16": 4,
-	"Int32": 5,
-	"Int64": 6,
-	"Uint": 7,
-	"Uint8": 8,
-	"Uint16": 9,
-	"Uint32": 10,
-	"Uint64": 11,
-	"Uintptr": 12,
-	"Float32": 14.1,
-	"Float64": 15.1,
-	"bar": "foo",
-	"bar2": "foo2",
-	"IntStr": "42",
-	"PBool": null,
-	"PInt": null,
-	"PInt8": null,
-	"PInt16": null,
-	"PInt32": null,
-	"PInt64": null,
-	"PUint": null,
-	"PUint8": null,
-	"PUint16": null,
-	"PUint32": null,
-	"PUint64": null,
-	"PUintptr": null,
-	"PFloat32": null,
-	"PFloat64": null,
-	"String": "16",
-	"PString": null,
-	"Map": {
-		"17": {
-			"Tag": "tag17"
-		},
-		"18": {
-			"Tag": "tag18"
-		}
-	},
-	"MapP": {
-		"19": {
-			"Tag": "tag19"
-		},
-		"20": null
-	},
-	"PMap": null,
-	"PMapP": null,
-	"EmptyMap": {},
-	"NilMap": null,
-	"Slice": [
-		{
-			"Tag": "tag20"
-		},
-		{
-			"Tag": "tag21"
-		}
-	],
-	"SliceP": [
-		{
-			"Tag": "tag22"
-		},
-		null,
-		{
-			"Tag": "tag23"
-		}
-	],
-	"PSlice": null,
-	"PSliceP": null,
-	"EmptySlice": [],
-	"NilSlice": null,
-	"StringSlice": [
-		"str24",
-		"str25",
-		"str26"
-	],
-	"ByteSlice": "Gxwd",
-	"Small": {
-		"Tag": "tag30"
-	},
-	"PSmall": {
-		"Tag": "tag31"
-	},
-	"PPSmall": null,
-	"Interface": 5.2,
-	"PInterface": null
-}`
-
-var allValueCompact = strings.Map(noSpace, allValueIndent)
-
-var pallValueIndent = `{
-	"Bool": false,
-	"Int": 0,
-	"Int8": 0,
-	"Int16": 0,
-	"Int32": 0,
-	"Int64": 0,
-	"Uint": 0,
-	"Uint8": 0,
-	"Uint16": 0,
-	"Uint32": 0,
-	"Uint64": 0,
-	"Uintptr": 0,
-	"Float32": 0,
-	"Float64": 0,
-	"bar": "",
-	"bar2": "",
-        "IntStr": "0",
-	"PBool": true,
-	"PInt": 2,
-	"PInt8": 3,
-	"PInt16": 4,
-	"PInt32": 5,
-	"PInt64": 6,
-	"PUint": 7,
-	"PUint8": 8,
-	"PUint16": 9,
-	"PUint32": 10,
-	"PUint64": 11,
-	"PUintptr": 12,
-	"PFloat32": 14.1,
-	"PFloat64": 15.1,
-	"String": "",
-	"PString": "16",
-	"Map": null,
-	"MapP": null,
-	"PMap": {
-		"17": {
-			"Tag": "tag17"
-		},
-		"18": {
-			"Tag": "tag18"
-		}
-	},
-	"PMapP": {
-		"19": {
-			"Tag": "tag19"
-		},
-		"20": null
-	},
-	"EmptyMap": null,
-	"NilMap": null,
-	"Slice": null,
-	"SliceP": null,
-	"PSlice": [
-		{
-			"Tag": "tag20"
-		},
-		{
-			"Tag": "tag21"
-		}
-	],
-	"PSliceP": [
-		{
-			"Tag": "tag22"
-		},
-		null,
-		{
-			"Tag": "tag23"
-		}
-	],
-	"EmptySlice": null,
-	"NilSlice": null,
-	"StringSlice": null,
-	"ByteSlice": null,
-	"Small": {
-		"Tag": ""
-	},
-	"PSmall": null,
-	"PPSmall": {
-		"Tag": "tag31"
-	},
-	"Interface": null,
-	"PInterface": 5.2
-}`
-
-var pallValueCompact = strings.Map(noSpace, pallValueIndent)
-
-func TestRefUnmarshal(t *testing.T) {
-	type S struct {
-		// Ref is defined in encode_test.go.
-		R0 Ref
-		R1 *Ref
-		R2 RefText
-		R3 *RefText
-	}
-	want := S{
-		R0: 12,
-		R1: new(Ref),
-		R2: 13,
-		R3: new(RefText),
-	}
-	*want.R1 = 12
-	*want.R3 = 13
-
-	var got S
-	if err := Unmarshal([]byte(`{"R0":"ref","R1":"ref","R2":"ref","R3":"ref"}`), &got); err != nil {
-		t.Fatalf("Unmarshal: %v", err)
-	}
-	if !reflect.DeepEqual(got, want) {
-		t.Errorf("got %+v, want %+v", got, want)
-	}
-}
-
-// Test that the empty string doesn't panic decoding when ,string is specified
-// Issue 3450
-func TestEmptyString(t *testing.T) {
-	type T2 struct {
-		Number1 int `json:",string"`
-		Number2 int `json:",string"`
-	}
-	data := `{"Number1":"1", "Number2":""}`
-	dec := NewDecoder(strings.NewReader(data))
-	var t2 T2
-	err := dec.Decode(&t2)
-	if err == nil {
-		t.Fatal("Decode: did not return error")
-	}
-	if t2.Number1 != 1 {
-		t.Fatal("Decode: did not set Number1")
-	}
-}
-
-// Test that a null for ,string is not replaced with the previous quoted string (issue 7046).
-// It should also not be an error (issue 2540, issue 8587).
-func TestNullString(t *testing.T) {
-	type T struct {
-		A int  `json:",string"`
-		B int  `json:",string"`
-		C *int `json:",string"`
-	}
-	data := []byte(`{"A": "1", "B": null, "C": null}`)
-	var s T
-	s.B = 1
-	s.C = new(int)
-	*s.C = 2
-	err := Unmarshal(data, &s)
-	if err != nil {
-		t.Fatalf("Unmarshal: %v", err)
-	}
-	if s.B != 1 || s.C != nil {
-		t.Fatalf("after Unmarshal, s.B=%d, s.C=%p, want 1, nil", s.B, s.C)
-	}
-}
-
-func intp(x int) *int {
-	p := new(int)
-	*p = x
-	return p
-}
-
-func intpp(x *int) **int {
-	pp := new(*int)
-	*pp = x
-	return pp
-}
-
-var interfaceSetTests = []struct {
-	pre  interface{}
-	json string
-	post interface{}
-}{
-	{"foo", `"bar"`, "bar"},
-	{"foo", `2`, 2.0},
-	{"foo", `true`, true},
-	{"foo", `null`, nil},
-
-	{nil, `null`, nil},
-	{new(int), `null`, nil},
-	{(*int)(nil), `null`, nil},
-	{new(*int), `null`, new(*int)},
-	{(**int)(nil), `null`, nil},
-	{intp(1), `null`, nil},
-	{intpp(nil), `null`, intpp(nil)},
-	{intpp(intp(1)), `null`, intpp(nil)},
-}
-
-func TestInterfaceSet(t *testing.T) {
-	for _, tt := range interfaceSetTests {
-		b := struct{ X interface{} }{tt.pre}
-		blob := `{"X":` + tt.json + `}`
-		if err := Unmarshal([]byte(blob), &b); err != nil {
-			t.Errorf("Unmarshal %#q: %v", blob, err)
-			continue
-		}
-		if !reflect.DeepEqual(b.X, tt.post) {
-			t.Errorf("Unmarshal %#q into %#v: X=%#v, want %#v", blob, tt.pre, b.X, tt.post)
-		}
-	}
-}
-
-// JSON null values should be ignored for primitives and string values instead of resulting in an error.
-// Issue 2540
-func TestUnmarshalNulls(t *testing.T) {
-	jsonData := []byte(`{
-		"Bool"    : null,
-		"Int"     : null,
-		"Int8"    : null,
-		"Int16"   : null,
-		"Int32"   : null,
-		"Int64"   : null,
-		"Uint"    : null,
-		"Uint8"   : null,
-		"Uint16"  : null,
-		"Uint32"  : null,
-		"Uint64"  : null,
-		"Float32" : null,
-		"Float64" : null,
-		"String"  : null}`)
-
-	nulls := All{
-		Bool:    true,
-		Int:     2,
-		Int8:    3,
-		Int16:   4,
-		Int32:   5,
-		Int64:   6,
-		Uint:    7,
-		Uint8:   8,
-		Uint16:  9,
-		Uint32:  10,
-		Uint64:  11,
-		Float32: 12.1,
-		Float64: 13.1,
-		String:  "14"}
-
-	err := Unmarshal(jsonData, &nulls)
-	if err != nil {
-		t.Errorf("Unmarshal of null values failed: %v", err)
-	}
-	if !nulls.Bool || nulls.Int != 2 || nulls.Int8 != 3 || nulls.Int16 != 4 || nulls.Int32 != 5 || nulls.Int64 != 6 ||
-		nulls.Uint != 7 || nulls.Uint8 != 8 || nulls.Uint16 != 9 || nulls.Uint32 != 10 || nulls.Uint64 != 11 ||
-		nulls.Float32 != 12.1 || nulls.Float64 != 13.1 || nulls.String != "14" {
-
-		t.Errorf("Unmarshal of null values affected primitives")
-	}
-}
-
-func TestStringKind(t *testing.T) {
-	type stringKind string
-
-	var m1, m2 map[stringKind]int
-	m1 = map[stringKind]int{
-		"foo": 42,
-	}
-
-	data, err := Marshal(m1)
-	if err != nil {
-		t.Errorf("Unexpected error marshaling: %v", err)
-	}
-
-	err = Unmarshal(data, &m2)
-	if err != nil {
-		t.Errorf("Unexpected error unmarshaling: %v", err)
-	}
-
-	if !reflect.DeepEqual(m1, m2) {
-		t.Error("Items should be equal after encoding and then decoding")
-	}
-}
-
-// Custom types with []byte as underlying type could not be marshalled
-// and then unmarshalled.
-// Issue 8962.
-func TestByteKind(t *testing.T) {
-	type byteKind []byte
-
-	a := byteKind("hello")
-
-	data, err := Marshal(a)
-	if err != nil {
-		t.Error(err)
-	}
-	var b byteKind
-	err = Unmarshal(data, &b)
-	if err != nil {
-		t.Fatal(err)
-	}
-	if !reflect.DeepEqual(a, b) {
-		t.Errorf("expected %v == %v", a, b)
-	}
-}
-
-// The fix for issue 8962 introduced a regression.
-// Issue 12921.
-func TestSliceOfCustomByte(t *testing.T) {
-	type Uint8 uint8
-
-	a := []Uint8("hello")
-
-	data, err := Marshal(a)
-	if err != nil {
-		t.Fatal(err)
-	}
-	var b []Uint8
-	err = Unmarshal(data, &b)
-	if err != nil {
-		t.Fatal(err)
-	}
-	if !reflect.DeepEqual(a, b) {
-		t.Fatal("expected %v == %v", a, b)
-	}
-}
-
-var decodeTypeErrorTests = []struct {
-	dest interface{}
-	src  string
-}{
-	{new(string), `{"user": "name"}`}, // issue 4628.
-	{new(error), `{}`},                // issue 4222
-	{new(error), `[]`},
-	{new(error), `""`},
-	{new(error), `123`},
-	{new(error), `true`},
-}
-
-func TestUnmarshalTypeError(t *testing.T) {
-	for _, item := range decodeTypeErrorTests {
-		err := Unmarshal([]byte(item.src), item.dest)
-		if _, ok := err.(*UnmarshalTypeError); !ok {
-			t.Errorf("expected type error for Unmarshal(%q, type %T): got %T",
-				item.src, item.dest, err)
-		}
-	}
-}
-
-var unmarshalSyntaxTests = []string{
-	"tru",
-	"fals",
-	"nul",
-	"123e",
-	`"hello`,
-	`[1,2,3`,
-	`{"key":1`,
-	`{"key":1,`,
-}
-
-func TestUnmarshalSyntax(t *testing.T) {
-	var x interface{}
-	for _, src := range unmarshalSyntaxTests {
-		err := Unmarshal([]byte(src), &x)
-		if _, ok := err.(*SyntaxError); !ok {
-			t.Errorf("expected syntax error for Unmarshal(%q): got %T", src, err)
-		}
-	}
-}
-
-// Test handling of unexported fields that should be ignored.
-// Issue 4660
-type unexportedFields struct {
-	Name string
-	m    map[string]interface{} `json:"-"`
-	m2   map[string]interface{} `json:"abcd"`
-}
-
-func TestUnmarshalUnexported(t *testing.T) {
-	input := `{"Name": "Bob", "m": {"x": 123}, "m2": {"y": 456}, "abcd": {"z": 789}}`
-	want := &unexportedFields{Name: "Bob"}
-
-	out := &unexportedFields{}
-	err := Unmarshal([]byte(input), out)
-	if err != nil {
-		t.Errorf("got error %v, expected nil", err)
-	}
-	if !reflect.DeepEqual(out, want) {
-		t.Errorf("got %q, want %q", out, want)
-	}
-}
-
-// Time3339 is a time.Time which encodes to and from JSON
-// as an RFC 3339 time in UTC.
-type Time3339 time.Time
-
-func (t *Time3339) UnmarshalJSON(b []byte) error {
-	if len(b) < 2 || b[0] != '"' || b[len(b)-1] != '"' {
-		return fmt.Errorf("types: failed to unmarshal non-string value %q as an RFC 3339 time", b)
-	}
-	tm, err := time.Parse(time.RFC3339, string(b[1:len(b)-1]))
-	if err != nil {
-		return err
-	}
-	*t = Time3339(tm)
-	return nil
-}
-
-func TestUnmarshalJSONLiteralError(t *testing.T) {
-	var t3 Time3339
-	err := Unmarshal([]byte(`"0000-00-00T00:00:00Z"`), &t3)
-	if err == nil {
-		t.Fatalf("expected error; got time %v", time.Time(t3))
-	}
-	if !strings.Contains(err.Error(), "range") {
-		t.Errorf("got err = %v; want out of range error", err)
-	}
-}
-
-// Test that extra object elements in an array do not result in a
-// "data changing underfoot" error.
-// Issue 3717
-func TestSkipArrayObjects(t *testing.T) {
-	json := `[{}]`
-	var dest [0]interface{}
-
-	err := Unmarshal([]byte(json), &dest)
-	if err != nil {
-		t.Errorf("got error %q, want nil", err)
-	}
-}
-
-// Test semantics of pre-filled struct fields and pre-filled map fields.
-// Issue 4900.
-func TestPrefilled(t *testing.T) {
-	ptrToMap := func(m map[string]interface{}) *map[string]interface{} { return &m }
-
-	// Values here change, cannot reuse table across runs.
-	var prefillTests = []struct {
-		in  string
-		ptr interface{}
-		out interface{}
-	}{
-		{
-			in:  `{"X": 1, "Y": 2}`,
-			ptr: &XYZ{X: float32(3), Y: int16(4), Z: 1.5},
-			out: &XYZ{X: float64(1), Y: float64(2), Z: 1.5},
-		},
-		{
-			in:  `{"X": 1, "Y": 2}`,
-			ptr: ptrToMap(map[string]interface{}{"X": float32(3), "Y": int16(4), "Z": 1.5}),
-			out: ptrToMap(map[string]interface{}{"X": float64(1), "Y": float64(2), "Z": 1.5}),
-		},
-	}
-
-	for _, tt := range prefillTests {
-		ptrstr := fmt.Sprintf("%v", tt.ptr)
-		err := Unmarshal([]byte(tt.in), tt.ptr) // tt.ptr edited here
-		if err != nil {
-			t.Errorf("Unmarshal: %v", err)
-		}
-		if !reflect.DeepEqual(tt.ptr, tt.out) {
-			t.Errorf("Unmarshal(%#q, %s): have %v, want %v", tt.in, ptrstr, tt.ptr, tt.out)
-		}
-	}
-}
-
-var invalidUnmarshalTests = []struct {
-	v    interface{}
-	want string
-}{
-	{nil, "json: Unmarshal(nil)"},
-	{struct{}{}, "json: Unmarshal(non-pointer struct {})"},
-	{(*int)(nil), "json: Unmarshal(nil *int)"},
-}
-
-func TestInvalidUnmarshal(t *testing.T) {
-	buf := []byte(`{"a":"1"}`)
-	for _, tt := range invalidUnmarshalTests {
-		err := Unmarshal(buf, tt.v)
-		if err == nil {
-			t.Errorf("Unmarshal expecting error, got nil")
-			continue
-		}
-		if got := err.Error(); got != tt.want {
-			t.Errorf("Unmarshal = %q; want %q", got, tt.want)
-		}
-	}
-}
-
-var invalidUnmarshalTextTests = []struct {
-	v    interface{}
-	want string
-}{
-	{nil, "json: Unmarshal(nil)"},
-	{struct{}{}, "json: Unmarshal(non-pointer struct {})"},
-	{(*int)(nil), "json: Unmarshal(nil *int)"},
-	{new(net.IP), "json: cannot unmarshal string into Go value of type *net.IP"},
-}
-
-func TestInvalidUnmarshalText(t *testing.T) {
-	buf := []byte(`123`)
-	for _, tt := range invalidUnmarshalTextTests {
-		err := Unmarshal(buf, tt.v)
-		if err == nil {
-			t.Errorf("Unmarshal expecting error, got nil")
-			continue
-		}
-		if got := err.Error(); got != tt.want {
-			t.Errorf("Unmarshal = %q; want %q", got, tt.want)
-		}
-	}
-}
-
-// Test that string option is ignored for invalid types.
-// Issue 9812.
-func TestInvalidStringOption(t *testing.T) {
-	num := 0
-	item := struct {
-		T time.Time         `json:",string"`
-		M map[string]string `json:",string"`
-		S []string          `json:",string"`
-		A [1]string         `json:",string"`
-		I interface{}       `json:",string"`
-		P *int              `json:",string"`
-	}{M: make(map[string]string), S: make([]string, 0), I: num, P: &num}
-
-	data, err := Marshal(item)
-	if err != nil {
-		t.Fatalf("Marshal: %v", err)
-	}
-
-	err = Unmarshal(data, &item)
-	if err != nil {
-		t.Fatalf("Unmarshal: %v", err)
-	}
-}
diff --git a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/json/encode_test.go b/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/json/encode_test.go
deleted file mode 100644
index c00491e00..000000000
--- a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/json/encode_test.go
+++ /dev/null
@@ -1,538 +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 json
-
-import (
-	"bytes"
-	"math"
-	"reflect"
-	"testing"
-	"unicode"
-)
-
-type Optionals struct {
-	Sr string `json:"sr"`
-	So string `json:"so,omitempty"`
-	Sw string `json:"-"`
-
-	Ir int `json:"omitempty"` // actually named omitempty, not an option
-	Io int `json:"io,omitempty"`
-
-	Slr []string `json:"slr,random"`
-	Slo []string `json:"slo,omitempty"`
-
-	Mr map[string]interface{} `json:"mr"`
-	Mo map[string]interface{} `json:",omitempty"`
-
-	Fr float64 `json:"fr"`
-	Fo float64 `json:"fo,omitempty"`
-
-	Br bool `json:"br"`
-	Bo bool `json:"bo,omitempty"`
-
-	Ur uint `json:"ur"`
-	Uo uint `json:"uo,omitempty"`
-
-	Str struct{} `json:"str"`
-	Sto struct{} `json:"sto,omitempty"`
-}
-
-var optionalsExpected = `{
- "sr": "",
- "omitempty": 0,
- "slr": null,
- "mr": {},
- "fr": 0,
- "br": false,
- "ur": 0,
- "str": {},
- "sto": {}
-}`
-
-func TestOmitEmpty(t *testing.T) {
-	var o Optionals
-	o.Sw = "something"
-	o.Mr = map[string]interface{}{}
-	o.Mo = map[string]interface{}{}
-
-	got, err := MarshalIndent(&o, "", " ")
-	if err != nil {
-		t.Fatal(err)
-	}
-	if got := string(got); got != optionalsExpected {
-		t.Errorf(" got: %s\nwant: %s\n", got, optionalsExpected)
-	}
-}
-
-type StringTag struct {
-	BoolStr bool   `json:",string"`
-	IntStr  int64  `json:",string"`
-	StrStr  string `json:",string"`
-}
-
-var stringTagExpected = `{
- "BoolStr": "true",
- "IntStr": "42",
- "StrStr": "\"xzbit\""
-}`
-
-func TestStringTag(t *testing.T) {
-	var s StringTag
-	s.BoolStr = true
-	s.IntStr = 42
-	s.StrStr = "xzbit"
-	got, err := MarshalIndent(&s, "", " ")
-	if err != nil {
-		t.Fatal(err)
-	}
-	if got := string(got); got != stringTagExpected {
-		t.Fatalf(" got: %s\nwant: %s\n", got, stringTagExpected)
-	}
-
-	// Verify that it round-trips.
-	var s2 StringTag
-	err = NewDecoder(bytes.NewReader(got)).Decode(&s2)
-	if err != nil {
-		t.Fatalf("Decode: %v", err)
-	}
-	if !reflect.DeepEqual(s, s2) {
-		t.Fatalf("decode didn't match.\nsource: %#v\nEncoded as:\n%s\ndecode: %#v", s, string(got), s2)
-	}
-}
-
-// byte slices are special even if they're renamed types.
-type renamedByte byte
-type renamedByteSlice []byte
-type renamedRenamedByteSlice []renamedByte
-
-func TestEncodeRenamedByteSlice(t *testing.T) {
-	s := renamedByteSlice("abc")
-	result, err := Marshal(s)
-	if err != nil {
-		t.Fatal(err)
-	}
-	expect := `"YWJj"`
-	if string(result) != expect {
-		t.Errorf(" got %s want %s", result, expect)
-	}
-	r := renamedRenamedByteSlice("abc")
-	result, err = Marshal(r)
-	if err != nil {
-		t.Fatal(err)
-	}
-	if string(result) != expect {
-		t.Errorf(" got %s want %s", result, expect)
-	}
-}
-
-var unsupportedValues = []interface{}{
-	math.NaN(),
-	math.Inf(-1),
-	math.Inf(1),
-}
-
-func TestUnsupportedValues(t *testing.T) {
-	for _, v := range unsupportedValues {
-		if _, err := Marshal(v); err != nil {
-			if _, ok := err.(*UnsupportedValueError); !ok {
-				t.Errorf("for %v, got %T want UnsupportedValueError", v, err)
-			}
-		} else {
-			t.Errorf("for %v, expected error", v)
-		}
-	}
-}
-
-// Ref has Marshaler and Unmarshaler methods with pointer receiver.
-type Ref int
-
-func (*Ref) MarshalJSON() ([]byte, error) {
-	return []byte(`"ref"`), nil
-}
-
-func (r *Ref) UnmarshalJSON([]byte) error {
-	*r = 12
-	return nil
-}
-
-// Val has Marshaler methods with value receiver.
-type Val int
-
-func (Val) MarshalJSON() ([]byte, error) {
-	return []byte(`"val"`), nil
-}
-
-// RefText has Marshaler and Unmarshaler methods with pointer receiver.
-type RefText int
-
-func (*RefText) MarshalText() ([]byte, error) {
-	return []byte(`"ref"`), nil
-}
-
-func (r *RefText) UnmarshalText([]byte) error {
-	*r = 13
-	return nil
-}
-
-// ValText has Marshaler methods with value receiver.
-type ValText int
-
-func (ValText) MarshalText() ([]byte, error) {
-	return []byte(`"val"`), nil
-}
-
-func TestRefValMarshal(t *testing.T) {
-	var s = struct {
-		R0 Ref
-		R1 *Ref
-		R2 RefText
-		R3 *RefText
-		V0 Val
-		V1 *Val
-		V2 ValText
-		V3 *ValText
-	}{
-		R0: 12,
-		R1: new(Ref),
-		R2: 14,
-		R3: new(RefText),
-		V0: 13,
-		V1: new(Val),
-		V2: 15,
-		V3: new(ValText),
-	}
-	const want = `{"R0":"ref","R1":"ref","R2":"\"ref\"","R3":"\"ref\"","V0":"val","V1":"val","V2":"\"val\"","V3":"\"val\""}`
-	b, err := Marshal(&s)
-	if err != nil {
-		t.Fatalf("Marshal: %v", err)
-	}
-	if got := string(b); got != want {
-		t.Errorf("got %q, want %q", got, want)
-	}
-}
-
-// C implements Marshaler and returns unescaped JSON.
-type C int
-
-func (C) MarshalJSON() ([]byte, error) {
-	return []byte(`"<&>"`), nil
-}
-
-// CText implements Marshaler and returns unescaped text.
-type CText int
-
-func (CText) MarshalText() ([]byte, error) {
-	return []byte(`"<&>"`), nil
-}
-
-func TestMarshalerEscaping(t *testing.T) {
-	var c C
-	want := `"\u003c\u0026\u003e"`
-	b, err := Marshal(c)
-	if err != nil {
-		t.Fatalf("Marshal(c): %v", err)
-	}
-	if got := string(b); got != want {
-		t.Errorf("Marshal(c) = %#q, want %#q", got, want)
-	}
-
-	var ct CText
-	want = `"\"\u003c\u0026\u003e\""`
-	b, err = Marshal(ct)
-	if err != nil {
-		t.Fatalf("Marshal(ct): %v", err)
-	}
-	if got := string(b); got != want {
-		t.Errorf("Marshal(ct) = %#q, want %#q", got, want)
-	}
-}
-
-type IntType int
-
-type MyStruct struct {
-	IntType
-}
-
-func TestAnonymousNonstruct(t *testing.T) {
-	var i IntType = 11
-	a := MyStruct{i}
-	const want = `{"IntType":11}`
-
-	b, err := Marshal(a)
-	if err != nil {
-		t.Fatalf("Marshal: %v", err)
-	}
-	if got := string(b); got != want {
-		t.Errorf("got %q, want %q", got, want)
-	}
-}
-
-type BugA struct {
-	S string
-}
-
-type BugB struct {
-	BugA
-	S string
-}
-
-type BugC struct {
-	S string
-}
-
-// Legal Go: We never use the repeated embedded field (S).
-type BugX struct {
-	A int
-	BugA
-	BugB
-}
-
-// Issue 5245.
-func TestEmbeddedBug(t *testing.T) {
-	v := BugB{
-		BugA{"A"},
-		"B",
-	}
-	b, err := Marshal(v)
-	if err != nil {
-		t.Fatal("Marshal:", err)
-	}
-	want := `{"S":"B"}`
-	got := string(b)
-	if got != want {
-		t.Fatalf("Marshal: got %s want %s", got, want)
-	}
-	// Now check that the duplicate field, S, does not appear.
-	x := BugX{
-		A: 23,
-	}
-	b, err = Marshal(x)
-	if err != nil {
-		t.Fatal("Marshal:", err)
-	}
-	want = `{"A":23}`
-	got = string(b)
-	if got != want {
-		t.Fatalf("Marshal: got %s want %s", got, want)
-	}
-}
-
-type BugD struct { // Same as BugA after tagging.
-	XXX string `json:"S"`
-}
-
-// BugD's tagged S field should dominate BugA's.
-type BugY struct {
-	BugA
-	BugD
-}
-
-// Test that a field with a tag dominates untagged fields.
-func TestTaggedFieldDominates(t *testing.T) {
-	v := BugY{
-		BugA{"BugA"},
-		BugD{"BugD"},
-	}
-	b, err := Marshal(v)
-	if err != nil {
-		t.Fatal("Marshal:", err)
-	}
-	want := `{"S":"BugD"}`
-	got := string(b)
-	if got != want {
-		t.Fatalf("Marshal: got %s want %s", got, want)
-	}
-}
-
-// There are no tags here, so S should not appear.
-type BugZ struct {
-	BugA
-	BugC
-	BugY // Contains a tagged S field through BugD; should not dominate.
-}
-
-func TestDuplicatedFieldDisappears(t *testing.T) {
-	v := BugZ{
-		BugA{"BugA"},
-		BugC{"BugC"},
-		BugY{
-			BugA{"nested BugA"},
-			BugD{"nested BugD"},
-		},
-	}
-	b, err := Marshal(v)
-	if err != nil {
-		t.Fatal("Marshal:", err)
-	}
-	want := `{}`
-	got := string(b)
-	if got != want {
-		t.Fatalf("Marshal: got %s want %s", got, want)
-	}
-}
-
-func TestStringBytes(t *testing.T) {
-	// Test that encodeState.stringBytes and encodeState.string use the same encoding.
-	es := &encodeState{}
-	var r []rune
-	for i := '\u0000'; i <= unicode.MaxRune; i++ {
-		r = append(r, i)
-	}
-	s := string(r) + "\xff\xff\xffhello" // some invalid UTF-8 too
-	es.string(s)
-
-	esBytes := &encodeState{}
-	esBytes.stringBytes([]byte(s))
-
-	enc := es.Buffer.String()
-	encBytes := esBytes.Buffer.String()
-	if enc != encBytes {
-		i := 0
-		for i < len(enc) && i < len(encBytes) && enc[i] == encBytes[i] {
-			i++
-		}
-		enc = enc[i:]
-		encBytes = encBytes[i:]
-		i = 0
-		for i < len(enc) && i < len(encBytes) && enc[len(enc)-i-1] == encBytes[len(encBytes)-i-1] {
-			i++
-		}
-		enc = enc[:len(enc)-i]
-		encBytes = encBytes[:len(encBytes)-i]
-
-		if len(enc) > 20 {
-			enc = enc[:20] + "..."
-		}
-		if len(encBytes) > 20 {
-			encBytes = encBytes[:20] + "..."
-		}
-
-		t.Errorf("encodings differ at %#q vs %#q", enc, encBytes)
-	}
-}
-
-func TestIssue6458(t *testing.T) {
-	type Foo struct {
-		M RawMessage
-	}
-	x := Foo{RawMessage(`"foo"`)}
-
-	b, err := Marshal(&x)
-	if err != nil {
-		t.Fatal(err)
-	}
-	if want := `{"M":"foo"}`; string(b) != want {
-		t.Errorf("Marshal(&x) = %#q; want %#q", b, want)
-	}
-
-	b, err = Marshal(x)
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	if want := `{"M":"ImZvbyI="}`; string(b) != want {
-		t.Errorf("Marshal(x) = %#q; want %#q", b, want)
-	}
-}
-
-func TestIssue10281(t *testing.T) {
-	type Foo struct {
-		N Number
-	}
-	x := Foo{Number(`invalid`)}
-
-	b, err := Marshal(&x)
-	if err == nil {
-		t.Errorf("Marshal(&x) = %#q; want error", b)
-	}
-}
-
-func TestHTMLEscape(t *testing.T) {
-	var b, want bytes.Buffer
-	m := `{"M":"<html>foo &` + "\xe2\x80\xa8 \xe2\x80\xa9" + `</html>"}`
-	want.Write([]byte(`{"M":"\u003chtml\u003efoo \u0026\u2028 \u2029\u003c/html\u003e"}`))
-	HTMLEscape(&b, []byte(m))
-	if !bytes.Equal(b.Bytes(), want.Bytes()) {
-		t.Errorf("HTMLEscape(&b, []byte(m)) = %s; want %s", b.Bytes(), want.Bytes())
-	}
-}
-
-// golang.org/issue/8582
-func TestEncodePointerString(t *testing.T) {
-	type stringPointer struct {
-		N *int64 `json:"n,string"`
-	}
-	var n int64 = 42
-	b, err := Marshal(stringPointer{N: &n})
-	if err != nil {
-		t.Fatalf("Marshal: %v", err)
-	}
-	if got, want := string(b), `{"n":"42"}`; got != want {
-		t.Errorf("Marshal = %s, want %s", got, want)
-	}
-	var back stringPointer
-	err = Unmarshal(b, &back)
-	if err != nil {
-		t.Fatalf("Unmarshal: %v", err)
-	}
-	if back.N == nil {
-		t.Fatalf("Unmarshalled nil N field")
-	}
-	if *back.N != 42 {
-		t.Fatalf("*N = %d; want 42", *back.N)
-	}
-}
-
-var encodeStringTests = []struct {
-	in  string
-	out string
-}{
-	{"\x00", `"\u0000"`},
-	{"\x01", `"\u0001"`},
-	{"\x02", `"\u0002"`},
-	{"\x03", `"\u0003"`},
-	{"\x04", `"\u0004"`},
-	{"\x05", `"\u0005"`},
-	{"\x06", `"\u0006"`},
-	{"\x07", `"\u0007"`},
-	{"\x08", `"\u0008"`},
-	{"\x09", `"\t"`},
-	{"\x0a", `"\n"`},
-	{"\x0b", `"\u000b"`},
-	{"\x0c", `"\u000c"`},
-	{"\x0d", `"\r"`},
-	{"\x0e", `"\u000e"`},
-	{"\x0f", `"\u000f"`},
-	{"\x10", `"\u0010"`},
-	{"\x11", `"\u0011"`},
-	{"\x12", `"\u0012"`},
-	{"\x13", `"\u0013"`},
-	{"\x14", `"\u0014"`},
-	{"\x15", `"\u0015"`},
-	{"\x16", `"\u0016"`},
-	{"\x17", `"\u0017"`},
-	{"\x18", `"\u0018"`},
-	{"\x19", `"\u0019"`},
-	{"\x1a", `"\u001a"`},
-	{"\x1b", `"\u001b"`},
-	{"\x1c", `"\u001c"`},
-	{"\x1d", `"\u001d"`},
-	{"\x1e", `"\u001e"`},
-	{"\x1f", `"\u001f"`},
-}
-
-func TestEncodeString(t *testing.T) {
-	for _, tt := range encodeStringTests {
-		b, err := Marshal(tt.in)
-		if err != nil {
-			t.Errorf("Marshal(%q): %v", tt.in, err)
-			continue
-		}
-		out := string(b)
-		if out != tt.out {
-			t.Errorf("Marshal(%q) = %#q, want %#q", tt.in, out, tt.out)
-		}
-	}
-}
diff --git a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/json/number_test.go b/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/json/number_test.go
deleted file mode 100644
index 4e63cf9c7..000000000
--- a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/json/number_test.go
+++ /dev/null
@@ -1,133 +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 json
-
-import (
-	"regexp"
-	"testing"
-)
-
-func TestNumberIsValid(t *testing.T) {
-	// From: http://stackoverflow.com/a/13340826
-	var jsonNumberRegexp = regexp.MustCompile(`^-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?$`)
-
-	validTests := []string{
-		"0",
-		"-0",
-		"1",
-		"-1",
-		"0.1",
-		"-0.1",
-		"1234",
-		"-1234",
-		"12.34",
-		"-12.34",
-		"12E0",
-		"12E1",
-		"12e34",
-		"12E-0",
-		"12e+1",
-		"12e-34",
-		"-12E0",
-		"-12E1",
-		"-12e34",
-		"-12E-0",
-		"-12e+1",
-		"-12e-34",
-		"1.2E0",
-		"1.2E1",
-		"1.2e34",
-		"1.2E-0",
-		"1.2e+1",
-		"1.2e-34",
-		"-1.2E0",
-		"-1.2E1",
-		"-1.2e34",
-		"-1.2E-0",
-		"-1.2e+1",
-		"-1.2e-34",
-		"0E0",
-		"0E1",
-		"0e34",
-		"0E-0",
-		"0e+1",
-		"0e-34",
-		"-0E0",
-		"-0E1",
-		"-0e34",
-		"-0E-0",
-		"-0e+1",
-		"-0e-34",
-	}
-
-	for _, test := range validTests {
-		if !isValidNumber(test) {
-			t.Errorf("%s should be valid", test)
-		}
-
-		var f float64
-		if err := Unmarshal([]byte(test), &f); err != nil {
-			t.Errorf("%s should be valid but Unmarshal failed: %v", test, err)
-		}
-
-		if !jsonNumberRegexp.MatchString(test) {
-			t.Errorf("%s should be valid but regexp does not match", test)
-		}
-	}
-
-	invalidTests := []string{
-		"",
-		"invalid",
-		"1.0.1",
-		"1..1",
-		"-1-2",
-		"012a42",
-		"01.2",
-		"012",
-		"12E12.12",
-		"1e2e3",
-		"1e+-2",
-		"1e--23",
-		"1e",
-		"e1",
-		"1e+",
-		"1ea",
-		"1a",
-		"1.a",
-		"1.",
-		"01",
-		"1.e1",
-	}
-
-	for _, test := range invalidTests {
-		if isValidNumber(test) {
-			t.Errorf("%s should be invalid", test)
-		}
-
-		var f float64
-		if err := Unmarshal([]byte(test), &f); err == nil {
-			t.Errorf("%s should be invalid but unmarshal wrote %v", test, f)
-		}
-
-		if jsonNumberRegexp.MatchString(test) {
-			t.Errorf("%s should be invalid but matches regexp", test)
-		}
-	}
-}
-
-func BenchmarkNumberIsValid(b *testing.B) {
-	s := "-61657.61667E+61673"
-	for i := 0; i < b.N; i++ {
-		isValidNumber(s)
-	}
-}
-
-func BenchmarkNumberIsValidRegexp(b *testing.B) {
-	var jsonNumberRegexp = regexp.MustCompile(`^-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?$`)
-	s := "-61657.61667E+61673"
-	for i := 0; i < b.N; i++ {
-		jsonNumberRegexp.MatchString(s)
-	}
-}
diff --git a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/json/scanner_test.go b/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/json/scanner_test.go
deleted file mode 100644
index 66383ef0e..000000000
--- a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/json/scanner_test.go
+++ /dev/null
@@ -1,316 +0,0 @@
-// Copyright 2010 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package json
-
-import (
-	"bytes"
-	"math"
-	"math/rand"
-	"reflect"
-	"testing"
-)
-
-// Tests of simple examples.
-
-type example struct {
-	compact string
-	indent  string
-}
-
-var examples = []example{
-	{`1`, `1`},
-	{`{}`, `{}`},
-	{`[]`, `[]`},
-	{`{"":2}`, "{\n\t\"\": 2\n}"},
-	{`[3]`, "[\n\t3\n]"},
-	{`[1,2,3]`, "[\n\t1,\n\t2,\n\t3\n]"},
-	{`{"x":1}`, "{\n\t\"x\": 1\n}"},
-	{ex1, ex1i},
-}
-
-var ex1 = `[true,false,null,"x",1,1.5,0,-5e+2]`
-
-var ex1i = `[
-	true,
-	false,
-	null,
-	"x",
-	1,
-	1.5,
-	0,
-	-5e+2
-]`
-
-func TestCompact(t *testing.T) {
-	var buf bytes.Buffer
-	for _, tt := range examples {
-		buf.Reset()
-		if err := Compact(&buf, []byte(tt.compact)); err != nil {
-			t.Errorf("Compact(%#q): %v", tt.compact, err)
-		} else if s := buf.String(); s != tt.compact {
-			t.Errorf("Compact(%#q) = %#q, want original", tt.compact, s)
-		}
-
-		buf.Reset()
-		if err := Compact(&buf, []byte(tt.indent)); err != nil {
-			t.Errorf("Compact(%#q): %v", tt.indent, err)
-			continue
-		} else if s := buf.String(); s != tt.compact {
-			t.Errorf("Compact(%#q) = %#q, want %#q", tt.indent, s, tt.compact)
-		}
-	}
-}
-
-func TestCompactSeparators(t *testing.T) {
-	// U+2028 and U+2029 should be escaped inside strings.
-	// They should not appear outside strings.
-	tests := []struct {
-		in, compact string
-	}{
-		{"{\"\u2028\": 1}", `{"\u2028":1}`},
-		{"{\"\u2029\" :2}", `{"\u2029":2}`},
-	}
-	for _, tt := range tests {
-		var buf bytes.Buffer
-		if err := Compact(&buf, []byte(tt.in)); err != nil {
-			t.Errorf("Compact(%q): %v", tt.in, err)
-		} else if s := buf.String(); s != tt.compact {
-			t.Errorf("Compact(%q) = %q, want %q", tt.in, s, tt.compact)
-		}
-	}
-}
-
-func TestIndent(t *testing.T) {
-	var buf bytes.Buffer
-	for _, tt := range examples {
-		buf.Reset()
-		if err := Indent(&buf, []byte(tt.indent), "", "\t"); err != nil {
-			t.Errorf("Indent(%#q): %v", tt.indent, err)
-		} else if s := buf.String(); s != tt.indent {
-			t.Errorf("Indent(%#q) = %#q, want original", tt.indent, s)
-		}
-
-		buf.Reset()
-		if err := Indent(&buf, []byte(tt.compact), "", "\t"); err != nil {
-			t.Errorf("Indent(%#q): %v", tt.compact, err)
-			continue
-		} else if s := buf.String(); s != tt.indent {
-			t.Errorf("Indent(%#q) = %#q, want %#q", tt.compact, s, tt.indent)
-		}
-	}
-}
-
-// Tests of a large random structure.
-
-func TestCompactBig(t *testing.T) {
-	initBig()
-	var buf bytes.Buffer
-	if err := Compact(&buf, jsonBig); err != nil {
-		t.Fatalf("Compact: %v", err)
-	}
-	b := buf.Bytes()
-	if !bytes.Equal(b, jsonBig) {
-		t.Error("Compact(jsonBig) != jsonBig")
-		diff(t, b, jsonBig)
-		return
-	}
-}
-
-func TestIndentBig(t *testing.T) {
-	initBig()
-	var buf bytes.Buffer
-	if err := Indent(&buf, jsonBig, "", "\t"); err != nil {
-		t.Fatalf("Indent1: %v", err)
-	}
-	b := buf.Bytes()
-	if len(b) == len(jsonBig) {
-		// jsonBig is compact (no unnecessary spaces);
-		// indenting should make it bigger
-		t.Fatalf("Indent(jsonBig) did not get bigger")
-	}
-
-	// should be idempotent
-	var buf1 bytes.Buffer
-	if err := Indent(&buf1, b, "", "\t"); err != nil {
-		t.Fatalf("Indent2: %v", err)
-	}
-	b1 := buf1.Bytes()
-	if !bytes.Equal(b1, b) {
-		t.Error("Indent(Indent(jsonBig)) != Indent(jsonBig)")
-		diff(t, b1, b)
-		return
-	}
-
-	// should get back to original
-	buf1.Reset()
-	if err := Compact(&buf1, b); err != nil {
-		t.Fatalf("Compact: %v", err)
-	}
-	b1 = buf1.Bytes()
-	if !bytes.Equal(b1, jsonBig) {
-		t.Error("Compact(Indent(jsonBig)) != jsonBig")
-		diff(t, b1, jsonBig)
-		return
-	}
-}
-
-type indentErrorTest struct {
-	in  string
-	err error
-}
-
-var indentErrorTests = []indentErrorTest{
-	{`{"X": "foo", "Y"}`, &SyntaxError{"invalid character '}' after object key", 17}},
-	{`{"X": "foo" "Y": "bar"}`, &SyntaxError{"invalid character '\"' after object key:value pair", 13}},
-}
-
-func TestIndentErrors(t *testing.T) {
-	for i, tt := range indentErrorTests {
-		slice := make([]uint8, 0)
-		buf := bytes.NewBuffer(slice)
-		if err := Indent(buf, []uint8(tt.in), "", ""); err != nil {
-			if !reflect.DeepEqual(err, tt.err) {
-				t.Errorf("#%d: Indent: %#v", i, err)
-				continue
-			}
-		}
-	}
-}
-
-func TestNextValueBig(t *testing.T) {
-	initBig()
-	var scan scanner
-	item, rest, err := nextValue(jsonBig, &scan)
-	if err != nil {
-		t.Fatalf("nextValue: %s", err)
-	}
-	if len(item) != len(jsonBig) || &item[0] != &jsonBig[0] {
-		t.Errorf("invalid item: %d %d", len(item), len(jsonBig))
-	}
-	if len(rest) != 0 {
-		t.Errorf("invalid rest: %d", len(rest))
-	}
-
-	item, rest, err = nextValue(append(jsonBig, "HELLO WORLD"...), &scan)
-	if err != nil {
-		t.Fatalf("nextValue extra: %s", err)
-	}
-	if len(item) != len(jsonBig) {
-		t.Errorf("invalid item: %d %d", len(item), len(jsonBig))
-	}
-	if string(rest) != "HELLO WORLD" {
-		t.Errorf("invalid rest: %d", len(rest))
-	}
-}
-
-var benchScan scanner
-
-func BenchmarkSkipValue(b *testing.B) {
-	initBig()
-	b.ResetTimer()
-	for i := 0; i < b.N; i++ {
-		nextValue(jsonBig, &benchScan)
-	}
-	b.SetBytes(int64(len(jsonBig)))
-}
-
-func diff(t *testing.T, a, b []byte) {
-	for i := 0; ; i++ {
-		if i >= len(a) || i >= len(b) || a[i] != b[i] {
-			j := i - 10
-			if j < 0 {
-				j = 0
-			}
-			t.Errorf("diverge at %d: «%s» vs «%s»", i, trim(a[j:]), trim(b[j:]))
-			return
-		}
-	}
-}
-
-func trim(b []byte) []byte {
-	if len(b) > 20 {
-		return b[0:20]
-	}
-	return b
-}
-
-// Generate a random JSON object.
-
-var jsonBig []byte
-
-func initBig() {
-	n := 10000
-	if testing.Short() {
-		n = 100
-	}
-	b, err := Marshal(genValue(n))
-	if err != nil {
-		panic(err)
-	}
-	jsonBig = b
-}
-
-func genValue(n int) interface{} {
-	if n > 1 {
-		switch rand.Intn(2) {
-		case 0:
-			return genArray(n)
-		case 1:
-			return genMap(n)
-		}
-	}
-	switch rand.Intn(3) {
-	case 0:
-		return rand.Intn(2) == 0
-	case 1:
-		return rand.NormFloat64()
-	case 2:
-		return genString(30)
-	}
-	panic("unreachable")
-}
-
-func genString(stddev float64) string {
-	n := int(math.Abs(rand.NormFloat64()*stddev + stddev/2))
-	c := make([]rune, n)
-	for i := range c {
-		f := math.Abs(rand.NormFloat64()*64 + 32)
-		if f > 0x10ffff {
-			f = 0x10ffff
-		}
-		c[i] = rune(f)
-	}
-	return string(c)
-}
-
-func genArray(n int) []interface{} {
-	f := int(math.Abs(rand.NormFloat64()) * math.Min(10, float64(n/2)))
-	if f > n {
-		f = n
-	}
-	if f < 1 {
-		f = 1
-	}
-	x := make([]interface{}, f)
-	for i := range x {
-		x[i] = genValue(((i+1)*n)/f - (i*n)/f)
-	}
-	return x
-}
-
-func genMap(n int) map[string]interface{} {
-	f := int(math.Abs(rand.NormFloat64()) * math.Min(10, float64(n/2)))
-	if f > n {
-		f = n
-	}
-	if n > 0 && f == 0 {
-		f = 1
-	}
-	x := make(map[string]interface{})
-	for i := 0; i < f; i++ {
-		x[genString(10)] = genValue(((i+1)*n)/f - (i*n)/f)
-	}
-	return x
-}
diff --git a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/json/stream_test.go b/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/json/stream_test.go
deleted file mode 100644
index eccf365b2..000000000
--- a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/json/stream_test.go
+++ /dev/null
@@ -1,354 +0,0 @@
-// Copyright 2010 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package json
-
-import (
-	"bytes"
-	"io"
-	"io/ioutil"
-	"log"
-	"net"
-	"net/http"
-	"net/http/httptest"
-	"reflect"
-	"strings"
-	"testing"
-)
-
-// Test values for the stream test.
-// One of each JSON kind.
-var streamTest = []interface{}{
-	0.1,
-	"hello",
-	nil,
-	true,
-	false,
-	[]interface{}{"a", "b", "c"},
-	map[string]interface{}{"K": "Kelvin", "ß": "long s"},
-	3.14, // another value to make sure something can follow map
-}
-
-var streamEncoded = `0.1
-"hello"
-null
-true
-false
-["a","b","c"]
-{"ß":"long s","K":"Kelvin"}
-3.14
-`
-
-func TestEncoder(t *testing.T) {
-	for i := 0; i <= len(streamTest); i++ {
-		var buf bytes.Buffer
-		enc := NewEncoder(&buf)
-		for j, v := range streamTest[0:i] {
-			if err := enc.Encode(v); err != nil {
-				t.Fatalf("encode #%d: %v", j, err)
-			}
-		}
-		if have, want := buf.String(), nlines(streamEncoded, i); have != want {
-			t.Errorf("encoding %d items: mismatch", i)
-			diff(t, []byte(have), []byte(want))
-			break
-		}
-	}
-}
-
-func TestDecoder(t *testing.T) {
-	for i := 0; i <= len(streamTest); i++ {
-		// Use stream without newlines as input,
-		// just to stress the decoder even more.
-		// Our test input does not include back-to-back numbers.
-		// Otherwise stripping the newlines would
-		// merge two adjacent JSON values.
-		var buf bytes.Buffer
-		for _, c := range nlines(streamEncoded, i) {
-			if c != '\n' {
-				buf.WriteRune(c)
-			}
-		}
-		out := make([]interface{}, i)
-		dec := NewDecoder(&buf)
-		for j := range out {
-			if err := dec.Decode(&out[j]); err != nil {
-				t.Fatalf("decode #%d/%d: %v", j, i, err)
-			}
-		}
-		if !reflect.DeepEqual(out, streamTest[0:i]) {
-			t.Errorf("decoding %d items: mismatch", i)
-			for j := range out {
-				if !reflect.DeepEqual(out[j], streamTest[j]) {
-					t.Errorf("#%d: have %v want %v", j, out[j], streamTest[j])
-				}
-			}
-			break
-		}
-	}
-}
-
-func TestDecoderBuffered(t *testing.T) {
-	r := strings.NewReader(`{"Name": "Gopher"} extra `)
-	var m struct {
-		Name string
-	}
-	d := NewDecoder(r)
-	err := d.Decode(&m)
-	if err != nil {
-		t.Fatal(err)
-	}
-	if m.Name != "Gopher" {
-		t.Errorf("Name = %q; want Gopher", m.Name)
-	}
-	rest, err := ioutil.ReadAll(d.Buffered())
-	if err != nil {
-		t.Fatal(err)
-	}
-	if g, w := string(rest), " extra "; g != w {
-		t.Errorf("Remaining = %q; want %q", g, w)
-	}
-}
-
-func nlines(s string, n int) string {
-	if n <= 0 {
-		return ""
-	}
-	for i, c := range s {
-		if c == '\n' {
-			if n--; n == 0 {
-				return s[0 : i+1]
-			}
-		}
-	}
-	return s
-}
-
-func TestRawMessage(t *testing.T) {
-	// TODO(rsc): Should not need the * in *RawMessage
-	var data struct {
-		X  float64
-		Id *RawMessage
-		Y  float32
-	}
-	const raw = `["\u0056",null]`
-	const msg = `{"X":0.1,"Id":["\u0056",null],"Y":0.2}`
-	err := Unmarshal([]byte(msg), &data)
-	if err != nil {
-		t.Fatalf("Unmarshal: %v", err)
-	}
-	if string([]byte(*data.Id)) != raw {
-		t.Fatalf("Raw mismatch: have %#q want %#q", []byte(*data.Id), raw)
-	}
-	b, err := Marshal(&data)
-	if err != nil {
-		t.Fatalf("Marshal: %v", err)
-	}
-	if string(b) != msg {
-		t.Fatalf("Marshal: have %#q want %#q", b, msg)
-	}
-}
-
-func TestNullRawMessage(t *testing.T) {
-	// TODO(rsc): Should not need the * in *RawMessage
-	var data struct {
-		X  float64
-		Id *RawMessage
-		Y  float32
-	}
-	data.Id = new(RawMessage)
-	const msg = `{"X":0.1,"Id":null,"Y":0.2}`
-	err := Unmarshal([]byte(msg), &data)
-	if err != nil {
-		t.Fatalf("Unmarshal: %v", err)
-	}
-	if data.Id != nil {
-		t.Fatalf("Raw mismatch: have non-nil, want nil")
-	}
-	b, err := Marshal(&data)
-	if err != nil {
-		t.Fatalf("Marshal: %v", err)
-	}
-	if string(b) != msg {
-		t.Fatalf("Marshal: have %#q want %#q", b, msg)
-	}
-}
-
-var blockingTests = []string{
-	`{"x": 1}`,
-	`[1, 2, 3]`,
-}
-
-func TestBlocking(t *testing.T) {
-	for _, enc := range blockingTests {
-		r, w := net.Pipe()
-		go w.Write([]byte(enc))
-		var val interface{}
-
-		// If Decode reads beyond what w.Write writes above,
-		// it will block, and the test will deadlock.
-		if err := NewDecoder(r).Decode(&val); err != nil {
-			t.Errorf("decoding %s: %v", enc, err)
-		}
-		r.Close()
-		w.Close()
-	}
-}
-
-func BenchmarkEncoderEncode(b *testing.B) {
-	b.ReportAllocs()
-	type T struct {
-		X, Y string
-	}
-	v := &T{"foo", "bar"}
-	for i := 0; i < b.N; i++ {
-		if err := NewEncoder(ioutil.Discard).Encode(v); err != nil {
-			b.Fatal(err)
-		}
-	}
-}
-
-type tokenStreamCase struct {
-	json      string
-	expTokens []interface{}
-}
-
-type decodeThis struct {
-	v interface{}
-}
-
-var tokenStreamCases []tokenStreamCase = []tokenStreamCase{
-	// streaming token cases
-	{json: `10`, expTokens: []interface{}{float64(10)}},
-	{json: ` [10] `, expTokens: []interface{}{
-		Delim('['), float64(10), Delim(']')}},
-	{json: ` [false,10,"b"] `, expTokens: []interface{}{
-		Delim('['), false, float64(10), "b", Delim(']')}},
-	{json: `{ "a": 1 }`, expTokens: []interface{}{
-		Delim('{'), "a", float64(1), Delim('}')}},
-	{json: `{"a": 1, "b":"3"}`, expTokens: []interface{}{
-		Delim('{'), "a", float64(1), "b", "3", Delim('}')}},
-	{json: ` [{"a": 1},{"a": 2}] `, expTokens: []interface{}{
-		Delim('['),
-		Delim('{'), "a", float64(1), Delim('}'),
-		Delim('{'), "a", float64(2), Delim('}'),
-		Delim(']')}},
-	{json: `{"obj": {"a": 1}}`, expTokens: []interface{}{
-		Delim('{'), "obj", Delim('{'), "a", float64(1), Delim('}'),
-		Delim('}')}},
-	{json: `{"obj": [{"a": 1}]}`, expTokens: []interface{}{
-		Delim('{'), "obj", Delim('['),
-		Delim('{'), "a", float64(1), Delim('}'),
-		Delim(']'), Delim('}')}},
-
-	// streaming tokens with intermittent Decode()
-	{json: `{ "a": 1 }`, expTokens: []interface{}{
-		Delim('{'), "a",
-		decodeThis{float64(1)},
-		Delim('}')}},
-	{json: ` [ { "a" : 1 } ] `, expTokens: []interface{}{
-		Delim('['),
-		decodeThis{map[string]interface{}{"a": float64(1)}},
-		Delim(']')}},
-	{json: ` [{"a": 1},{"a": 2}] `, expTokens: []interface{}{
-		Delim('['),
-		decodeThis{map[string]interface{}{"a": float64(1)}},
-		decodeThis{map[string]interface{}{"a": float64(2)}},
-		Delim(']')}},
-	{json: `{ "obj" : [ { "a" : 1 } ] }`, expTokens: []interface{}{
-		Delim('{'), "obj", Delim('['),
-		decodeThis{map[string]interface{}{"a": float64(1)}},
-		Delim(']'), Delim('}')}},
-
-	{json: `{"obj": {"a": 1}}`, expTokens: []interface{}{
-		Delim('{'), "obj",
-		decodeThis{map[string]interface{}{"a": float64(1)}},
-		Delim('}')}},
-	{json: `{"obj": [{"a": 1}]}`, expTokens: []interface{}{
-		Delim('{'), "obj",
-		decodeThis{[]interface{}{
-			map[string]interface{}{"a": float64(1)},
-		}},
-		Delim('}')}},
-	{json: ` [{"a": 1} {"a": 2}] `, expTokens: []interface{}{
-		Delim('['),
-		decodeThis{map[string]interface{}{"a": float64(1)}},
-		decodeThis{&SyntaxError{"expected comma after array element", 0}},
-	}},
-	{json: `{ "a" 1 }`, expTokens: []interface{}{
-		Delim('{'), "a",
-		decodeThis{&SyntaxError{"expected colon after object key", 0}},
-	}},
-}
-
-func TestDecodeInStream(t *testing.T) {
-
-	for ci, tcase := range tokenStreamCases {
-
-		dec := NewDecoder(strings.NewReader(tcase.json))
-		for i, etk := range tcase.expTokens {
-
-			var tk interface{}
-			var err error
-
-			if dt, ok := etk.(decodeThis); ok {
-				etk = dt.v
-				err = dec.Decode(&tk)
-			} else {
-				tk, err = dec.Token()
-			}
-			if experr, ok := etk.(error); ok {
-				if err == nil || err.Error() != experr.Error() {
-					t.Errorf("case %v: Expected error %v in %q, but was %v", ci, experr, tcase.json, err)
-				}
-				break
-			} else if err == io.EOF {
-				t.Errorf("case %v: Unexpected EOF in %q", ci, tcase.json)
-				break
-			} else if err != nil {
-				t.Errorf("case %v: Unexpected error '%v' in %q", ci, err, tcase.json)
-				break
-			}
-			if !reflect.DeepEqual(tk, etk) {
-				t.Errorf(`case %v: %q @ %v expected %T(%v) was %T(%v)`, ci, tcase.json, i, etk, etk, tk, tk)
-				break
-			}
-		}
-	}
-
-}
-
-// Test from golang.org/issue/11893
-func TestHTTPDecoding(t *testing.T) {
-	const raw = `{ "foo": "bar" }`
-
-	ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
-		w.Write([]byte(raw))
-	}))
-	defer ts.Close()
-	res, err := http.Get(ts.URL)
-	if err != nil {
-		log.Fatalf("GET failed: %v", err)
-	}
-	defer res.Body.Close()
-
-	foo := struct {
-		Foo string `json:"foo"`
-	}{}
-
-	d := NewDecoder(res.Body)
-	err = d.Decode(&foo)
-	if err != nil {
-		t.Fatalf("Decode: %v", err)
-	}
-	if foo.Foo != "bar" {
-		t.Errorf("decoded %q; want \"bar\"", foo.Foo)
-	}
-
-	// make sure we get the EOF the second time
-	err = d.Decode(&foo)
-	if err != io.EOF {
-		t.Errorf("err = %v; want io.EOF", err)
-	}
-}
diff --git a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/json/tagkey_test.go b/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/json/tagkey_test.go
deleted file mode 100644
index 85bb4ba83..000000000
--- a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/json/tagkey_test.go
+++ /dev/null
@@ -1,115 +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 json
-
-import (
-	"testing"
-)
-
-type basicLatin2xTag struct {
-	V string `json:"$%-/"`
-}
-
-type basicLatin3xTag struct {
-	V string `json:"0123456789"`
-}
-
-type basicLatin4xTag struct {
-	V string `json:"ABCDEFGHIJKLMO"`
-}
-
-type basicLatin5xTag struct {
-	V string `json:"PQRSTUVWXYZ_"`
-}
-
-type basicLatin6xTag struct {
-	V string `json:"abcdefghijklmno"`
-}
-
-type basicLatin7xTag struct {
-	V string `json:"pqrstuvwxyz"`
-}
-
-type miscPlaneTag struct {
-	V string `json:"色は匂へど"`
-}
-
-type percentSlashTag struct {
-	V string `json:"text/html%"` // https://golang.org/issue/2718
-}
-
-type punctuationTag struct {
-	V string `json:"!#$%&()*+-./:<=>?@[]^_{|}~"` // https://golang.org/issue/3546
-}
-
-type emptyTag struct {
-	W string
-}
-
-type misnamedTag struct {
-	X string `jsom:"Misnamed"`
-}
-
-type badFormatTag struct {
-	Y string `:"BadFormat"`
-}
-
-type badCodeTag struct {
-	Z string `json:" !\"#&'()*+,."`
-}
-
-type spaceTag struct {
-	Q string `json:"With space"`
-}
-
-type unicodeTag struct {
-	W string `json:"Ελλάδα"`
-}
-
-var structTagObjectKeyTests = []struct {
-	raw   interface{}
-	value string
-	key   string
-}{
-	{basicLatin2xTag{"2x"}, "2x", "$%-/"},
-	{basicLatin3xTag{"3x"}, "3x", "0123456789"},
-	{basicLatin4xTag{"4x"}, "4x", "ABCDEFGHIJKLMO"},
-	{basicLatin5xTag{"5x"}, "5x", "PQRSTUVWXYZ_"},
-	{basicLatin6xTag{"6x"}, "6x", "abcdefghijklmno"},
-	{basicLatin7xTag{"7x"}, "7x", "pqrstuvwxyz"},
-	{miscPlaneTag{"いろはにほへと"}, "いろはにほへと", "色は匂へど"},
-	{emptyTag{"Pour Moi"}, "Pour Moi", "W"},
-	{misnamedTag{"Animal Kingdom"}, "Animal Kingdom", "X"},
-	{badFormatTag{"Orfevre"}, "Orfevre", "Y"},
-	{badCodeTag{"Reliable Man"}, "Reliable Man", "Z"},
-	{percentSlashTag{"brut"}, "brut", "text/html%"},
-	{punctuationTag{"Union Rags"}, "Union Rags", "!#$%&()*+-./:<=>?@[]^_{|}~"},
-	{spaceTag{"Perreddu"}, "Perreddu", "With space"},
-	{unicodeTag{"Loukanikos"}, "Loukanikos", "Ελλάδα"},
-}
-
-func TestStructTagObjectKey(t *testing.T) {
-	for _, tt := range structTagObjectKeyTests {
-		b, err := Marshal(tt.raw)
-		if err != nil {
-			t.Fatalf("Marshal(%#q) failed: %v", tt.raw, err)
-		}
-		var f interface{}
-		err = Unmarshal(b, &f)
-		if err != nil {
-			t.Fatalf("Unmarshal(%#q) failed: %v", b, err)
-		}
-		for i, v := range f.(map[string]interface{}) {
-			switch i {
-			case tt.key:
-				if s, ok := v.(string); !ok || s != tt.value {
-					t.Fatalf("Unexpected value: %#q, want %v", s, tt.value)
-				}
-			default:
-				t.Fatalf("Unexpected key: %#q, from %#q", i, b)
-			}
-		}
-	}
-}
diff --git a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/json/tags_test.go b/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/json/tags_test.go
deleted file mode 100644
index 91fb18831..000000000
--- a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/json/tags_test.go
+++ /dev/null
@@ -1,28 +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 json
-
-import (
-	"testing"
-)
-
-func TestTagParsing(t *testing.T) {
-	name, opts := parseTag("field,foobar,foo")
-	if name != "field" {
-		t.Fatalf("name = %q, want field", name)
-	}
-	for _, tt := range []struct {
-		opt  string
-		want bool
-	}{
-		{"foobar", true},
-		{"foo", true},
-		{"bar", false},
-	} {
-		if opts.Contains(tt.opt) != tt.want {
-			t.Errorf("Contains(%q) = %v", tt.opt, !tt.want)
-		}
-	}
-}
diff --git a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/json/testdata/code.json.gz b/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/json/testdata/code.json.gz
deleted file mode 100644
index 0e2895b53..000000000
Binary files a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/json/testdata/code.json.gz and /dev/null differ
diff --git a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/json_fork_test.go b/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/json_fork_test.go
deleted file mode 100644
index 78e59dc02..000000000
--- a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/json_fork_test.go
+++ /dev/null
@@ -1,76 +0,0 @@
-// +build !std_json
-
-/*-
- * Copyright 2014 Square Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package jose
-
-import (
-	"testing"
-)
-
-type CaseSensitive struct {
-	A int `json:"Test"`
-	B int `json:"test"`
-	C int `json:"TEST"`
-}
-
-func TestCaseSensitiveJSON(t *testing.T) {
-	raw := []byte(`{"test":42}`)
-	var cs CaseSensitive
-	err := UnmarshalJSON(raw, &cs)
-	if err != nil {
-		t.Error(err)
-	}
-
-	if cs.A != 0 || cs.B != 42 || cs.C != 0 {
-		t.Errorf("parsing JSON should be case-sensitive (got %v)", cs)
-	}
-}
-
-func TestRejectDuplicateKeysObject(t *testing.T) {
-	raw := []byte(`{"test":42,"test":43}`)
-	var cs CaseSensitive
-	err := UnmarshalJSON(raw, &cs)
-	if err == nil {
-		t.Error("should reject JSON with duplicate keys, but didn't")
-	}
-}
-
-func TestRejectDuplicateKeysInterface(t *testing.T) {
-	raw := []byte(`{"test":42,"test":43}`)
-	var m interface{}
-	err := UnmarshalJSON(raw, &m)
-	if err == nil {
-		t.Error("should reject JSON with duplicate keys, but didn't")
-	}
-}
-
-func TestParseCaseSensitiveJWE(t *testing.T) {
-	invalidJWE := `{"protected":"eyJlbmMiOiJYWVoiLCJBTEciOiJYWVoifQo","encrypted_key":"QUJD","iv":"QUJD","ciphertext":"QUJD","tag":"QUJD"}`
-	_, err := ParseEncrypted(invalidJWE)
-	if err == nil {
-		t.Error("Able to parse message with case-invalid headers", invalidJWE)
-	}
-}
-
-func TestParseCaseSensitiveJWS(t *testing.T) {
-	invalidJWS := `{"PAYLOAD":"CUJD","signatures":[{"protected":"e30","signature":"CUJD"}]}`
-	_, err := ParseSigned(invalidJWS)
-	if err == nil {
-		t.Error("Able to parse message with case-invalid headers", invalidJWS)
-	}
-}
diff --git a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/json_std_test.go b/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/json_std_test.go
deleted file mode 100644
index 9819a6141..000000000
--- a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/json_std_test.go
+++ /dev/null
@@ -1,106 +0,0 @@
-// +build std_json
-
-/*-
- * Copyright 2014 Square Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package jose
-
-import (
-	"testing"
-)
-
-type CaseInsensitive struct {
-	A int `json:"TEST"`
-}
-
-func TestCaseInsensitiveJSON(t *testing.T) {
-	raw := []byte(`{"test":42}`)
-	var ci CaseInsensitive
-	err := UnmarshalJSON(raw, &ci)
-	if err != nil {
-		t.Error(err)
-	}
-
-	if ci.A != 42 {
-		t.Errorf("parsing JSON should be case-insensitive (got %v)", ci)
-	}
-}
-
-func TestParseCaseInsensitiveJWE(t *testing.T) {
-	invalidJWE := `{"protected":"eyJlbmMiOiJYWVoiLCJBTEciOiJYWVoifQo","encrypted_key":"QUJD","iv":"QUJD","ciphertext":"QUJD","tag":"QUJD"}`
-	_, err := ParseEncrypted(invalidJWE)
-	if err != nil {
-		t.Error("Unable to parse message with case-invalid headers", invalidJWE)
-	}
-}
-
-func TestParseCaseInsensitiveJWS(t *testing.T) {
-	invalidJWS := `{"PAYLOAD":"CUJD","signatures":[{"protected":"e30","signature":"CUJD"}]}`
-	_, err := ParseSigned(invalidJWS)
-	if err != nil {
-		t.Error("Unable to parse message with case-invalid headers", invalidJWS)
-	}
-}
-
-var JWKSetDuplicates = stripWhitespace(`{
-     "keys": [{
-         "kty": "RSA",
-         "kid": "exclude-me",
-         "use": "sig",
-         "n": "n4EPtAOCc9AlkeQHPzHStgAbgs7bTZLwUBZdR8_KuKPEHLd4rHVTeT
-             -O-XV2jRojdNhxJWTDvNd7nqQ0VEiZQHz_AJmSCpMaJMRBSFKrKb2wqV
-             wGU_NsYOYL-QtiWN2lbzcEe6XC0dApr5ydQLrHqkHHig3RBordaZ6Aj-
-             oBHqFEHYpPe7Tpe-OfVfHd1E6cS6M1FZcD1NNLYD5lFHpPI9bTwJlsde
-             3uhGqC0ZCuEHg8lhzwOHrtIQbS0FVbb9k3-tVTU4fg_3L_vniUFAKwuC
-             LqKnS2BYwdq_mzSnbLY7h_qixoR7jig3__kRhuaxwUkRz5iaiQkqgc5g
-             HdrNP5zw",
-         "e": "AQAB"
-     }],
-     "keys": [{
-         "kty": "RSA",
-         "kid": "include-me",
-         "use": "sig",
-         "n": "n4EPtAOCc9AlkeQHPzHStgAbgs7bTZLwUBZdR8_KuKPEHLd4rHVTeT
-             -O-XV2jRojdNhxJWTDvNd7nqQ0VEiZQHz_AJmSCpMaJMRBSFKrKb2wqV
-             wGU_NsYOYL-QtiWN2lbzcEe6XC0dApr5ydQLrHqkHHig3RBordaZ6Aj-
-             oBHqFEHYpPe7Tpe-OfVfHd1E6cS6M1FZcD1NNLYD5lFHpPI9bTwJlsde
-             3uhGqC0ZCuEHg8lhzwOHrtIQbS0FVbb9k3-tVTU4fg_3L_vniUFAKwuC
-             LqKnS2BYwdq_mzSnbLY7h_qixoR7jig3__kRhuaxwUkRz5iaiQkqgc5g
-             HdrNP5zw",
-         "e": "AQAB"
-     }],
-     "custom": "exclude-me",
-     "custom": "include-me"
-   }`)
-
-func TestDuplicateJWKSetMembersIgnored(t *testing.T) {
-	type CustomSet struct {
-		JsonWebKeySet
-		CustomMember string `json:"custom"`
-	}
-	data := []byte(JWKSetDuplicates)
-	var set CustomSet
-	UnmarshalJSON(data, &set)
-	if len(set.Keys) != 1 {
-		t.Error("expected only one key in set")
-	}
-	if set.Keys[0].KeyID != "include-me" {
-		t.Errorf("expected key with kid: \"include-me\", got: %s", set.Keys[0].KeyID)
-	}
-	if set.CustomMember != "include-me" {
-		t.Errorf("expected custom member value: \"include-me\", got: %s", set.CustomMember)
-	}
-}
diff --git a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/jwe_test.go b/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/jwe_test.go
deleted file mode 100644
index ab03fd000..000000000
--- a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/jwe_test.go
+++ /dev/null
@@ -1,537 +0,0 @@
-/*-
- * Copyright 2014 Square Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package jose
-
-import (
-	"bytes"
-	"crypto/ecdsa"
-	"crypto/elliptic"
-	"crypto/rsa"
-	"math/big"
-	"testing"
-)
-
-func TestCompactParseJWE(t *testing.T) {
-	// Should parse
-	msg := "eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkExMjhHQ00ifQ.dGVzdA.dGVzdA.dGVzdA.dGVzdA"
-	_, err := ParseEncrypted(msg)
-	if err != nil {
-		t.Error("Unable to parse valid message:", err)
-	}
-
-	// Messages that should fail to parse
-	failures := []string{
-		// Too many parts
-		"eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkExMjhHQ00ifQ.dGVzdA.dGVzdA.dGVzdA.dGVzdA.dGVzdA",
-		// Not enough parts
-		"eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkExMjhHQ00ifQ.dGVzdA.dGVzdA.dGVzdA",
-		// Invalid encrypted key
-		"eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkExMjhHQ00ifQ.//////.dGVzdA.dGVzdA.dGVzdA",
-		// Invalid IV
-		"eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkExMjhHQ00ifQ.dGVzdA.//////.dGVzdA.dGVzdA",
-		// Invalid ciphertext
-		"eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkExMjhHQ00ifQ.dGVzdA.dGVzdA.//////.dGVzdA",
-		// Invalid tag
-		"eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkExMjhHQ00ifQ.dGVzdA.dGVzdA.dGVzdA.//////",
-		// Invalid header
-		"W10.dGVzdA.dGVzdA.dGVzdA.dGVzdA",
-		// Invalid header
-		"######.dGVzdA.dGVzdA.dGVzdA.dGVzdA",
-		// Missing alc/enc params
-		"e30.dGVzdA.dGVzdA.dGVzdA.dGVzdA",
-	}
-
-	for _, msg := range failures {
-		_, err = ParseEncrypted(msg)
-		if err == nil {
-			t.Error("Able to parse invalid message", msg)
-		}
-	}
-}
-
-func TestFullParseJWE(t *testing.T) {
-	// Messages that should succeed to parse
-	successes := []string{
-		// Flattened serialization, single recipient
-		"{\"protected\":\"eyJhbGciOiJYWVoiLCJlbmMiOiJYWVoifQo\",\"encrypted_key\":\"QUJD\",\"iv\":\"QUJD\",\"ciphertext\":\"QUJD\",\"tag\":\"QUJD\"}",
-		// Unflattened serialization, single recipient
-		"{\"protected\":\"\",\"unprotected\":{\"enc\":\"XYZ\"},\"recipients\":[{\"header\":{\"alg\":\"XYZ\"},\"encrypted_key\":\"QUJD\"}],\"iv\":\"QUJD\",\"ciphertext\":\"QUJD\",\"tag\":\"QUJD\"}",
-	}
-
-	for i := range successes {
-		_, err := ParseEncrypted(successes[i])
-		if err != nil {
-			t.Error("Unble to parse valid message", err, successes[i])
-		}
-	}
-
-	// Messages that should fail to parse
-	failures := []string{
-		// Empty
-		"{}",
-		// Invalid JSON
-		"{XX",
-		// Invalid protected header
-		"{\"protected\":\"###\"}",
-		// Invalid protected header
-		"{\"protected\":\"e1gK\"}",
-		// Invalid encrypted key
-		"{\"protected\":\"e30\",\"encrypted_key\":\"###\"}",
-		// Invalid IV
-		"{\"protected\":\"e30\",\"encrypted_key\":\"QUJD\",\"iv\":\"###\"}",
-		// Invalid ciphertext
-		"{\"protected\":\"e30\",\"encrypted_key\":\"QUJD\",\"iv\":\"QUJD\",\"ciphertext\":\"###\"}",
-		// Invalid tag
-		"{\"protected\":\"e30\",\"encrypted_key\":\"QUJD\",\"iv\":\"QUJD\",\"ciphertext\":\"QUJD\",\"tag\":\"###\"}",
-		// Invalid AAD
-		"{\"protected\":\"e30\",\"encrypted_key\":\"QUJD\",\"iv\":\"QUJD\",\"ciphertext\":\"QUJD\",\"tag\":\"QUJD\",\"aad\":\"###\"}",
-		// Missing alg/enc headers
-		"{\"protected\":\"e30\",\"encrypted_key\":\"QUJD\",\"iv\":\"QUJD\",\"ciphertext\":\"QUJD\",\"tag\":\"QUJD\"}",
-		// Missing enc header
-		"{\"protected\":\"eyJhbGciOiJYWVoifQ\",\"encrypted_key\":\"QUJD\",\"iv\":\"QUJD\",\"ciphertext\":\"QUJD\",\"tag\":\"QUJD\"}",
-		// Missing alg header
-		"{\"protected\":\"eyJlbmMiOiJYWVoifQ\",\"encrypted_key\":\"QUJD\",\"iv\":\"QUJD\",\"ciphertext\":\"QUJD\",\"tag\":\"QUJD\"}",
-		// Unflattened serialization, single recipient, invalid encrypted_key
-		"{\"protected\":\"\",\"recipients\":[{\"header\":{\"alg\":\"XYZ\", \"enc\":\"XYZ\"},\"encrypted_key\":\"###\"}],\"iv\":\"QUJD\",\"ciphertext\":\"QUJD\",\"tag\":\"QUJD\"}",
-		// Unflattened serialization, single recipient, missing alg
-		"{\"protected\":\"eyJhbGciOiJYWVoifQ\",\"recipients\":[{\"encrypted_key\":\"QUJD\"}],\"iv\":\"QUJD\",\"ciphertext\":\"QUJD\",\"tag\":\"QUJD\"}",
-	}
-
-	for i := range failures {
-		_, err := ParseEncrypted(failures[i])
-		if err == nil {
-			t.Error("Able to parse invalid message", err, failures[i])
-		}
-	}
-}
-
-func TestMissingInvalidHeaders(t *testing.T) {
-	obj := &JsonWebEncryption{
-		protected:   &rawHeader{Enc: A128GCM},
-		unprotected: &rawHeader{},
-		recipients: []recipientInfo{
-			recipientInfo{},
-		},
-	}
-
-	_, err := obj.Decrypt(nil)
-	if err != ErrUnsupportedKeyType {
-		t.Error("should detect invalid key")
-	}
-
-	obj.unprotected.Crit = []string{"1", "2"}
-
-	_, err = obj.Decrypt(nil)
-	if err == nil {
-		t.Error("should reject message with crit header")
-	}
-
-	obj.unprotected.Crit = nil
-	obj.protected = &rawHeader{Alg: string(RSA1_5)}
-
-	_, err = obj.Decrypt(rsaTestKey)
-	if err == nil || err == ErrCryptoFailure {
-		t.Error("should detect missing enc header")
-	}
-}
-
-func TestRejectUnprotectedJWENonce(t *testing.T) {
-	// No need to test compact, since that's always protected
-
-	// Flattened JSON
-	input := `{
-	"header":  {
-		"alg": "XYZ", "enc": "XYZ",
-		"nonce": "should-cause-an-error"
-	},
-	"encrypted_key": "does-not-matter",
-	"aad": "does-not-matter",
-	"iv": "does-not-matter",
-	"ciphertext": "does-not-matter",
-	"tag": "does-not-matter"
-	}`
-	_, err := ParseEncrypted(input)
-	if err == nil {
-		t.Error("JWE with an unprotected nonce parsed as valid.")
-	} else if err.Error() != "square/go-jose: Nonce parameter included in unprotected header" {
-		t.Errorf("Improper error for unprotected nonce: %v", err)
-	}
-
-	input = `{
-		"unprotected":  {
-			"alg": "XYZ", "enc": "XYZ",
-			"nonce": "should-cause-an-error"
-		},
-		"encrypted_key": "does-not-matter",
-		"aad": "does-not-matter",
-		"iv": "does-not-matter",
-		"ciphertext": "does-not-matter",
-		"tag": "does-not-matter"
-	}`
-	_, err = ParseEncrypted(input)
-	if err == nil {
-		t.Error("JWE with an unprotected nonce parsed as valid.")
-	} else if err.Error() != "square/go-jose: Nonce parameter included in unprotected header" {
-		t.Errorf("Improper error for unprotected nonce: %v", err)
-	}
-
-	// Full JSON
-	input = `{
-		"header":  { "alg": "XYZ", "enc": "XYZ" },
-		"aad": "does-not-matter",
-		"iv": "does-not-matter",
-		"ciphertext": "does-not-matter",
-		"tag": "does-not-matter",
-		"recipients": [{
-			"header": { "nonce": "should-cause-an-error" },
-			"encrypted_key": "does-not-matter"
-		}]
-	}`
-	_, err = ParseEncrypted(input)
-	if err == nil {
-		t.Error("JWS with an unprotected nonce parsed as valid.")
-	} else if err.Error() != "square/go-jose: Nonce parameter included in unprotected header" {
-		t.Errorf("Improper error for unprotected nonce: %v", err)
-	}
-}
-
-func TestCompactSerialize(t *testing.T) {
-	// Compact serialization must fail if we have unprotected headers
-	obj := &JsonWebEncryption{
-		unprotected: &rawHeader{Alg: "XYZ"},
-	}
-
-	_, err := obj.CompactSerialize()
-	if err == nil {
-		t.Error("Object with unprotected headers can't be compact serialized")
-	}
-}
-
-func TestVectorsJWE(t *testing.T) {
-	plaintext := []byte("The true sign of intelligence is not knowledge but imagination.")
-
-	publicKey := &rsa.PublicKey{
-		N: fromBase64Int(`
-			oahUIoWw0K0usKNuOR6H4wkf4oBUXHTxRvgb48E-BVvxkeDNjbC4he8rUW
-			cJoZmds2h7M70imEVhRU5djINXtqllXI4DFqcI1DgjT9LewND8MW2Krf3S
-			psk_ZkoFnilakGygTwpZ3uesH-PFABNIUYpOiN15dsQRkgr0vEhxN92i2a
-			sbOenSZeyaxziK72UwxrrKoExv6kc5twXTq4h-QChLOln0_mtUZwfsRaMS
-			tPs6mS6XrgxnxbWhojf663tuEQueGC-FCMfra36C9knDFGzKsNa7LZK2dj
-			YgyD3JR_MB_4NUJW_TqOQtwHYbxevoJArm-L5StowjzGy-_bq6Gw`),
-		E: 65537,
-	}
-
-	expectedCompact := stripWhitespace(`
-		eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkEyNTZHQ00ifQ.ROQCfge4JPm_
-		yACxv1C1NSXmwNbL6kvmCuyxBRGpW57DvlwByjyjsb6g8m7wtLMqKEyhFCn
-		tV7sjippEePIlKln6BvVnz5ZLXHNYQgmubuNq8MC0KTwcaGJ_C0z_T8j4PZ
-		a1nfpbhSe-ePYaALrf_nIsSRKu7cWsrwOSlaRPecRnYeDd_ytAxEQWYEKFi
-		Pszc70fP9geZOB_09y9jq0vaOF0jGmpIAmgk71lCcUpSdrhNokTKo5y8MH8
-		3NcbIvmuZ51cjXQj1f0_AwM9RW3oCh2Hu0z0C5l4BujZVsDuGgMsGZsjUhS
-		RZsAQSXHCAmlJ2NlnN60U7y4SPJhKv5tKYw.48V1_ALb6US04U3b.5eym8T
-		W_c8SuK0ltJ3rpYIzOeDQz7TALvtu6UG9oMo4vpzs9tX_EFShS8iB7j6jiS
-		diwkIr3ajwQzaBtQD_A.XFBoMYUZodetZdvTiFvSkQ`)
-
-	expectedFull := stripWhitespace(`
-		{ "protected":"eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkEyNTZHQ00ifQ",
-		"encrypted_key":
-			"ROQCfge4JPm_yACxv1C1NSXmwNbL6kvmCuyxBRGpW57DvlwByjyjsb
-			 6g8m7wtLMqKEyhFCntV7sjippEePIlKln6BvVnz5ZLXHNYQgmubuNq
-			 8MC0KTwcaGJ_C0z_T8j4PZa1nfpbhSe-ePYaALrf_nIsSRKu7cWsrw
-			 OSlaRPecRnYeDd_ytAxEQWYEKFiPszc70fP9geZOB_09y9jq0vaOF0
-			 jGmpIAmgk71lCcUpSdrhNokTKo5y8MH83NcbIvmuZ51cjXQj1f0_Aw
-			 M9RW3oCh2Hu0z0C5l4BujZVsDuGgMsGZsjUhSRZsAQSXHCAmlJ2Nln
-			 N60U7y4SPJhKv5tKYw",
-		"iv": "48V1_ALb6US04U3b",
-		"ciphertext":
-			"5eym8TW_c8SuK0ltJ3rpYIzOeDQz7TALvtu6UG9oMo4vpzs9tX_EFS
-			 hS8iB7j6jiSdiwkIr3ajwQzaBtQD_A",
-		"tag":"XFBoMYUZodetZdvTiFvSkQ" }`)
-
-	// Mock random reader
-	randReader = bytes.NewReader([]byte{
-		// Encryption key
-		177, 161, 244, 128, 84, 143, 225, 115, 63, 180, 3, 255, 107, 154,
-		212, 246, 138, 7, 110, 91, 112, 46, 34, 105, 47, 130, 203, 46, 122,
-		234, 64, 252,
-		// Randomness for RSA-OAEP
-		0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-		// Initialization vector
-		227, 197, 117, 252, 2, 219, 233, 68, 180, 225, 77, 219})
-	defer resetRandReader()
-
-	// Encrypt with a dummy key
-	encrypter, err := NewEncrypter(RSA_OAEP, A256GCM, publicKey)
-	if err != nil {
-		panic(err)
-	}
-
-	object, err := encrypter.Encrypt(plaintext)
-	if err != nil {
-		panic(err)
-	}
-
-	serialized, err := object.CompactSerialize()
-	if serialized != expectedCompact {
-		t.Error("Compact serialization is not what we expected", serialized, expectedCompact)
-	}
-
-	serialized = object.FullSerialize()
-	if serialized != expectedFull {
-		t.Error("Full serialization is not what we expected")
-	}
-}
-
-func TestVectorsJWECorrupt(t *testing.T) {
-	priv := &rsa.PrivateKey{
-		PublicKey: rsa.PublicKey{
-			N: fromHexInt(`
-				a8b3b284af8eb50b387034a860f146c4919f318763cd6c5598c8
-				ae4811a1e0abc4c7e0b082d693a5e7fced675cf4668512772c0c
-				bc64a742c6c630f533c8cc72f62ae833c40bf25842e984bb78bd
-				bf97c0107d55bdb662f5c4e0fab9845cb5148ef7392dd3aaff93
-				ae1e6b667bb3d4247616d4f5ba10d4cfd226de88d39f16fb`),
-			E: 65537,
-		},
-		D: fromHexInt(`
-				53339cfdb79fc8466a655c7316aca85c55fd8f6dd898fdaf1195
-				17ef4f52e8fd8e258df93fee180fa0e4ab29693cd83b152a553d
-				4ac4d1812b8b9fa5af0e7f55fe7304df41570926f3311f15c4d6
-				5a732c483116ee3d3d2d0af3549ad9bf7cbfb78ad884f84d5beb
-				04724dc7369b31def37d0cf539e9cfcdd3de653729ead5d1`),
-		Primes: []*big.Int{
-			fromHexInt(`
-				d32737e7267ffe1341b2d5c0d150a81b586fb3132bed2f8d5262
-				864a9cb9f30af38be448598d413a172efb802c21acf1c11c520c
-				2f26a471dcad212eac7ca39d`),
-			fromHexInt(`
-				cc8853d1d54da630fac004f471f281c7b8982d8224a490edbeb3
-				3d3e3d5cc93c4765703d1dd791642f1f116a0dd852be2419b2af
-				72bfe9a030e860b0288b5d77`),
-		},
-	}
-
-	corruptCiphertext := stripWhitespace(`
-		eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkExMjhHQ00ifQ.NFl09dehy
-		IR2Oh5iSsvEa82Ps7DLjRHeo0RnuTuSR45OsaIP6U8yu7vLlWaZKSZMy
-		B2qRBSujf-5XIRoNhtyIyjk81eJRXGa_Bxaor1XBCMyyhGchW2H2P71f
-		PhDO6ufSC7kV4bNqgHR-4ziS7KXwzN83_5kogXqxUpymUoJDNc.tk-GT
-		W_VVhiTIKFF.D_BE6ImZUl9F.52a-zFnRb3YQwIC7UrhVyQ`)
-
-	corruptAuthtag := stripWhitespace(`
-		eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkExMjhHQ00ifQ.NFl09dehy
-		IR2Oh5iSsvEa82Ps7DLjRHeo0RnuTuSR45OsaIP6U8yu7vLlWaZKSZMy
-		B2qRBSujf-5XIRoNhtyIyjk81eJRXGa_Bxaor1XBCMyyhGchW2H2P71f
-		PhDO6ufSC7kV4bNqgHR-4ziS7KNwzN83_5kogXqxUpymUoJDNc.tk-GT
-		W_VVhiTIKFF.D_BE6ImZUl9F.52a-zFnRb3YQwiC7UrhVyQ`)
-
-	msg, _ := ParseEncrypted(corruptCiphertext)
-	_, err := msg.Decrypt(priv)
-	if err != ErrCryptoFailure {
-		t.Error("should detect corrupt ciphertext")
-	}
-
-	msg, _ = ParseEncrypted(corruptAuthtag)
-	_, err = msg.Decrypt(priv)
-	if err != ErrCryptoFailure {
-		t.Error("should detect corrupt auth tag")
-	}
-}
-
-// Test vectors generated with nimbus-jose-jwt
-func TestSampleNimbusJWEMessagesRSA(t *testing.T) {
-	rsaPrivateKey, err := LoadPrivateKey(fromBase64Bytes(`
-		MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCNRCEmf5PlbXKuT4uwnb
-		wGKvFrtpi+bDYxOZxxqxdVkZM/bYATAnD1fg9pNvLMKeF+MWJ9kPIMmDgOh9RdnRdLvQGb
-		BzhLmxwhhcua2QYiHEZizXmiaXvNP12bzEBhebdX7ObW8izMVW0p0lqHPNzkK3K75B0Sxo
-		FMVKkZ7KtBHgepBT5yPhPPcNe5lXQeTne5bo3I60DRcN9jTBgMJOXdq0I9o4y6ZmoXdNTm
-		0EyLzn9/EYiHqBxtKFh791EHR7wYgyi/t+nOKr4sO74NbEByP0mHDil+mPvZSzFW4l7fPx
-		OclRZvpRIKIub2TroZA9s2WsshGf79eqqXYbBB9NNRAgMBAAECggEAIExbZ/nzTplfhwsY
-		3SCzRJW87OuqsJ79JPQPGM4NX7sQ94eJqM7+FKLl0yCFErjgnYGdCyiArvB+oJPdsimgke
-		h83X0hGeg03lVA3/6OsG3WifCAxulnLN44AM8KST8S9D9t5+cm5vEBLHazzAfWWTS13s+g
-		9hH8rf8NSqgZ36EutjKlvLdHx1mWcKX7SREFVHT8FWPAbdhTLEHUjoWHrfSektnczaSHnt
-		q8fFJy6Ld13QkF1ZJRUhtA24XrD+qLTc+M36IuedjeZaLHFB+KyhYR3YvXEtrbCug7dCRd
-		uG6uTlDCSaSy7xHeTPolWtWo9F202jal54otxiAJFGUHgQKBgQDRAT0s6YQZUfwE0wluXV
-		k0JdhDdCo8sC1aMmKlRKWUkBAqrDl7BI3MF56VOr4ybr90buuscshFf9TtrtBOjHSGcfDI
-		tSKfhhkW5ewQKB0YqyHzoD6UKT0/XAshFY3esc3uCxuJ/6vOiXV0og9o7eFvr51O0TfDFh
-		mcTvW4wirKlQKBgQCtB7UAu8I9Nn8czkd6oXLDRyTWYviuiqFmxR+PM9klgZtsumkeSxO1
-		lkfFoj9+G8nFaqYEBA9sPeNtJVTSROCvj/iQtoqpV2NiI/wWeVszpBwsswx2mlks4LJa8a
-		Yz9xrsfNoroKYVppefc/MCoSx4M+99RSm3FSpLGZQHAUGyzQKBgQDMQmq4JuuMF1y2lk0E
-		SESyuz21BqV0tDVOjilsHT+5hmXWXoS6nkO6L2czrrpM7YE82F6JJZBmo7zEIXHBInGLJ3
-		XLoYLZ5qNEhqYDUEDHaBCBWZ1vDTKnZlwWFEuXVavNNZvPbUhKTHq25t8qjDki/r09Vykp
-		BsM2yNBKpbBOVQKBgCJyUVd3CaFUExQyAMrqD0XPCQdhJq7gzGcAQVsp8EXmOoH3zmuIeM
-		ECzQEMXuWFNLMHm0tbX5Kl83vMHcnKioyI9ewhWxOBYTitf0ceG8j5F97SOl32NmCXzwoJ
-		55Oa0xJXfLuIvOe8hZzp4WwZmBfKBxiCR166aPQQgIawelrVAoGAEJsHomfCI4epxH4oMw
-		qYJMCGy95zloB+2+c86BZCOJAGwnfzbtc2eutWZw61/9sSO8sQCfzA8oX+5HwAgnFVzwW4
-		lNMZohppYcpwN9EyjkPaCXuALC7p5rF2o63wY7JLvnjS2aYZliknh2yW6X6fSB0PK0Cpvd
-		lAIyRw6Kud0zI=`))
-	if err != nil {
-		panic(err)
-	}
-
-	rsaSampleMessages := []string{
-		"eyJlbmMiOiJBMTI4R0NNIiwiYWxnIjoiUlNBMV81In0.EW0KOhHeoAxTBnLjYhh2T6HjwI-srNs6RpcSdZvE-GJ5iww3EYWBCmeGGj1UVz6OcBfwW3wllZ6GPOHU-hxVQH5KYpVOjkmrFIYU6-8BHhxBP_PjSJEBCZzjOgsCm9Th4-zmlO7UWTdK_UtwE7nk4X-kkmEy-aZBCShA8nFe2MVvqD5F7nvEWNFBOHh8ae_juo-kvycoIzvxLV9g1B0Zn8K9FAlu8YF1KiL5NFekn76f3jvAwlExuRbFPUx4gJN6CeBDK_D57ABsY2aBVDSiQceuYZxvCIAajqSS6dMT382FNJzAiQhToOpo_1w5FnnBjzJLLEKDk_I-Eo2YCWxxsQ.5mCMuxJqLRuPXGAr.Ghe4INeBhP3MDWGvyNko7qanKdZIzKjfeiU.ja3UlVWJXKNFJ-rZsJWycw",
-		"eyJlbmMiOiJBMTkyR0NNIiwiYWxnIjoiUlNBMV81In0.JsJeYoP0St1bRYNUaAmA34DAA27usE7RNuC2grGikBRmh1xrwUOpnEIXXpwr7fjVmNi52zzWkNHC8JkkRTrLcCh2VXvnOnarpH8DCr9qM6440bSrahzbxIvDds8z8q0wT1W4kjVnq1mGwGxg8RQNBWTV6Sp2FLQkZyjzt_aXsgYzr3zEmLZxB-d41lBS81Mguk_hdFJIg_WO4ao54lozvxkCn_uMiIZ8eLb8qHy0h-N21tiHGCaiC2vV8KXomwoqbJ0SXrEH4r9_R2J844H80TBZdbvNBd8whvoQNHvOX659LNs9EQ9xxvHU2kqGZekXBu7sDXXTjctMkMITobGSzw.1v5govaDvanP3LGp.llwYNBDrD7MwVLaFHesljlratfmndWs4XPQ.ZGT1zk9_yIKi2GzW6CuAyA",
-		"eyJlbmMiOiJBMjU2R0NNIiwiYWxnIjoiUlNBMV81In0.fBv3fA3TMS3ML8vlsCuvwdsKvB0ym8R30jJrlOiqkWKk7WVUkjDInFzr1zw3Owla6c5BqOJNoACXt4IWbkLbkoWV3tweXlWwpafuaWPkjLOUH_K31rS2fCX5x-MTj8_hScquVQXpbz3vk2EfulRmGXZc_8JU2NqQCAsYy3a28houqP3rDe5jEAvZS2SOFvJkKW--f5S-z39t1D7fNz1N8Btd9SmXWQzjbul5YNxI9ctqxhJpkKYpxOLlvrzdA6YdJjOlDx3n6S-HnSZGM6kQd_xKtAf8l1EGwhQmhbXhMhjVxMvGwE5BX7PAb8Ccde5bzOCJx-PVbVetuLb169ZYqQ._jiZbOPRR82FEWMZ.88j68LI-K2KT6FMBEdlz6amG5nvaJU8a-90.EnEbUTJsWNqJYKzfO0x4Yw",
-		"eyJlbmMiOiJBMTI4Q0JDLUhTMjU2IiwiYWxnIjoiUlNBMV81In0.bN6FN0qmGxhkESiVukrCaDVG3woL0xE-0bHN_Mu0WZXTQWbzzT-7jOvaN1xhGK8nzi8qpCSRgE5onONNB9i8OnJm3MMIxF7bUUEAXO9SUAFn2v--wNc4drPc5OjIu0RiJrDVDkkGjNrBDIuBaEQcke7A0v91PH58dXE7o4TLPzC8UJmRtXWhUSwjXVF3-UmYRMht2rjHJlvRbtm6Tu2LMBIopRL0zj6tlPP4Dm7I7sz9OEB3VahYAhpXnFR7D_f8RjLSXQmBvB1FiI5l_vMz2NFt2hYUmQF3EJMLIEdHvvPp3iHDGiXC1obJrDID_CCf3qs9UY7DMYL622KLvP2NIg.qb72oxECzxd_aNuHVR0aNg.Gwet9Ms8hB8rKEb0h4RGdFNRq97Qs2LQaJM0HWrCqoI.03ljVThOFvgXzMmQJ79VjQ",
-		"eyJlbmMiOiJBMTkyQ0JDLUhTMzg0IiwiYWxnIjoiUlNBMV81In0.ZbEOP6rqdiIP4g7Nl1PL5gwhgDwv9RinyiUQxZXPOmD7kwEZrZ093dJnhqI9kEd3QGFlHDpB7HgNz53d27z2zmEj1-27v6miizq6tH4sN2MoeZLwSyk16O1_n3bVdDmROawsTYYFJfHsuLwyVJxPd37duIYnbUCFO9J8lLIv-2VI50KJ1t47YfE4P-Wt9jVzxP2CVUQaJwTlcwfiDLJTagYmfyrDjf525WlQFlgfJGqsJKp8BX9gmKvAo-1iCBAM8VpEjS0u0_hW9VSye36yh8BthVV-VJkhJ-0tMpto3bbBmj7M25Xf4gbTrrVU7Nz6wb18YZuhHZWmj2Y2nHV6Jg.AjnS44blTrIIfFlqVw0_Mg.muCRgaEXNKKpW8rMfW7jf7Zpn3VwSYDz-JTRg16jZxY.qjc9OGlMaaWKDWQSIwVpR4K556Pp6SF9",
-		"eyJlbmMiOiJBMjU2Q0JDLUhTNTEyIiwiYWxnIjoiUlNBMV81In0.c7_F1lMlRHQQE3WbKmtHBYTosdZrG9hPfs-F9gNQYet61zKG8NXVkSy0Zf2UFHt0vhcO8hP2qrqOFsy7vmRj20xnGHQ2EE29HH6hwX5bx1Jj3uE5WT9Gvh0OewpvF9VubbwWTIObBpdEG7XdJsMAQlIxtXUmQYAtLTWcy2ZJipyJtVlWQLaPuE8BKfZH-XAsp2CpQNiRPI8Ftza3EAspiyRfVQbjKt7nF8nuZ2sESjt7Y50q4CSiiCuGT28T3diMN0_rWrH-I-xx7OQvJlrQaNGglGtu3jKUcrJDcvxW2e1OxriaTeuQ848ayuRvGUNeSv6WoVYmkiK1x_gNwUAAbw.7XtSqHJA7kjt6JrfxJMwiA.Yvi4qukAbdT-k-Fd2s4G8xzL4VFxaFC0ZIzgFDAI6n0.JSWPJ-HjOE3SK9Lm0yHclmjS7Z1ahtQga9FHGCWVRcc",
-		"eyJlbmMiOiJBMTI4R0NNIiwiYWxnIjoiUlNBLU9BRVAifQ.SYVxJbCnJ_tcR13LJpaqHQj-nGNkMxre4A1FmnUdxnvzeJwuvyrLiUdRsZR1IkP4fqLtDON2mumx39QeJQf0WIObPBYlIxycRLkwxDHRVlyTmPvdZHAxN26jPrk09wa5SgK1UF1W1VSQIPm-Tek8jNAmarF1Yxzxl-t54wZFlQiHP4TuaczugO5f-J4nlWenfla2mU1snDgdUMlEZGOAQ_gTEtwSgd1MqXmK_7LZBkoDqqoCujMZhziafJPXPDaUUqBLW3hHkkDA7GpVec3XcTtNUWQJqOpMyQhqo1KQMc8jg3fuirILp-hjvvNVtBnCRBvbrKUCPzu2_yH3HM_agA.2VsdijtonAxShNIW.QzzB3P9CxYP3foNKN0Ma1Z9tMwijAlkWo08.ZdQkIPDY_M-hxqi5fD4NGw",
-		"eyJlbmMiOiJBMTkyR0NNIiwiYWxnIjoiUlNBLU9BRVAifQ.Z2oTJXXib1u-S38Vn3DRKE3JnhnwgUa92UhsefzY2Wpdn0dmxMfYt9iRoJGFfSAcA97MOfjyvXVRCKWXGrG5AZCMAXEqU8SNQwKPRjlcqojcVzQyMucXI0ikLC4mUgeRlfKTwsBicq6JZZylzRoLGGSNJQbni3_BLsf7H3Qor0BYg0FPCLG9Z2OVvrFzvjTLmZtV6gFlVrMHBxJub_aUet9gAkxiu1Wx_Kx46TlLX2tkumXIpTGlzX6pef6jLeZ5EIg_K-Uz4tkWgWQIEkLD7qmTyk5pAGmzukHa_08jIh5-U-Sd8XGZdx4J1pVPJ5CPg0qDJGZ_cfgkgpWbP_wB6A.4qgKfokK1EwYxz20._Md82bv_KH2Vru0Ue2Eb6oAqHP2xBBP5jF8.WFRojvQpD5VmZlOr_dN0rQ",
-		"eyJlbmMiOiJBMjU2R0NNIiwiYWxnIjoiUlNBLU9BRVAifQ.JzCUgJcBJmBgByp4PBAABUfhezPvndxBIVzaoZ96DAS0HPni0OjMbsOGsz6JwNsiTr1gSn_S6R1WpZM8GJc9R2z0EKKVP67TR62ZSG0MEWyLpHmG_4ug0fAp1HWWMa9bT4ApSaOLgwlpVAb_-BPZZgIu6c8cREuMon6UBHDqW1euTBbzk8zix3-FTZ6p5b_3soDL1wXfRiRBEsxxUGMnpryx1OFb8Od0JdyGF0GgfLt6OoaujDJpo-XtLRawu1Xlg6GqRs0NQwSHZ5jXgQ6-zgCufXonAmYTiIyBXY2no9XmECTexjwrS_05nA7H-UyIZEBOCp3Yhz2zxrt5j_0pvQ.SJR-ghhaUKP4zXtZ.muiuzLfZA0y0BDNsroGTw2r2-l73SLf9lK8.XFMH1oHr1G6ByP3dWSUUPA",
-		"eyJlbmMiOiJBMTI4Q0JDLUhTMjU2IiwiYWxnIjoiUlNBLU9BRVAifQ.U946MVfIm4Dpk_86HrnIA-QXyiUu0LZ67PL93CMLmEtJemMNDqmRd9fXyenCIhAC7jPIV1aaqW7gS194xyrrnUpBoJBdbegiPqOfquy493Iq_GQ8OXnFxFibPNQ6rU0l8BwIfh28ei_VIF2jqN6bhxFURCVW7fG6n6zkCCuEyc7IcxWafSHjH2FNttREuVj-jS-4LYDZsFzSKbpqoYF6mHt8H3btNEZDTSmy_6v0fV1foNtUKNfWopCp-iE4hNh4EzJfDuU8eXLhDb03aoOockrUiUCh-E0tQx9su4rOv-mDEOHHAQK7swm5etxoa7__9PC3Hg97_p4GM9gC9ykNgw.pnXwvoSPi0kMQP54of-HGg.RPJt1CMWs1nyotx1fOIfZ8760mYQ69HlyDp3XmdVsZ8.Yxw2iPVWaBROFE_FGbvodA",
-		"eyJlbmMiOiJBMTkyQ0JDLUhTMzg0IiwiYWxnIjoiUlNBLU9BRVAifQ.eKEOIJUJpXmO_ghH_nGCJmoEspqKyiy3D5l0P8lKutlo8AuYHPQlgOsaFYnDkypyUVWd9zi-JaQuCeo7dzoBiS1L71nAZo-SUoN0anQBkVuyuRjr-deJMhPPfq1H86tTk-4rKzPr1Ivd2RGXMtWsrUpNGk81r1v8DdMntLE7UxZQqT34ONuZg1IXnD_U6di7k07unI29zuU1ySeUr6w1YPw5aUDErMlpZcEJWrgOEYWaS2nuC8sWGlPGYEjqkACMFGn-y40UoS_JatNZO6gHK3SKZnXD7vN5NAaMo_mFNbh50e1t_zO8DaUdLtXPOBLcx_ULoteNd9H8HyDGWqwAPw.0xmtzJfeVMoIT1Cp68QrXA.841l1aA4c3uvSYfw6l180gn5JZQjL53WQ5fr8ejtvoI.lojzeWql_3gDq-AoaIbl_aGQRH_54w_f",
-		"eyJlbmMiOiJBMjU2Q0JDLUhTNTEyIiwiYWxnIjoiUlNBLU9BRVAifQ.D0QkvIXR1TL7dIHWuPNMybmmD8UPyQd1bRKjRDNbA2HmKGpamCtcJmpNB_EetNFe-LDmhe44BYI_XN2wIBbYURKgDK_WG9BH0LQw_nCVqQ-sKqjtj3yQeytXhLHYTDmiF0TO-uW-RFR7GbPAdARBfuf4zj82r_wDD9sD5WSCGx89iPfozDOYQ_OLwdL2WD99VvDyfwS3ZhxA-9IMSYv5pwqPkxj4C0JdjCqrN0YNrZn_1ORgjtsVmcWXsmusObTozUGA7n5GeVepfZdU1vrMulAwdRYqOYtlqKaOpFowe9xFN3ncBG7wb4f9pmzbS_Dgt-1_Ii_4SEB9GQ4NiuBZ0w.N4AZeCxMGUv52A0UVJsaZw.5eHOGbZdtahnp3l_PDY-YojYib4ft4SRmdsQ2kggrTs.WsmGH8ZDv4ctBFs7qsQvw2obe4dVToRcAQaZ3PYL34E",
-		"eyJlbmMiOiJBMTI4R0NNIiwiYWxnIjoiUlNBLU9BRVAtMjU2In0.fDTxO_ZzZ3Jdrdw-bxvg7u-xWB2q1tp3kI5zH6JfhLUm4h6rt9qDA_wZlRym8-GzEtkUjkTtQGs6HgQx_qlyy8ylCakY5GHsNhCG4m0UNhRiNfcasAs03JSXfON9-tfTJimWD9n4k5OHHhvcrsCW1G3jYeLsK9WHCGRIhNz5ULbo8HBrCTbmZ6bOEQ9mqhdssLpdV24HDpebotf3bgPJqoaTfWU6Uy7tLmPiNuuNRLQ-iTpLyNMTVvGqqZhpcV3lAEN5l77QabI5xLJYucvYjrXQhAEZ7YXO8oRYhGkdG2XXIRcwr87rBeRH-47HAyhZgF_PBPBhhrJNS9UNMqdfBw.FvU4_s7Md6vxnXWd.fw29Q4_gHt4f026DPPV-CNebQ8plJ6IVLX8._apBZrw7WsT8HOmxgCrTwA",
-		"eyJlbmMiOiJBMTkyR0NNIiwiYWxnIjoiUlNBLU9BRVAtMjU2In0.bYuorK-rHMbO4c2CRWtvyOEaM1EN-o-wLRZ0wFWRX9mCXQ-iTNarZn7ksYM1XnGmZ4u3CSowX1Hpca9Rg72_VJCmKapqCT7r3YfasN4_oeLwuSKI_gT-uVOznod97tn3Gf_EDv0y1V4H0k9BEIFGbajAcG1znTD_ODY3j2KZJxisfrsBoslc6N-HI0kKZMC2hSGuHOcOf8HN1sTE-BLqZCtoj-zxQECJK8Wh14Ih4jzzdmmiu_qmSR780K6su-4PRt3j8uY7oCiLBfwpCsCmhJgp8rKd91zoedZmamfvX38mJIfE52j4fG6HmIYw9Ov814fk9OffV6tzixjcg54Q2g.yeVJz4aSh2s-GUr9.TBzzWP5llEiDdugpP2SmPf2U4MEGG9EoPWk.g25UoWpsBaOd45J__FX7mA",
-		"eyJlbmMiOiJBMjU2R0NNIiwiYWxnIjoiUlNBLU9BRVAtMjU2In0.h9tFtmh762JuffBxlSQbJujCyI4Zs9yc3IOb1yR8g65W4ZHosIvzVGHWbShj4EY9MNrz-RbKtHfqQGGzDeo3Xb4-HcQ2ZDHyWoUg7VfA8JafJ5zIKL1npz8eUExOVMLsAaRfHg8qNfczodg3egoSmX5Q-nrx4DeidDSXYZaZjV0C72stLTPcuQ7XPV7z1tvERAkqpvcsRmJn_PiRNxIbAgoyHMJ4Gijuzt1bWZwezlxYmw0TEuwCTVC2fl9NJTZyxOntS1Lcm-WQGlPkVYeVgYTOQXLlp7tF9t-aAvYpth2oWGT6Y-hbPrjx_19WaKD0XyWCR46V32DlXEVDP3Xl2A.NUgfnzQyEaJjzt9r.k2To43B2YVWMeR-w3n4Pr2b5wYq2o87giHk.X8_QYCg0IGnn1pJqe8p_KA",
-		"eyJlbmMiOiJBMTI4Q0JDLUhTMjU2IiwiYWxnIjoiUlNBLU9BRVAtMjU2In0.EDq6cNP6Yp1sds5HZ4CkXYp7bs9plIYVZScKvuyxUy0H1VyBC_YWg0HvndPNb-vwh1LA6KMxRazlOwJ9iPR9YzHnYmGgPM3Je_ZzBfiPlRfq6hQBpGnNaypBI1XZ2tyFBhulsVLqyJe2SmM2Ud00kasOdMYgcN8FNFzq7IOE7E0FUQkIwLdUL1nrzepiYDp-5bGkxWRcL02cYfdqdm00G4m0GkUxAmdxa3oPNxZlt2NeBI_UVWQSgJE-DJVJQkDcyA0id27TV2RCDnmujYauNT_wYlyb0bFDx3pYzzNXfAXd4wHZxt75QaLZ5APJ0EVfiXJ0qki6kT-GRVmOimUbQA.vTULZL7LvS0WD8kR8ZUtLg.mb2f0StEmmkuuvsyz8UplMvF58FtZzlu8eEwzvPUvN0.hbhveEN40V-pgG2hSVgyKg",
-		"eyJlbmMiOiJBMTkyQ0JDLUhTMzg0IiwiYWxnIjoiUlNBLU9BRVAtMjU2In0.DuYk92p7u-YIN-JKn-XThmlVcnhU9x5TieQ2uhsLQVNlo0iWC9JJPP6bT6aI6u_1BIS3yE8_tSGGL7eM-zyEk6LuTqSWFRaZcZC06d0MnS9eYZcw1T2D17fL-ki-NtCaTahJD7jE2s0HevRVW49YtL-_V8whnO_EyVjvXIAQlPYqhH_o-0Nzcpng9ggdAnuF2rY1_6iRPYFJ3BLQvG1oWhyJ9s6SBttlOa0i6mmFCVLHx6sRpdGAB3lbCL3wfmHq4tpIv77gfoYUNP0SNff-zNmBXF_wp3dCntLZFTjbfMpGyHlruF_uoaLqwdjYpUGNUFVUoeSiMnSbMKm9NxiDgQ.6Mdgcqz7bMU1UeoAwFC8pg.W36QWOlBaJezakUX5FMZzbAgeAu_R14AYKZCQmuhguw.5OeyIJ03olxmJft8uBmjuOFQPWNZMYLI",
-		"eyJlbmMiOiJBMjU2Q0JDLUhTNTEyIiwiYWxnIjoiUlNBLU9BRVAtMjU2In0.ECulJArWFsPL2FlpCN0W8E7IseSjJg1cZqE3wz5jk9gvwgNForAUEv5KYZqhNI-p5IxkGV0f8K6Y2X8pWzbLwiPIjZe8_dVqHYJoINxqCSgWLBhz0V36qL9Nc_xARTBk4-ZteIu75NoXVeos9gNvFnkOCj4tm-jGo8z8EFO9XfODgjhiR4xv8VqUtvrkjo9GQConaga5zpV-J4JQlXbdqbDjnuwacnJAxYpFyuemqcgqsl6BnFX3tovGkmSUPqcvF1A6tiHqr-TEmcgVqo5C3xswknRBKTQRM00iAmJ92WlVdkoOCx6E6O7cVHFawZ14BLzWzm66Crb4tv0ucYvk_Q.mxolwUaoj5S5kHCfph0w8g.nFpgYdnYg3blHCCEi2XXQGkkKQBXs2OkZaH11m3PRvk.k8BAVT4EcyrUFVIKr-KOSPbF89xyL0Vri2rFTu2iIWM",
-	}
-
-	for _, msg := range rsaSampleMessages {
-		obj, err := ParseEncrypted(msg)
-		if err != nil {
-			t.Error("unable to parse message", msg, err)
-			continue
-		}
-		plaintext, err := obj.Decrypt(rsaPrivateKey)
-		if err != nil {
-			t.Error("unable to decrypt message", msg, err)
-			continue
-		}
-		if string(plaintext) != "Lorem ipsum dolor sit amet" {
-			t.Error("plaintext is not what we expected for msg", msg)
-		}
-	}
-}
-
-// Test vectors generated with nimbus-jose-jwt
-func TestSampleNimbusJWEMessagesAESKW(t *testing.T) {
-	aesTestKeys := [][]byte{
-		fromHexBytes("DF1FA4F36FFA7FC42C81D4B3C033928D"),
-		fromHexBytes("DF1FA4F36FFA7FC42C81D4B3C033928D95EC9CDC2D82233C"),
-		fromHexBytes("DF1FA4F36FFA7FC42C81D4B3C033928D95EC9CDC2D82233C333C35BA29044E90"),
-	}
-
-	aesSampleMessages := [][]string{
-		[]string{
-			"eyJ6aXAiOiJERUYiLCJlbmMiOiJBMTI4R0NNIiwidGFnIjoib2ZMd2Q5NGloVWFRckJ0T1pQUDdjUSIsImFsZyI6IkExMjhHQ01LVyIsIml2IjoiV2Z3TnN5cjEwWUFjY2p2diJ9.9x3RxdqIS6P9xjh93Eu1bQ.6fs3_fSGt2jull_5.YDlzr6sWACkFg_GU5MEc-ZEWxNLwI_JMKe_jFA.f-pq-V7rlSSg_q2e1gDygw",
-			"eyJ6aXAiOiJERUYiLCJlbmMiOiJBMTkyR0NNIiwidGFnIjoic2RneXB1ckFjTEFzTmZJU0lkZUNpUSIsImFsZyI6IkExMjhHQ01LVyIsIml2IjoieVFMR0dCdDJFZ0c1THdyViJ9.arslKo4aKlh6f4s0z1_-U-8JbmhAoZHN.Xw2Q-GX98YXwuc4i.halTEWMWAYZbv-qOD52G6bte4x6sxlh1_VpGEA.Z1spn016v58cW6Q2o0Qxag",
-			"eyJ6aXAiOiJERUYiLCJlbmMiOiJBMjU2R0NNIiwidGFnIjoicTNzejF5VUlhbVBDYXJfZ05kSVJqQSIsImFsZyI6IkExMjhHQ01LVyIsIml2IjoiM0ZRM0FsLWJWdWhmcEIyQyJ9.dhVipWbzIdsINttuZM4hnjpHvwEHf0VsVrOp4GAg01g.dk7dUyt1Qj13Pipw.5Tt70ONATF0BZAS8dBkYmCV7AQUrfb8qmKNLmw.A6ton9MQjZg0b3C0QcW-hg",
-			"eyJ6aXAiOiJERUYiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2IiwidGFnIjoiUHNpTGphZnJZNE16UlRmNlBPLTZfdyIsImFsZyI6IkExMjhHQ01LVyIsIml2IjoiSUFPbnd2ODR5YXFEaUxtbSJ9.swf92_LyCvjsvkynHTuMNXRl_MX2keU-fMDWIMezHG4.LOp9SVIXzs4yTnOtMyXZYQ.HUlXrzqJ1qXYl3vUA-ydezCg77WvJNtKdmZ3FPABoZw.8UYl1LOofQLAxHHvWqoTbg",
-			"eyJ6aXAiOiJERUYiLCJlbmMiOiJBMTkyQ0JDLUhTMzg0IiwidGFnIjoiWGRndHQ5dUVEMVlVeU1rVHl6M3lqZyIsImFsZyI6IkExMjhHQ01LVyIsIml2IjoiWF90V2RhSmh6X3J1SHJvQSJ9.JQ3dS1JSgzIFi5M9ig63FoFU1nHBTmPwXY_ovNE2m1JOSUvHtalmihIuraPDloCf.e920JVryUIWt7zJJQM-www.8DUrl4LmsxIEhRr9RLTHG9tBTOcwXqEbQHAJd_qMHzE.wHinoqGUhL4O7lx125kponpwNtlp8VGJ",
-			"eyJ6aXAiOiJERUYiLCJlbmMiOiJBMjU2Q0JDLUhTNTEyIiwidGFnIjoicGgyaTdoY0FWNlh3ZkQta1RHYlVXdyIsImFsZyI6IkExMjhHQ01LVyIsIml2IjoiaG41Smk4Wm1rUmRrSUxWVSJ9._bQlJXl22dhsBgYPhkxUyinBNi871teGWbviOueWj2PqG9OPxIc9SDS8a27YLSVDMircd5Q1Df28--vcXIABQA.DssmhrAg6w_f2VDaPpxTbQ.OGclEmqrxwvZqAfn7EgXlIfXgr0wiGvEbZz3zADnqJs.YZeP0uKVEiDl8VyC-s20YN-RbdyGNsbdtoGDP3eMof8",
-			"eyJ6aXAiOiJERUYiLCJlbmMiOiJBMTI4R0NNIiwiYWxnIjoiQTEyOEtXIn0.TEMcXEoY8WyqGjYs5GZgS-M_Niwu6wDY.i-26KtTt51Td6Iwd.wvhkagvPsLj3QxhPBbfH_th8OqxisUtme2UadQ.vlfvBPv3bw2Zk2H60JVNLQ",
-			"eyJ6aXAiOiJERUYiLCJlbmMiOiJBMTkyR0NNIiwiYWxnIjoiQTEyOEtXIn0.gPaR6mgQ9TUx05V6DRfgTQeZxl0ZSzBa5uQd-qw6yLs.MojplOD77FkMooS-.2yuD7dKR_C3sFbhgwiBccKKOF8DrSvNiwX7wPQ.qDKUbSvMnJv0qifjpWC14g",
-			"eyJ6aXAiOiJERUYiLCJlbmMiOiJBMjU2R0NNIiwiYWxnIjoiQTEyOEtXIn0.Fg-dgSkUW1KEaL5YDPoWHNL8fpX1WxWVLA9OOWsjIFhQVDKyUZI7BQ.mjRBpyJTZf7H-quf.YlNHezMadtaSKp23G-ozmYhHOeHwuJnvWGTtGg.YagnR7awBItUlMDo4uklvg",
-			"eyJ6aXAiOiJERUYiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2IiwiYWxnIjoiQTEyOEtXIn0.x1vYzUE-E2XBWva9OPuwtqfQaf9rlJCIBAyAe6N2q2kWfJrkxGxFsQ.gAwe78dyODFaoP2IOityAA.Yh5YfovkWxGBNAs1sVhvXow_2izHHsBiYEc9JYD6kVg.mio1p3ncp2wLEaEaRa7P0w",
-			"eyJ6aXAiOiJERUYiLCJlbmMiOiJBMTkyQ0JDLUhTMzg0IiwiYWxnIjoiQTEyOEtXIn0.szGrdnmF7D5put2aRBvSSFfp0vRgkRGYaafijJIqAF6PWd1IxsysZRV8aQkQOW1cB6d0fXsTfYM.Ru25LVOOk4xhaK-cIZ0ThA.pF9Ok5zot7elVqXFW5YYHV8MuF9gVGzpQnG1XDs_g_w.-7la0uwcNPpteev185pMHZjbVDXlrec8",
-			"eyJ6aXAiOiJERUYiLCJlbmMiOiJBMjU2Q0JDLUhTNTEyIiwiYWxnIjoiQTEyOEtXIn0.cz-hRv0xR5CnOcnoRWNK8Q9poyVYzRCVTjfmEXQN6xPOZUkJ3zKNqb8Pir_FS0o2TVvxmIbuxeISeATTR2Ttx_YGCNgMkc93.SF5rEQT94lZR-UORcMKqGw.xphygoU7zE0ZggOczXCi_ytt-Evln8CL-7WLDlWcUHg.5h99r8xCCwP2PgDbZqzCJ13oFfB2vZWetD5qZjmmVho",
-		},
-		[]string{
-			"eyJ6aXAiOiJERUYiLCJlbmMiOiJBMTI4R0NNIiwidGFnIjoiVWR5WUVKdEJ5ZTA5dzdjclY0cXI1QSIsImFsZyI6IkExOTJHQ01LVyIsIml2IjoiZlBBV0QwUmdSbHlFdktQcCJ9.P1uTfTuH-imL-NJJMpuTRA.22yqZ1NIfx3KNPgc.hORWZaTSgni1FS-JT90vJly-cU37qTn-tWSqTg.gMN0ufXF92rSXupTtBNkhA",
-			"eyJ6aXAiOiJERUYiLCJlbmMiOiJBMTkyR0NNIiwidGFnIjoiOU9qX3B2LTJSNW5lZl9YbWVkUWltUSIsImFsZyI6IkExOTJHQ01LVyIsIml2IjoiY3BybGEwYUYzREVQNmFJTSJ9.6NVpAm_APiC7km2v-oNR8g23K9U_kf1-.jIg-p8tNwSvwxch0.1i-GPaxS4qR6Gy4tzeVtSdRFRSKQSMpmn-VhzA.qhFWPqtA6vVPl7OM3DThsA",
-			"eyJ6aXAiOiJERUYiLCJlbmMiOiJBMjU2R0NNIiwidGFnIjoiOVc3THg3MVhGQVJCb3NaLVZ5dXc4ZyIsImFsZyI6IkExOTJHQ01LVyIsIml2IjoiZ1N4ZE5heFdBSVBRR0tHYiJ9.3YjPz6dVQwAtCekvtXiHZrooOUlmCsMSvyfwmGwdrOA.hA_C0IDJmGaRzsB0.W4l7OPqpFxiVOZTGfAlRktquyRTo4cEOk9KurQ.l4bGxOkO_ql_jlPo3Oz3TQ",
-			"eyJ6aXAiOiJERUYiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2IiwidGFnIjoiOHJYbWl2WXFWZjNfbHhhd2NUbHJoUSIsImFsZyI6IkExOTJHQ01LVyIsIml2IjoiVXBWeXprVTNKcjEwYXRqYyJ9.8qft-Q_xqUbo5j_aVrVNHchooeLttR4Kb6j01O8k98M.hXO-5IKBYCL9UdwBFVm0tg.EBM4lCZX_K6tfqYmfoDxVPHcf6cT--AegXTTjfSqsIw.Of8xUvEQSh3xgFT3uENnAg",
-			"eyJ6aXAiOiJERUYiLCJlbmMiOiJBMTkyQ0JDLUhTMzg0IiwidGFnIjoiVnItSnVaX0tqV2hSWWMzdzFwZ3cwdyIsImFsZyI6IkExOTJHQ01LVyIsIml2IjoiRGg2R3dISVBVS3ljZGNZeCJ9.YSEDjCnGWr_n9H94AvLoRnwm6bdU9w6-Q67k-QQRVcKRd6673pgH9zEF9A9Dt6o1.gcmVN4kxqBuMq6c7GrK3UQ.vWzJb0He6OY1lhYYjYS7CLh55REAAq1O7yNN-ND4R5Q.OD0B6nwyFaDr_92ysDOtlVnJaeoIqhGw",
-			"eyJ6aXAiOiJERUYiLCJlbmMiOiJBMjU2Q0JDLUhTNTEyIiwidGFnIjoieEtad1BGYURpQ3NqUnBqZUprZHhmZyIsImFsZyI6IkExOTJHQ01LVyIsIml2IjoieTVHRFdteXdkb2R1SDJlYyJ9.AW0gbhWqlptOQ1y9aoNVwrTIIkBfrp33C2OWJsbrDRk6lhxg_IgFhMDTE37moReySGUtttC4CXQD_7etHmd3Hw.OvKXK-aRKlXHOpJQ9ZY_YQ.Ngv7WarDDvR2uBj_DavPAR3DYuIaygvSSdcHrc8-ZqM.MJ6ElitzFCKf_0h5fIJw8uOLC6ps7dKZPozF8juQmUY",
-			"eyJ6aXAiOiJERUYiLCJlbmMiOiJBMTI4R0NNIiwiYWxnIjoiQTE5MktXIn0.8qu63pppcSvp1vv37WrZ44qcCTg7dQMA.cDp-f8dJTrDEpZW4.H6OBJYs4UvFR_IZHLYQZxB6u9a0wOdAif2LNfQ.1dB-id0UIwRSlmwHx5BJCg",
-			"eyJ6aXAiOiJERUYiLCJlbmMiOiJBMTkyR0NNIiwiYWxnIjoiQTE5MktXIn0._FdoKQvC8qUs7K0upriEihUwztK8gOwonXpOxdIwrfs.UO38ok8gDdpLVa1T.x1GvHdVCy4fxoQRg-OQK4Ez3jDOvu9gllLPeEA.3dLeZGIprh_nHizOTVi1xw",
-			"eyJ6aXAiOiJERUYiLCJlbmMiOiJBMjU2R0NNIiwiYWxnIjoiQTE5MktXIn0.uzCJskgSIK6VkjJIu-dQi18biqaY0INc_A1Ehx0oESafgtR99_n4IA.W2eKK8Y14WwTowI_.J2cJC7R6Bz6maR0s1UBMPyRi5BebNUAmof4pvw.-7w6htAlc4iUsOJ6I04rFg",
-			"eyJ6aXAiOiJERUYiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2IiwiYWxnIjoiQTE5MktXIn0.gImQeQETp_6dfJypFDPLlv7c5pCzuq86U16gzrLiCXth6X9XfxJpvQ.YlC4MxjtLWrsyEvlFhvsqw.Vlpvmg9F3gkz4e1xG01Yl2RXx-jG99rF5UvCxOBXSLc.RZUrU_FoR5bG3M-j3GY0Dw",
-			"eyJ6aXAiOiJERUYiLCJlbmMiOiJBMTkyQ0JDLUhTMzg0IiwiYWxnIjoiQTE5MktXIn0.T2EfQ6Tu2wJyRMgZzfvBYmQNCCfdMudMrg86ibEMVAOUKJPtR3WMPEb_Syy9p2VjrLKRlv7nebo.GPc8VbarPPRtzIRATB8NsA.ugPCqLvVLwh55bWlwjsFkmWzJ31z5z-wuih2oJqmG_U.m7FY3EjvV6mKosEYJ5cY7ezFoVQoJS8X",
-			"eyJ6aXAiOiJERUYiLCJlbmMiOiJBMjU2Q0JDLUhTNTEyIiwiYWxnIjoiQTE5MktXIn0.OgLMhZ-2ZhslQyHfzOfyC-qmT6bNg9AdpP59B4jtyxWkQu3eW475WCdiAjojjeyBtVRGQ5vOomwaOIFejY_IekzH6I_taii3.U9x44MF6Wyz5TIwIzwhoxQ.vK7yvSF2beKdNxNY_7n4XdF7JluCGZoxdFJyTJVkSmI.bXRlI8KL-g7gpprQxGmXjVYjYghhWJq7mlCfWI8q2uA",
-		},
-		[]string{
-			"eyJ6aXAiOiJERUYiLCJlbmMiOiJBMTI4R0NNIiwidGFnIjoiR3BjX3pfbjduZjJVZlEtWGdsaTBaQSIsImFsZyI6IkEyNTZHQ01LVyIsIml2IjoiUk40eUdhOVlvYlFhUmZ1TCJ9.Q4ukD6_hZpmASAVcqWJ9Wg.Zfhny_1WNdlp4fH-.3sekDCjkExQCcv28ZW4yrcFnz0vma3vgoenSXA.g8_Ird2Y0itTCDP61du-Yg",
-			"eyJ6aXAiOiJERUYiLCJlbmMiOiJBMTkyR0NNIiwidGFnIjoiWC05UkNVWVh4U3NRelcwelVJS01VUSIsImFsZyI6IkEyNTZHQ01LVyIsIml2IjoiY3JNMnJfa3RrdWpyQ1h5OSJ9.c0q2jCxxV4y1h9u_Xvn7FqUDnbkmNEG4.S_noOTZKuUo9z1l6.ez0RdA25vXMUGH96iXmj3DEVox0J7TasJMnzgg.RbuSPTte_NzTtEEokbc5Ig",
-			"eyJ6aXAiOiJERUYiLCJlbmMiOiJBMjU2R0NNIiwidGFnIjoiWmwyaDFpUW11QWZWd2lJeVp5RHloZyIsImFsZyI6IkEyNTZHQ01LVyIsIml2Ijoib19xZmljb0N0NzNzRWo1QyJ9.NpJxRJ0aqcpekD6HU2u9e6_pL_11JXjWvjfeQnAKkZU.4c5qBcBBrMWi27Lf.NKwNIb4b6cRDJ1TwMKsPrjs7ADn6aNoBdQClVw.yNWmSSRBqQfIQObzj8zDqw",
-			"eyJ6aXAiOiJERUYiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2IiwidGFnIjoiMXdwVEI3LWhjdzZUVXhCbVh2UzdhUSIsImFsZyI6IkEyNTZHQ01LVyIsIml2IjoiOUdIVnZJaDZ0a09vX2pHUSJ9.MFgIhp9mzlq9hoPqqKVKHJ3HL79EBYtV4iNhD63yqiU.UzW5iq8ou21VpZYJgKEN8A.1gOEzA4uAPvHP76GMfs9uLloAV10mKaxiZVAeL7iQA0.i1X_2i0bCAz-soXF9bI_zw",
-			"eyJ6aXAiOiJERUYiLCJlbmMiOiJBMTkyQ0JDLUhTMzg0IiwidGFnIjoiNThocUtsSk15Y1BFUEFRUlNfSzlNUSIsImFsZyI6IkEyNTZHQ01LVyIsIml2IjoiUDh3aTBWMTluVnZqNXpkOSJ9.FXidOWHNFJODO74Thq3J2cC-Z2B8UZkn7SikeosU0bUK6Jx_lzzmUZ-Lafadpdpj.iLfcDbpuBKFiSfiBzUQc7Q.VZK-aD7BFspqfvbwa0wE2wwWxdomzk2IKMetFe8bI44.7wC6rJRGa4x48xbYMd6NH9VzK8uNn4Cb",
-			"eyJ6aXAiOiJERUYiLCJlbmMiOiJBMjU2Q0JDLUhTNTEyIiwidGFnIjoicGcwOEpUcXdzMXdEaXBaRUlpVExoQSIsImFsZyI6IkEyNTZHQ01LVyIsIml2IjoiSlpodk9CdU1RUDFFZTZTNSJ9.wqVgTPm6TcYCTkpbwmn9sW4mgJROH2A3dIdSXo5oKIQUIVbQsmy7KXH8UYO2RS9slMGtb869C8o0My67GKg9dQ.ogrRiLlqjB1S5j-7a05OwA.2Y_LyqhU4S_RXMsB74bxcBacd23J2Sp5Lblw-sOkaUY.XGMiYoU-f3GaEzSvG41vpJP2DMGbeDFoWmkUGLUjc4M",
-			"eyJ6aXAiOiJERUYiLCJlbmMiOiJBMTI4R0NNIiwiYWxnIjoiQTI1NktXIn0.QiIZm9NYfahqYFIbiaoUhCCHjotHMkup.EsU0XLn4FjzzCILn.WuCoQkm9vzo95E7hxBtfYpt-Mooc_vmSTyzj6Q.NbeeYVy6gQPlmhoWDrZwaQ",
-			"eyJ6aXAiOiJERUYiLCJlbmMiOiJBMTkyR0NNIiwiYWxnIjoiQTI1NktXIn0.1ol3j_Lt0Os3UMe2Gypj0o8b77k0FSmqD7kNRNoMa9U.vZ2HMTgN2dgUd42h.JvNcy8-c8sYzOC089VtFSg2BOQx3YF8CqSTuJw.t03LRioWWKN3d7SjinU6SQ",
-			"eyJ6aXAiOiJERUYiLCJlbmMiOiJBMjU2R0NNIiwiYWxnIjoiQTI1NktXIn0.gbkk03l1gyrE9qGEMVtORiyyUqKsgzbqjLd8lw0RQ07WWn--TV4BgA.J8ThH4ac2UhSsMIP.g-W1piEGrdi3tNwQDJXpYm3fQjTf82mtVCrCOg.-vY05P4kiB9FgF2vwrSeXQ",
-			"eyJ6aXAiOiJERUYiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2IiwiYWxnIjoiQTI1NktXIn0.k86pQs7gmQIzuIWRFwesF32XY2xi1WbYxi7XUf_CYlOlehwGCTINHg.3NcC9VzfQgsECISKf4xy-g.v2amdo-rgeGsg-II_tvPukX9D-KAP27xxf2uQJ277Ws.E4LIE3fte3glAnPpnd8D9Q",
-			"eyJ6aXAiOiJERUYiLCJlbmMiOiJBMTkyQ0JDLUhTMzg0IiwiYWxnIjoiQTI1NktXIn0.b8iN0Am3fCUvj7sBd7Z0lpfzBjh1MOgojV7J5rDfrcTU3b35RGYgEV1RdcrtUTBgUwITDjmU7jM.wsSDBFghDga_ERv36I2AOg.6uJsucCb2YReFOJGBdo4zidTIKLUmZBIXfm_M0AJpKk.YwdAfXI3HHcw2wLSnfCRtw4huZQtSKhz",
-			"eyJ6aXAiOiJERUYiLCJlbmMiOiJBMjU2Q0JDLUhTNTEyIiwiYWxnIjoiQTI1NktXIn0.akY9pHCbkHPh5VpXIrX0At41XnJIKBR9iMMkf301vKeJNAZYJTxWzeJhFd-DhQ47tMctc3YYkwZkQ5I_9fGYb_f0oBcw4esh.JNwuuHud78h6S99NO1oBQQ.0RwckPYATBgvw67upkAQ1AezETHc-gh3rryz19i5ryc.3XClRTScgzfMgLCHxHHoRF8mm9VVGXv_Ahtx65PskKQ",
-		},
-	}
-
-	for i, msgs := range aesSampleMessages {
-		for _, msg := range msgs {
-			obj, err := ParseEncrypted(msg)
-			if err != nil {
-				t.Error("unable to parse message", msg, err)
-				continue
-			}
-			plaintext, err := obj.Decrypt(aesTestKeys[i])
-			if err != nil {
-				t.Error("unable to decrypt message", msg, err)
-				continue
-			}
-			if string(plaintext) != "Lorem ipsum dolor sit amet" {
-				t.Error("plaintext is not what we expected for msg", msg)
-			}
-		}
-	}
-}
-
-// Test vectors generated with jose4j
-func TestSampleJose4jJWEMessagesECDH(t *testing.T) {
-	ecTestKey := &ecdsa.PrivateKey{
-		PublicKey: ecdsa.PublicKey{
-			Curve: elliptic.P256(),
-			X:     fromBase64Int("weNJy2HscCSM6AEDTDg04biOvhFhyyWvOHQfeF_PxMQ"),
-			Y:     fromBase64Int("e8lnCO-AlStT-NJVX-crhB7QRYhiix03illJOVAOyck"),
-		},
-		D: fromBase64Int("VEmDZpDXXK8p8N0Cndsxs924q6nS1RXFASRl6BfUqdw"),
-	}
-
-	ecSampleMessages := []string{
-		"eyJhbGciOiJFQ0RILUVTIiwiZW5jIjoiQTEyOENCQy1IUzI1NiIsImVwayI6eyJrdHkiOiJFQyIsIngiOiJTQzAtRnJHUkVvVkpKSmg1TGhORmZqZnFXMC1XSUFyd3RZMzJzQmFQVVh3IiwieSI6ImFQMWlPRENveU9laTVyS1l2VENMNlRMZFN5UEdUN0djMnFsRnBwNXdiWFEiLCJjcnYiOiJQLTI1NiJ9fQ..3mifklTnTTGuA_etSUBBCw.dj8KFM8OlrQ3rT35nHcHZ7A5p84VB2OZb054ghSjS-M.KOIgnJjz87LGqMtikXGxXw",
-		"eyJhbGciOiJFQ0RILUVTIiwiZW5jIjoiQTE5MkNCQy1IUzM4NCIsImVwayI6eyJrdHkiOiJFQyIsIngiOiJUaHRGc0lRZ1E5MkZOYWFMbUFDQURLbE93dmNGVlRORHc4ampfWlJidUxjIiwieSI6IjJmRDZ3UXc3YmpYTm1nVThXMGpFbnl5ZUZkX3Y4ZmpDa3l1R29vTFhGM0EiLCJjcnYiOiJQLTI1NiJ9fQ..90zFayMkKc-fQC_19f6P3A.P1Y_7lMnfkUQOXW_en31lKZ3zAn1nEYn6fXLjmyVPrQ.hrgwy1cePVfhMWT0h-crKTXldglHZ-4g",
-		"eyJhbGciOiJFQ0RILUVTIiwiZW5jIjoiQTI1NkNCQy1IUzUxMiIsImVwayI6eyJrdHkiOiJFQyIsIngiOiI5R1Z6c3VKNWgySl96UURVUFR3WU5zUkFzVzZfY2RzN0pELVQ2RDREQ1ZVIiwieSI6InFZVGl1dVU4aTB1WFpoaS14VGlRNlZJQm5vanFoWENPVnpmWm1pR2lRTEUiLCJjcnYiOiJQLTI1NiJ9fQ..v2reRlDkIsw3eWEsTCc1NA.0qakrFdbhtBCTSl7EREf9sxgHBP9I-Xw29OTJYnrqP8.54ozViEBYYmRkcKp7d2Ztt4hzjQ9Vb5zCeijN_RQrcI",
-		"eyJhbGciOiJFQ0RILUVTK0EyNTZLVyIsImVuYyI6IkExMjhDQkMtSFMyNTYiLCJlcGsiOnsia3R5IjoiRUMiLCJ4IjoiOElUemg3VVFaaUthTWtfME9qX1hFaHZENXpUWjE2Ti13WVdjeTJYUC1tdyIsInkiOiJPNUJiVEk0bUFpU005ZmpCejBRU3pXaU5vbnl3cWlQLUN0RGgwdnNGYXNRIiwiY3J2IjoiUC0yNTYifX0.D3DP3wqPvJv4TYYfhnfrOG6nsM-MMH_CqGfnOGjgdXHNF7xRwEJBOA.WL9Kz3gNYA7S5Rs5mKcXmA.EmQkXhO_nFqAwxJWaM0DH4s3pmCscZovB8YWJ3Ru4N8.Bf88uzwfxiyTjpejU5B0Ng",
-		"eyJhbGciOiJFQ0RILUVTK0EyNTZLVyIsImVuYyI6IkExOTJDQkMtSFMzODQiLCJlcGsiOnsia3R5IjoiRUMiLCJ4IjoiMjlJMk4zRkF0UlBlNGhzYjRLWlhTbmVyV0wyTVhtSUN1LXJJaXhNSHpJQSIsInkiOiJvMjY1bzFReEdmbDhzMHQ0U1JROS00RGNpc3otbXh4NlJ6WVF4SktyeWpJIiwiY3J2IjoiUC0yNTYifX0.DRmsmXz6fCnLc_njDIKdpM7Oc4jTqd_yd9J94TOUksAstEUkAl9Ie3Wg-Ji_LzbdX2xRLXIimcw.FwJOHPQhnqKJCfxt1_qRnQ.ssx3q1ZYILsMTln5q-K8HVn93BVPI5ViusstKMxZzRs.zzcfzWNYSdNDdQ4CiHfymj0bePaAbVaT",
-		"eyJhbGciOiJFQ0RILUVTK0EyNTZLVyIsImVuYyI6IkEyNTZDQkMtSFM1MTIiLCJlcGsiOnsia3R5IjoiRUMiLCJ4IjoiRUp6bTViQnRzVXJNYTl2Y1Q2d1hZRXI3ZjNMcjB0N1V4SDZuZzdGcFF0VSIsInkiOiJRYTNDSDllVTFXYjItdFdVSDN3Sk9fTDVMZXRsRUlMQWNkNE9XR2tFd0hZIiwiY3J2IjoiUC0yNTYifX0.5WxwluZpVWAOJdVrsnDIlEc4_wfRE1gXOaQyx_rKkElNz157Ykf-JsAD7aEvXfx--NKF4js5zYyjeCtxWBhRWPOoNNZJlqV_.Iuo82-qsP2S1SgQQklAnrw.H4wB6XoLKOKWCu6Y3LPAEuHkvyvr-xAh4IBm53uRF8g._fOLKq0bqDZ8KNjni_MJ4olHNaYz376dV9eNmp9O9PU",
-		"eyJhbGciOiJFQ0RILUVTK0ExOTJLVyIsImVuYyI6IkExMjhDQkMtSFMyNTYiLCJlcGsiOnsia3R5IjoiRUMiLCJ4IjoiZktNSG5sRkoxajBTSnJ3WGtVWlpaX3BtWHdUQlJtcHhlaTkxdUpaczUycyIsInkiOiJLRkxKaXhEUTJQcjEybWp1aFdYb3pna2U1V3lhWnhmTWlxZkJ0OEJpbkRvIiwiY3J2IjoiUC0yNTYifX0.2LSD2Mw4tyYJyfsmpVmzBtJRd12jMEYGdlhFbaXIbKi5A33CGNQ1tg.s40aAjmZOvK8Us86FCBdHg.jpYSMAKp___oMCoWM495mTfbi_YC80ObeoCmGE3H_gs.A6V-jJJRY1yz24CaXGUbzg",
-		"eyJhbGciOiJFQ0RILUVTK0ExOTJLVyIsImVuYyI6IkExOTJDQkMtSFMzODQiLCJlcGsiOnsia3R5IjoiRUMiLCJ4IjoiSDRxcFUzeWtuRktWRnV4SmxLa3NZSE5ieHF3aXM0WWtCVVFHVE1Td05JQSIsInkiOiJHb0lpRUZaUGRRSHJCbVR4ZTA3akJoZmxrdWNqUjVoX1QwNWVXc3Zib0prIiwiY3J2IjoiUC0yNTYifX0.KTrwwV2uzD--gf3PGG-kjEAGgi7u0eMqZPZfa4kpyFGm3x8t2m1NHdz3t9rfiqjuaqsxPKhF4gs.cu16fEOzYaSxhHu_Ht9w4g.BRJdxVBI9spVtY5KQ6gTR4CNcKvmLUMKZap0AO-RF2I.DZyUaa2p6YCIaYtjWOjC9GN_VIYgySlZ",
-		"eyJhbGciOiJFQ0RILUVTK0ExOTJLVyIsImVuYyI6IkEyNTZDQkMtSFM1MTIiLCJlcGsiOnsia3R5IjoiRUMiLCJ4IjoieDBYSGRkSGM2Q0ktSnlfbUVMOEZZRExhWnV0UkVFczR4c3BMQmcwZk1jbyIsInkiOiJEa0xzOUJGTlBkTTVTNkpLYVJ3cnV1TWMwcUFzWW9yNW9fZWp6NXBNVXFrIiwiY3J2IjoiUC0yNTYifX0.mfCxJ7JYIqTMqcAh5Vp2USF0eF7OhOeluqda7YagOUJNwxA9wC9o23DSoLUylfrZUfanZrJJJcG69awlv-LY7anOLHlp3Ht5.ec48A_JWb4qa_PVHWZaTfQ.kDAjIDb3LzJpfxNh-DiAmAuaKMYaOGSTb0rkiJLuVeY.oxGCpPlii4pr89XMk4b9s084LucTqPGU6TLbOW2MZoc",
-		"eyJhbGciOiJFQ0RILUVTK0ExMjhLVyIsImVuYyI6IkExMjhDQkMtSFMyNTYiLCJlcGsiOnsia3R5IjoiRUMiLCJ4IjoiQXB5TnlqU2d0bmRUcFg0eENYenNDRnZva1l3X18weXg2dGRUYzdPUUhIMCIsInkiOiJYUHdHMDVDaW1vOGlhWmxZbDNsMEp3ZllhY1FZWHFuM2RRZEJUWFpldDZBIiwiY3J2IjoiUC0yNTYifX0.yTA2PwK9IPqkaGPenZ9R-gOn9m9rvcSEfuX_Nm8AkuwHIYLzzYeAEA.ZW1F1iyHYKfo-YoanNaIVg.PouKQD94DlPA5lbpfGJXY-EJhidC7l4vSayVN2vVzvA.MexquqtGaXKUvX7WBmD4bA",
-		"eyJhbGciOiJFQ0RILUVTK0ExMjhLVyIsImVuYyI6IkExOTJDQkMtSFMzODQiLCJlcGsiOnsia3R5IjoiRUMiLCJ4IjoiaDRWeGNzNVUzWk1fTlp4WmJxQ3hMTVB5UmEtR2ktSVNZa0xDTzE1RHJkZyIsInkiOiJFeVotS3dWNVE5OXlnWk5zU0lpSldpR3hqbXNLUk1WVE5sTTNSd1VYTFRvIiwiY3J2IjoiUC0yNTYifX0.wo56VISyL1QAbi2HLuVut5NGF2FvxKt7B8zHzJ3FpmavPozfbVZV08-GSYQ6jLQWJ4xsO80I4Kg.3_9Bo5ozvD96WHGhqp_tfQ.48UkJ6jk6WK70QItb2QZr0edKH7O-aMuVahTEeqyfW4.ulMlY2tbC341ct20YSmNdtc84FRz1I4g",
-		"eyJhbGciOiJFQ0RILUVTK0ExMjhLVyIsImVuYyI6IkEyNTZDQkMtSFM1MTIiLCJlcGsiOnsia3R5IjoiRUMiLCJ4IjoiN0xZRzZZWTJkel9ZaGNvNnRCcG1IX0tPREQ2X2hwX05tajdEc1c2RXgxcyIsInkiOiI5Y2lPeDcwUkdGT0tpVnBRX0NHQXB5NVlyeThDazBmUkpwNHVrQ2tjNmQ0IiwiY3J2IjoiUC0yNTYifX0.bWwW3J80k46HG1fQAZxUroko2OO8OKkeRavr_o3AnhJDMvp78OR229x-fZUaBm4uWv27_Yjm0X9T2H2lhlIli2Rl9v1PNC77.1NmsJBDGI1fDjRzyc4mtyA.9KfCFynQj7LmJq08qxAG4c-6ZPz1Lh3h3nUbgVwB0TI.cqech0d8XHzWfkWqgKZq1SlAfmO0PUwOsNVkuByVGWk",
-	}
-
-	for _, msg := range ecSampleMessages {
-		obj, err := ParseEncrypted(msg)
-		if err != nil {
-			t.Error("unable to parse message", msg, err)
-			continue
-		}
-		plaintext, err := obj.Decrypt(ecTestKey)
-		if err != nil {
-			t.Error("unable to decrypt message", msg, err)
-			continue
-		}
-		if string(plaintext) != "Lorem ipsum dolor sit amet." {
-			t.Error("plaintext is not what we expected for msg", msg)
-		}
-	}
-}
diff --git a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/jwk_test.go b/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/jwk_test.go
deleted file mode 100644
index d09eb6323..000000000
--- a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/jwk_test.go
+++ /dev/null
@@ -1,525 +0,0 @@
-/*-
- * Copyright 2014 Square Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package jose
-
-import (
-	"bytes"
-	"crypto"
-	"crypto/ecdsa"
-	"crypto/elliptic"
-	"crypto/rsa"
-	"encoding/hex"
-	"fmt"
-	"math/big"
-	"reflect"
-	"testing"
-)
-
-func TestCurveSize(t *testing.T) {
-	size256 := curveSize(elliptic.P256())
-	size384 := curveSize(elliptic.P384())
-	size521 := curveSize(elliptic.P521())
-	if size256 != 32 {
-		t.Error("P-256 have 32 bytes")
-	}
-	if size384 != 48 {
-		t.Error("P-384 have 48 bytes")
-	}
-	if size521 != 66 {
-		t.Error("P-521 have 66 bytes")
-	}
-}
-
-func TestRoundtripRsaPrivate(t *testing.T) {
-	jwk, err := fromRsaPrivateKey(rsaTestKey)
-	if err != nil {
-		t.Error("problem constructing JWK from rsa key", err)
-	}
-
-	rsa2, err := jwk.rsaPrivateKey()
-	if err != nil {
-		t.Error("problem converting RSA private -> JWK", err)
-	}
-
-	if rsa2.N.Cmp(rsaTestKey.N) != 0 {
-		t.Error("RSA private N mismatch")
-	}
-	if rsa2.E != rsaTestKey.E {
-		t.Error("RSA private E mismatch")
-	}
-	if rsa2.D.Cmp(rsaTestKey.D) != 0 {
-		t.Error("RSA private D mismatch")
-	}
-	if len(rsa2.Primes) != 2 {
-		t.Error("RSA private roundtrip expected two primes")
-	}
-	if rsa2.Primes[0].Cmp(rsaTestKey.Primes[0]) != 0 {
-		t.Error("RSA private P mismatch")
-	}
-	if rsa2.Primes[1].Cmp(rsaTestKey.Primes[1]) != 0 {
-		t.Error("RSA private Q mismatch")
-	}
-}
-
-func TestRsaPrivateInsufficientPrimes(t *testing.T) {
-	brokenRsaPrivateKey := rsa.PrivateKey{
-		PublicKey: rsa.PublicKey{
-			N: rsaTestKey.N,
-			E: rsaTestKey.E,
-		},
-		D:      rsaTestKey.D,
-		Primes: []*big.Int{rsaTestKey.Primes[0]},
-	}
-
-	_, err := fromRsaPrivateKey(&brokenRsaPrivateKey)
-	if err != ErrUnsupportedKeyType {
-		t.Error("expected unsupported key type error, got", err)
-	}
-}
-
-func TestRsaPrivateExcessPrimes(t *testing.T) {
-	brokenRsaPrivateKey := rsa.PrivateKey{
-		PublicKey: rsa.PublicKey{
-			N: rsaTestKey.N,
-			E: rsaTestKey.E,
-		},
-		D: rsaTestKey.D,
-		Primes: []*big.Int{
-			rsaTestKey.Primes[0],
-			rsaTestKey.Primes[1],
-			big.NewInt(3),
-		},
-	}
-
-	_, err := fromRsaPrivateKey(&brokenRsaPrivateKey)
-	if err != ErrUnsupportedKeyType {
-		t.Error("expected unsupported key type error, got", err)
-	}
-}
-
-func TestRoundtripEcPublic(t *testing.T) {
-	for i, ecTestKey := range []*ecdsa.PrivateKey{ecTestKey256, ecTestKey384, ecTestKey521} {
-		jwk, err := fromEcPublicKey(&ecTestKey.PublicKey)
-
-		ec2, err := jwk.ecPublicKey()
-		if err != nil {
-			t.Error("problem converting ECDSA private -> JWK", i, err)
-		}
-
-		if !reflect.DeepEqual(ec2.Curve, ecTestKey.Curve) {
-			t.Error("ECDSA private curve mismatch", i)
-		}
-		if ec2.X.Cmp(ecTestKey.X) != 0 {
-			t.Error("ECDSA X mismatch", i)
-		}
-		if ec2.Y.Cmp(ecTestKey.Y) != 0 {
-			t.Error("ECDSA Y mismatch", i)
-		}
-	}
-}
-
-func TestRoundtripEcPrivate(t *testing.T) {
-	for i, ecTestKey := range []*ecdsa.PrivateKey{ecTestKey256, ecTestKey384, ecTestKey521} {
-		jwk, err := fromEcPrivateKey(ecTestKey)
-
-		ec2, err := jwk.ecPrivateKey()
-		if err != nil {
-			t.Error("problem converting ECDSA private -> JWK", i, err)
-		}
-
-		if !reflect.DeepEqual(ec2.Curve, ecTestKey.Curve) {
-			t.Error("ECDSA private curve mismatch", i)
-		}
-		if ec2.X.Cmp(ecTestKey.X) != 0 {
-			t.Error("ECDSA X mismatch", i)
-		}
-		if ec2.Y.Cmp(ecTestKey.Y) != 0 {
-			t.Error("ECDSA Y mismatch", i)
-		}
-		if ec2.D.Cmp(ecTestKey.D) != 0 {
-			t.Error("ECDSA D mismatch", i)
-		}
-	}
-}
-
-func TestMarshalUnmarshal(t *testing.T) {
-	kid := "DEADBEEF"
-
-	for i, key := range []interface{}{ecTestKey256, ecTestKey384, ecTestKey521, rsaTestKey} {
-		for _, use := range []string{"", "sig", "enc"} {
-			jwk := JsonWebKey{Key: key, KeyID: kid, Algorithm: "foo"}
-			if use != "" {
-				jwk.Use = use
-			}
-
-			jsonbar, err := jwk.MarshalJSON()
-			if err != nil {
-				t.Error("problem marshaling", i, err)
-			}
-
-			var jwk2 JsonWebKey
-			err = jwk2.UnmarshalJSON(jsonbar)
-			if err != nil {
-				t.Error("problem unmarshalling", i, err)
-			}
-
-			jsonbar2, err := jwk2.MarshalJSON()
-			if err != nil {
-				t.Error("problem marshaling", i, err)
-			}
-
-			if !bytes.Equal(jsonbar, jsonbar2) {
-				t.Error("roundtrip should not lose information", i)
-			}
-			if jwk2.KeyID != kid {
-				t.Error("kid did not roundtrip JSON marshalling", i)
-			}
-
-			if jwk2.Algorithm != "foo" {
-				t.Error("alg did not roundtrip JSON marshalling", i)
-			}
-
-			if jwk2.Use != use {
-				t.Error("use did not roundtrip JSON marshalling", i)
-			}
-		}
-	}
-}
-
-func TestMarshalNonPointer(t *testing.T) {
-	type EmbedsKey struct {
-		Key JsonWebKey
-	}
-
-	keyJson := []byte(`{
-		"e": "AQAB",
-		"kty": "RSA",
-		"n": "vd7rZIoTLEe-z1_8G1FcXSw9CQFEJgV4g9V277sER7yx5Qjz_Pkf2YVth6wwwFJEmzc0hoKY-MMYFNwBE4hQHw"
-	}`)
-	var parsedKey JsonWebKey
-	err := UnmarshalJSON(keyJson, &parsedKey)
-	if err != nil {
-		t.Error(fmt.Sprintf("Error unmarshalling key: %v", err))
-		return
-	}
-	ek := EmbedsKey{
-		Key: parsedKey,
-	}
-	out, err := MarshalJSON(ek)
-	if err != nil {
-		t.Error(fmt.Sprintf("Error marshalling JSON: %v", err))
-		return
-	}
-	expected := "{\"Key\":{\"kty\":\"RSA\",\"n\":\"vd7rZIoTLEe-z1_8G1FcXSw9CQFEJgV4g9V277sER7yx5Qjz_Pkf2YVth6wwwFJEmzc0hoKY-MMYFNwBE4hQHw\",\"e\":\"AQAB\"}}"
-	if string(out) != expected {
-		t.Error("Failed to marshal embedded non-pointer JWK properly:", string(out))
-	}
-}
-
-func TestMarshalUnmarshalInvalid(t *testing.T) {
-	// Make an invalid curve coordinate by creating a byte array that is one
-	// byte too large, and setting the first byte to 1 (otherwise it's just zero).
-	invalidCoord := make([]byte, curveSize(ecTestKey256.Curve)+1)
-	invalidCoord[0] = 1
-
-	keys := []interface{}{
-		// Empty keys
-		&rsa.PrivateKey{},
-		&ecdsa.PrivateKey{},
-		// Invalid keys
-		&ecdsa.PrivateKey{
-			PublicKey: ecdsa.PublicKey{
-				// Missing values in pub key
-				Curve: elliptic.P256(),
-			},
-		},
-		&ecdsa.PrivateKey{
-			PublicKey: ecdsa.PublicKey{
-				// Invalid curve
-				Curve: nil,
-				X:     ecTestKey256.X,
-				Y:     ecTestKey256.Y,
-			},
-		},
-		&ecdsa.PrivateKey{
-			// Valid pub key, but missing priv key values
-			PublicKey: ecTestKey256.PublicKey,
-		},
-		&ecdsa.PrivateKey{
-			// Invalid pub key, values too large
-			PublicKey: ecdsa.PublicKey{
-				Curve: ecTestKey256.Curve,
-				X:     big.NewInt(0).SetBytes(invalidCoord),
-				Y:     big.NewInt(0).SetBytes(invalidCoord),
-			},
-			D: ecTestKey256.D,
-		},
-		nil,
-	}
-
-	for i, key := range keys {
-		jwk := JsonWebKey{Key: key}
-		_, err := jwk.MarshalJSON()
-		if err == nil {
-			t.Error("managed to serialize invalid key", i)
-		}
-	}
-}
-
-func TestWebKeyVectorsInvalid(t *testing.T) {
-	keys := []string{
-		// Invalid JSON
-		"{X",
-		// Empty key
-		"{}",
-		// Invalid RSA keys
-		`{"kty":"RSA"}`,
-		`{"kty":"RSA","e":""}`,
-		`{"kty":"RSA","e":"XXXX"}`,
-		`{"kty":"RSA","d":"XXXX"}`,
-		// Invalid EC keys
-		`{"kty":"EC","crv":"ABC"}`,
-		`{"kty":"EC","crv":"P-256"}`,
-		`{"kty":"EC","crv":"P-256","d":"XXX"}`,
-		`{"kty":"EC","crv":"ABC","d":"dGVzdA","x":"dGVzdA"}`,
-		`{"kty":"EC","crv":"P-256","d":"dGVzdA","x":"dGVzdA"}`,
-	}
-
-	for _, key := range keys {
-		var jwk2 JsonWebKey
-		err := jwk2.UnmarshalJSON([]byte(key))
-		if err == nil {
-			t.Error("managed to parse invalid key:", key)
-		}
-	}
-}
-
-// Test vectors from RFC 7520
-var cookbookJWKs = []string{
-	// EC Public
-	stripWhitespace(`{
-     "kty": "EC",
-     "kid": "bilbo.baggins@hobbiton.example",
-     "use": "sig",
-     "crv": "P-521",
-     "x": "AHKZLLOsCOzz5cY97ewNUajB957y-C-U88c3v13nmGZx6sYl_oJXu9
-         A5RkTKqjqvjyekWF-7ytDyRXYgCF5cj0Kt",
-     "y": "AdymlHvOiLxXkEhayXQnNCvDX4h9htZaCJN34kfmC6pV5OhQHiraVy
-         SsUdaQkAgDPrwQrJmbnX9cwlGfP-HqHZR1"
-   }`),
-
-	// EC Private
-	stripWhitespace(`{
-     "kty": "EC",
-     "kid": "bilbo.baggins@hobbiton.example",
-     "use": "sig",
-     "crv": "P-521",
-     "x": "AHKZLLOsCOzz5cY97ewNUajB957y-C-U88c3v13nmGZx6sYl_oJXu9
-           A5RkTKqjqvjyekWF-7ytDyRXYgCF5cj0Kt",
-     "y": "AdymlHvOiLxXkEhayXQnNCvDX4h9htZaCJN34kfmC6pV5OhQHiraVy
-           SsUdaQkAgDPrwQrJmbnX9cwlGfP-HqHZR1",
-     "d": "AAhRON2r9cqXX1hg-RoI6R1tX5p2rUAYdmpHZoC1XNM56KtscrX6zb
-           KipQrCW9CGZH3T4ubpnoTKLDYJ_fF3_rJt"
-   }`),
-
-	// RSA Public
-	stripWhitespace(`{
-     "kty": "RSA",
-     "kid": "bilbo.baggins@hobbiton.example",
-     "use": "sig",
-     "n": "n4EPtAOCc9AlkeQHPzHStgAbgs7bTZLwUBZdR8_KuKPEHLd4rHVTeT
-         -O-XV2jRojdNhxJWTDvNd7nqQ0VEiZQHz_AJmSCpMaJMRBSFKrKb2wqV
-         wGU_NsYOYL-QtiWN2lbzcEe6XC0dApr5ydQLrHqkHHig3RBordaZ6Aj-
-         oBHqFEHYpPe7Tpe-OfVfHd1E6cS6M1FZcD1NNLYD5lFHpPI9bTwJlsde
-         3uhGqC0ZCuEHg8lhzwOHrtIQbS0FVbb9k3-tVTU4fg_3L_vniUFAKwuC
-         LqKnS2BYwdq_mzSnbLY7h_qixoR7jig3__kRhuaxwUkRz5iaiQkqgc5g
-         HdrNP5zw",
-     "e": "AQAB"
-   }`),
-
-	// RSA Private
-	stripWhitespace(`{"kty":"RSA",
-      "kid":"juliet@capulet.lit",
-      "use":"enc",
-      "n":"t6Q8PWSi1dkJj9hTP8hNYFlvadM7DflW9mWepOJhJ66w7nyoK1gPNqFMSQRy
-           O125Gp-TEkodhWr0iujjHVx7BcV0llS4w5ACGgPrcAd6ZcSR0-Iqom-QFcNP
-           8Sjg086MwoqQU_LYywlAGZ21WSdS_PERyGFiNnj3QQlO8Yns5jCtLCRwLHL0
-           Pb1fEv45AuRIuUfVcPySBWYnDyGxvjYGDSM-AqWS9zIQ2ZilgT-GqUmipg0X
-           OC0Cc20rgLe2ymLHjpHciCKVAbY5-L32-lSeZO-Os6U15_aXrk9Gw8cPUaX1
-           _I8sLGuSiVdt3C_Fn2PZ3Z8i744FPFGGcG1qs2Wz-Q",
-      "e":"AQAB",
-      "d":"GRtbIQmhOZtyszfgKdg4u_N-R_mZGU_9k7JQ_jn1DnfTuMdSNprTeaSTyWfS
-           NkuaAwnOEbIQVy1IQbWVV25NY3ybc_IhUJtfri7bAXYEReWaCl3hdlPKXy9U
-           vqPYGR0kIXTQRqns-dVJ7jahlI7LyckrpTmrM8dWBo4_PMaenNnPiQgO0xnu
-           ToxutRZJfJvG4Ox4ka3GORQd9CsCZ2vsUDmsXOfUENOyMqADC6p1M3h33tsu
-           rY15k9qMSpG9OX_IJAXmxzAh_tWiZOwk2K4yxH9tS3Lq1yX8C1EWmeRDkK2a
-           hecG85-oLKQt5VEpWHKmjOi_gJSdSgqcN96X52esAQ",
-      "p":"2rnSOV4hKSN8sS4CgcQHFbs08XboFDqKum3sc4h3GRxrTmQdl1ZK9uw-PIHf
-           QP0FkxXVrx-WE-ZEbrqivH_2iCLUS7wAl6XvARt1KkIaUxPPSYB9yk31s0Q8
-           UK96E3_OrADAYtAJs-M3JxCLfNgqh56HDnETTQhH3rCT5T3yJws",
-      "q":"1u_RiFDP7LBYh3N4GXLT9OpSKYP0uQZyiaZwBtOCBNJgQxaj10RWjsZu0c6I
-           edis4S7B_coSKB0Kj9PaPaBzg-IySRvvcQuPamQu66riMhjVtG6TlV8CLCYK
-           rYl52ziqK0E_ym2QnkwsUX7eYTB7LbAHRK9GqocDE5B0f808I4s",
-      "dp":"KkMTWqBUefVwZ2_Dbj1pPQqyHSHjj90L5x_MOzqYAJMcLMZtbUtwKqvVDq3
-           tbEo3ZIcohbDtt6SbfmWzggabpQxNxuBpoOOf_a_HgMXK_lhqigI4y_kqS1w
-           Y52IwjUn5rgRrJ-yYo1h41KR-vz2pYhEAeYrhttWtxVqLCRViD6c",
-      "dq":"AvfS0-gRxvn0bwJoMSnFxYcK1WnuEjQFluMGfwGitQBWtfZ1Er7t1xDkbN9
-           GQTB9yqpDoYaN06H7CFtrkxhJIBQaj6nkF5KKS3TQtQ5qCzkOkmxIe3KRbBy
-           mXxkb5qwUpX5ELD5xFc6FeiafWYY63TmmEAu_lRFCOJ3xDea-ots",
-      "qi":"lSQi-w9CpyUReMErP1RsBLk7wNtOvs5EQpPqmuMvqW57NBUczScEoPwmUqq
-           abu9V0-Py4dQ57_bapoKRu1R90bvuFnU63SHWEFglZQvJDMeAvmj4sm-Fp0o
-           Yu_neotgQ0hzbI5gry7ajdYy9-2lNx_76aBZoOUu9HCJ-UsfSOI8"}`),
-}
-
-// SHA-256 thumbprints of the above keys, hex-encoded
-var cookbookJWKThumbprints = []string{
-	"747ae2dd2003664aeeb21e4753fe7402846170a16bc8df8f23a8cf06d3cbe793",
-	"747ae2dd2003664aeeb21e4753fe7402846170a16bc8df8f23a8cf06d3cbe793",
-	"f63838e96077ad1fc01c3f8405774dedc0641f558ebb4b40dccf5f9b6d66a932",
-	"0fc478f8579325fcee0d4cbc6d9d1ce21730a6e97e435d6008fb379b0ebe47d4",
-}
-
-func TestWebKeyVectorsValid(t *testing.T) {
-	for _, key := range cookbookJWKs {
-		var jwk2 JsonWebKey
-		err := jwk2.UnmarshalJSON([]byte(key))
-		if err != nil {
-			t.Error("unable to parse valid key:", key, err)
-		}
-	}
-}
-
-func TestThumbprint(t *testing.T) {
-	for i, key := range cookbookJWKs {
-		var jwk2 JsonWebKey
-		err := jwk2.UnmarshalJSON([]byte(key))
-		if err != nil {
-			t.Error("unable to parse valid key:", key, err)
-		}
-
-		tp, err := jwk2.Thumbprint(crypto.SHA256)
-		if err != nil {
-			t.Error("unable to compute thumbprint:", key, err)
-		}
-
-		tpHex := hex.EncodeToString(tp)
-		if cookbookJWKThumbprints[i] != tpHex {
-			t.Error("incorrect thumbprint:", i, cookbookJWKThumbprints[i], tpHex)
-		}
-	}
-}
-
-func TestMarshalUnmarshalJWKSet(t *testing.T) {
-	jwk1 := JsonWebKey{Key: rsaTestKey, KeyID: "ABCDEFG", Algorithm: "foo"}
-	jwk2 := JsonWebKey{Key: rsaTestKey, KeyID: "GFEDCBA", Algorithm: "foo"}
-	var set JsonWebKeySet
-	set.Keys = append(set.Keys, jwk1)
-	set.Keys = append(set.Keys, jwk2)
-
-	jsonbar, err := MarshalJSON(&set)
-	if err != nil {
-		t.Error("problem marshalling set", err)
-	}
-	var set2 JsonWebKeySet
-	err = UnmarshalJSON(jsonbar, &set2)
-	if err != nil {
-		t.Error("problem unmarshalling set", err)
-	}
-	jsonbar2, err := MarshalJSON(&set2)
-	if err != nil {
-		t.Error("problem marshalling set", err)
-	}
-	if !bytes.Equal(jsonbar, jsonbar2) {
-		t.Error("roundtrip should not lose information")
-	}
-}
-
-func TestJWKSetKey(t *testing.T) {
-	jwk1 := JsonWebKey{Key: rsaTestKey, KeyID: "ABCDEFG", Algorithm: "foo"}
-	jwk2 := JsonWebKey{Key: rsaTestKey, KeyID: "GFEDCBA", Algorithm: "foo"}
-	var set JsonWebKeySet
-	set.Keys = append(set.Keys, jwk1)
-	set.Keys = append(set.Keys, jwk2)
-	k := set.Key("ABCDEFG")
-	if len(k) != 1 {
-		t.Errorf("method should return slice with one key not %d", len(k))
-	}
-	if k[0].KeyID != "ABCDEFG" {
-		t.Error("method should return key with ID ABCDEFG")
-	}
-}
-
-func TestJWKSymmetricKey(t *testing.T) {
-	sample1 := `{"kty":"oct","alg":"A128KW","k":"GawgguFyGrWKav7AX4VKUg"}`
-	sample2 := `{"kty":"oct","k":"AyM1SysPpbyDfgZld3umj1qzKObwVMkoqQ-EstJQLr_T-1qS0gZH75aKtMN3Yj0iPS4hcgUuTwjAzZr1Z9CAow","kid":"HMAC key used in JWS spec Appendix A.1 example"}`
-
-	var jwk1 JsonWebKey
-	UnmarshalJSON([]byte(sample1), &jwk1)
-
-	if jwk1.Algorithm != "A128KW" {
-		t.Errorf("expected Algorithm to be A128KW, but was '%s'", jwk1.Algorithm)
-	}
-	expected1 := fromHexBytes("19ac2082e1721ab58a6afec05f854a52")
-	if !bytes.Equal(jwk1.Key.([]byte), expected1) {
-		t.Errorf("expected Key to be '%s', but was '%s'", hex.EncodeToString(expected1), hex.EncodeToString(jwk1.Key.([]byte)))
-	}
-
-	var jwk2 JsonWebKey
-	UnmarshalJSON([]byte(sample2), &jwk2)
-
-	if jwk2.KeyID != "HMAC key used in JWS spec Appendix A.1 example" {
-		t.Errorf("expected KeyID to be 'HMAC key used in JWS spec Appendix A.1 example', but was '%s'", jwk2.KeyID)
-	}
-	expected2 := fromHexBytes(`
-    0323354b2b0fa5bc837e0665777ba68f5ab328e6f054c928a90f84b2d2502ebf
-    d3fb5a92d20647ef968ab4c377623d223d2e2172052e4f08c0cd9af567d080a3`)
-	if !bytes.Equal(jwk2.Key.([]byte), expected2) {
-		t.Errorf("expected Key to be '%s', but was '%s'", hex.EncodeToString(expected2), hex.EncodeToString(jwk2.Key.([]byte)))
-	}
-}
-
-func TestJWKSymmetricRoundtrip(t *testing.T) {
-	jwk1 := JsonWebKey{Key: []byte{1, 2, 3, 4}}
-	marshaled, err := jwk1.MarshalJSON()
-	if err != nil {
-		t.Errorf("failed to marshal valid JWK object", err)
-	}
-
-	var jwk2 JsonWebKey
-	err = jwk2.UnmarshalJSON(marshaled)
-	if err != nil {
-		t.Errorf("failed to unmarshal valid JWK object", err)
-	}
-
-	if !bytes.Equal(jwk1.Key.([]byte), jwk2.Key.([]byte)) {
-		t.Error("round-trip of symmetric JWK gave different raw keys")
-	}
-}
-
-func TestJWKSymmetricInvalid(t *testing.T) {
-	invalid := JsonWebKey{}
-	_, err := invalid.MarshalJSON()
-	if err == nil {
-		t.Error("excepted error on marshaling invalid symmetric JWK object")
-	}
-
-	var jwk JsonWebKey
-	err = jwk.UnmarshalJSON([]byte(`{"kty":"oct"}`))
-	if err == nil {
-		t.Error("excepted error on unmarshaling invalid symmetric JWK object")
-	}
-}
diff --git a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/jws_test.go b/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/jws_test.go
deleted file mode 100644
index d8f94c146..000000000
--- a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/jws_test.go
+++ /dev/null
@@ -1,302 +0,0 @@
-/*-
- * Copyright 2014 Square Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package jose
-
-import (
-	"fmt"
-	"strings"
-	"testing"
-)
-
-func TestCompactParseJWS(t *testing.T) {
-	// Should parse
-	msg := "eyJhbGciOiJYWVoifQ.cGF5bG9hZA.c2lnbmF0dXJl"
-	_, err := ParseSigned(msg)
-	if err != nil {
-		t.Error("Unable to parse valid message:", err)
-	}
-
-	// Messages that should fail to parse
-	failures := []string{
-		// Not enough parts
-		"eyJhbGciOiJYWVoifQ.cGF5bG9hZA",
-		// Invalid signature
-		"eyJhbGciOiJYWVoifQ.cGF5bG9hZA.////",
-		// Invalid payload
-		"eyJhbGciOiJYWVoifQ.////.c2lnbmF0dXJl",
-		// Invalid header
-		"////.eyJhbGciOiJYWVoifQ.c2lnbmF0dXJl",
-		// Invalid header
-		"cGF5bG9hZA.cGF5bG9hZA.c2lnbmF0dXJl",
-	}
-
-	for i := range failures {
-		_, err = ParseSigned(failures[i])
-		if err == nil {
-			t.Error("Able to parse invalid message")
-		}
-	}
-}
-
-func TestFullParseJWS(t *testing.T) {
-	// Messages that should succeed to parse
-	successes := []string{
-		"{\"payload\":\"CUJD\",\"signatures\":[{\"protected\":\"e30\",\"header\":{\"kid\":\"XYZ\"},\"signature\":\"CUJD\"},{\"protected\":\"e30\",\"signature\":\"CUJD\"}]}",
-	}
-
-	for i := range successes {
-		_, err := ParseSigned(successes[i])
-		if err != nil {
-			t.Error("Unble to parse valid message", err, successes[i])
-		}
-	}
-
-	// Messages that should fail to parse
-	failures := []string{
-		// Empty
-		"{}",
-		// Invalid JSON
-		"{XX",
-		// Invalid protected header
-		"{\"payload\":\"CUJD\",\"signatures\":[{\"protected\":\"CUJD\",\"header\":{\"kid\":\"XYZ\"},\"signature\":\"CUJD\"}]}",
-		// Invalid protected header
-		"{\"payload\":\"CUJD\",\"protected\":\"CUJD\",\"header\":{\"kid\":\"XYZ\"},\"signature\":\"CUJD\"}",
-		// Invalid protected header
-		"{\"payload\":\"CUJD\",\"signatures\":[{\"protected\":\"###\",\"header\":{\"kid\":\"XYZ\"},\"signature\":\"CUJD\"}]}",
-		// Invalid payload
-		"{\"payload\":\"###\",\"signatures\":[{\"protected\":\"CUJD\",\"header\":{\"kid\":\"XYZ\"},\"signature\":\"CUJD\"}]}",
-		// Invalid payload
-		"{\"payload\":\"CUJD\",\"signatures\":[{\"protected\":\"e30\",\"header\":{\"kid\":\"XYZ\"},\"signature\":\"###\"}]}",
-	}
-
-	for i := range failures {
-		_, err := ParseSigned(failures[i])
-		if err == nil {
-			t.Error("Able to parse invalid message", err, failures[i])
-		}
-	}
-}
-
-func TestRejectUnprotectedJWSNonce(t *testing.T) {
-	// No need to test compact, since that's always protected
-
-	// Flattened JSON
-	input := `{
-		"header": { "nonce": "should-cause-an-error" },
-		"payload": "does-not-matter",
-		"signature": "does-not-matter"
-	}`
-	_, err := ParseSigned(input)
-	if err == nil {
-		t.Error("JWS with an unprotected nonce parsed as valid.")
-	} else if err != ErrUnprotectedNonce {
-		t.Errorf("Improper error for unprotected nonce: %v", err)
-	}
-
-	// Full JSON
-	input = `{
-		"payload": "does-not-matter",
- 		"signatures": [{
- 			"header": { "nonce": "should-cause-an-error" },
-			"signature": "does-not-matter"
-		}]
-	}`
-	_, err = ParseSigned(input)
-	if err == nil {
-		t.Error("JWS with an unprotected nonce parsed as valid.")
-	} else if err != ErrUnprotectedNonce {
-		t.Errorf("Improper error for unprotected nonce: %v", err)
-	}
-}
-
-func TestVerifyFlattenedWithIncludedUnprotectedKey(t *testing.T) {
-	input := `{
-			"header": {
-					"alg": "RS256",
-					"jwk": {
-							"e": "AQAB",
-							"kty": "RSA",
-							"n": "tSwgy3ORGvc7YJI9B2qqkelZRUC6F1S5NwXFvM4w5-M0TsxbFsH5UH6adigV0jzsDJ5imAechcSoOhAh9POceCbPN1sTNwLpNbOLiQQ7RD5mY_pSUHWXNmS9R4NZ3t2fQAzPeW7jOfF0LKuJRGkekx6tXP1uSnNibgpJULNc4208dgBaCHo3mvaE2HV2GmVl1yxwWX5QZZkGQGjNDZYnjFfa2DKVvFs0QbAk21ROm594kAxlRlMMrvqlf24Eq4ERO0ptzpZgm_3j_e4hGRD39gJS7kAzK-j2cacFQ5Qi2Y6wZI2p-FCq_wiYsfEAIkATPBiLKl_6d_Jfcvs_impcXQ"
-					}
-			},
-			"payload": "Zm9vCg",
-			"signature": "hRt2eYqBd_MyMRNIh8PEIACoFtmBi7BHTLBaAhpSU6zyDAFdEBaX7us4VB9Vo1afOL03Q8iuoRA0AT4akdV_mQTAQ_jhTcVOAeXPr0tB8b8Q11UPQ0tXJYmU4spAW2SapJIvO50ntUaqU05kZd0qw8-noH1Lja-aNnU-tQII4iYVvlTiRJ5g8_CADsvJqOk6FcHuo2mG643TRnhkAxUtazvHyIHeXMxydMMSrpwUwzMtln4ZJYBNx4QGEq6OhpAD_VSp-w8Lq5HOwGQoNs0bPxH1SGrArt67LFQBfjlVr94E1sn26p4vigXm83nJdNhWAMHHE9iV67xN-r29LT-FjA"
-	}`
-
-	jws, err := ParseSigned(input)
-	if err != nil {
-		t.Error("Unable to parse valid message.")
-	}
-	if len(jws.Signatures) != 1 {
-		t.Error("Too many or too few signatures.")
-	}
-	sig := jws.Signatures[0]
-	if sig.Header.JsonWebKey == nil {
-		t.Error("No JWK in signature header.")
-	}
-	payload, err := jws.Verify(sig.Header.JsonWebKey)
-	if err != nil {
-		t.Error(fmt.Sprintf("Signature did not validate: %v", err))
-	}
-	if string(payload) != "foo\n" {
-		t.Error(fmt.Sprintf("Payload was incorrect: '%s' should have been 'foo\\n'", string(payload)))
-	}
-}
-
-func TestVerifyFlattenedWithPrivateProtected(t *testing.T) {
-	// The protected field contains a Private Header Parameter name, per
-	// https://tools.ietf.org/html/draft-ietf-jose-json-web-signature-41#section-4
-	// Base64-decoded, it's '{"nonce":"8HIepUNFZUa-exKTrXVf4g"}'
-	input := `{"header":{"alg":"RS256","jwk":{"kty":"RSA","n":"7ixeydcbxxppzxrBphrW1atUiEZqTpiHDpI-79olav5XxAgWolHmVsJyxzoZXRxmtED8PF9-EICZWBGdSAL9ZTD0hLUCIsPcpdgT_LqNW3Sh2b2caPL2hbMF7vsXvnCGg9varpnHWuYTyRrCLUF9vM7ES-V3VCYTa7LcCSRm56Gg9r19qar43Z9kIKBBxpgt723v2cC4bmLmoAX2s217ou3uCpCXGLOeV_BesG4--Nl3pso1VhCfO85wEWjmW6lbv7Kg4d7Jdkv5DjDZfJ086fkEAYZVYGRpIgAvJBH3d3yKDCrSByUEud1bWuFjQBmMaeYOrVDXO_mbYg5PwUDMhw","e":"AQAB"}},"protected":"eyJub25jZSI6IjhISWVwVU5GWlVhLWV4S1RyWFZmNGcifQ","payload":"eyJjb250YWN0IjpbIm1haWx0bzpmb29AYmFyLmNvbSJdfQ","signature":"AyvVGMgXsQ1zTdXrZxE_gyO63pQgotL1KbI7gv6Wi8I7NRy0iAOkDAkWcTQT9pcCYApJ04lXfEDZfP5i0XgcFUm_6spxi5mFBZU-NemKcvK9dUiAbXvb4hB3GnaZtZiuVnMQUb_ku4DOaFFKbteA6gOYCnED_x7v0kAPHIYrQnvIa-KZ6pTajbV9348zgh9TL7NgGIIsTcMHd-Jatr4z1LQ0ubGa8tS300hoDhVzfoDQaEetYjCo1drR1RmdEN1SIzXdHOHfubjA3ZZRbrF_AJnNKpRRoIwzu1VayOhRmdy1qVSQZq_tENF4VrQFycEL7DhG7JLoXC4T2p1urwMlsw"}`
-
-	jws, err := ParseSigned(input)
-	if err != nil {
-		t.Error("Unable to parse valid message.")
-	}
-	if len(jws.Signatures) != 1 {
-		t.Error("Too many or too few signatures.")
-	}
-	sig := jws.Signatures[0]
-	if sig.Header.JsonWebKey == nil {
-		t.Error("No JWK in signature header.")
-	}
-	payload, err := jws.Verify(sig.Header.JsonWebKey)
-	if err != nil {
-		t.Error(fmt.Sprintf("Signature did not validate: %v", err))
-	}
-	expected := "{\"contact\":[\"mailto:foo@bar.com\"]}"
-	if string(payload) != expected {
-		t.Error(fmt.Sprintf("Payload was incorrect: '%s' should have been '%s'", string(payload), expected))
-	}
-}
-
-// Test vectors generated with nimbus-jose-jwt
-func TestSampleNimbusJWSMessagesRSA(t *testing.T) {
-	rsaPublicKey, err := LoadPublicKey(fromBase64Bytes(`
-		MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3aLSGwbeX0ZA2Ha+EvELaIFGzO
-		91+Q15JQc/tdGdCgGW3XAbrh7ZUhDh1XKzbs+UOQxqn3Eq4YOx18IG0WsJSuCaHQIxnDlZ
-		t/GP8WLwjMC0izlJLm2SyfM/EEoNpmTC3w6MQ2dHK7SZ9Zoq+sKijQd+V7CYdr8zHMpDrd
-		NKoEcR0HjmvzzdMoUChhkGH5TaNbZyollULTggepaYUKS8QphqdSDMWiSetKG+g6V87lv6
-		CVYyK1FF6g7Esp5OOj5pNn3/bmF+7V+b7TvK91NCIlURCjE9toRgNoIP4TDnWRn/vvfZ3G
-		zNrtWmlizqz3r5KdvIs71ahWgMUSD4wfazrwIDAQAB`))
-	if err != nil {
-		panic(err)
-	}
-
-	rsaSampleMessages := []string{
-		"eyJhbGciOiJSUzI1NiJ9.TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQ.YHX849fvekz6wJGeyqnQhFqyHFcUXNJKj3o2w3ddR46YLlsCopUJrlifRU_ZuTWzpYxt5oC--T2eoqMhlCvltSWrE5_1_EumqiMfAYsZULx9E6Jns7q3w7mttonYFSIh7aR3-yg2HMMfTCgoAY1y_AZ4VjXwHDcZ5gu1oZDYgvZF4uXtCmwT6e5YtR1m8abiWPF8BgoTG_BD3KV6ClLj_QQiNFdfdxAMDw7vKVOKG1T7BFtz6cDs2Q3ILS4To5E2IjcVSSYS8mi77EitCrWmrqbK_G3WCdKeUFGnMnyuKXaCDy_7FLpAZ6Z5RomRr5iskXeJZdZqIKcJV8zl4fpsPA",
-		"eyJhbGciOiJSUzM4NCJ9.TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQ.meyfoOTjAAjXHFYiNlU7EEnsYtbeUYeEglK6BL_cxISEr2YAGLr1Gwnn2HnucTnH6YilyRio7ZC1ohy_ZojzmaljPHqpr8kn1iqNFu9nFE2M16ZPgJi38-PGzppcDNliyzOQO-c7L-eA-v8Gfww5uyRaOJdiWg-hUJmeGBIngPIeLtSVmhJtz8oTeqeNdUOqQv7f7VRCuvagLhW1PcEM91VUS-gS0WEUXoXWZ2lp91No0v1O24izgX3__FKiX_16XhrOfAgJ82F61vjbTIQYwhexHPZyYTlXYt_scNRzFGhSKeGFin4zVdFLOXWJqKWdUd5IrDP5Nya3FSoWbWDXAg",
-		"eyJhbGciOiJSUzUxMiJ9.TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQ.rQPz0PDh8KyE2AX6JorgI0MLwv-qi1tcWlz6tuZuWQG1hdrlzq5tR1tQg1evYNc_SDDX87DWTSKXT7JEqhKoFixLfZa13IJrOc7FB8r5ZLx7OwOBC4F--OWrvxMA9Y3MTJjPN3FemQePUo-na2vNUZv-YgkcbuOgbO3hTxwQ7j1JGuqy-YutXOFnccdXvntp3t8zYZ4Mg1It_IyL9pzgGqHIEmMV1pCFGHsDa-wStB4ffmdhrADdYZc0q_SvxUdobyC_XzZCz9ENzGIhgwYxyyrqg7kjqUGoKmCLmoSlUFW7goTk9IC5SXdUyLPuESxOWNfHoRClGav230GYjPFQFA",
-		"eyJhbGciOiJQUzI1NiJ9.TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQ.UTtxjsv_6x4CdlAmZfAW6Lun3byMjJbcwRp_OlPH2W4MZaZar7aql052mIB_ddK45O9VUz2aphYVRvKPZY8WHmvlTUU30bk0z_cDJRYB9eIJVMOiRCYj0oNkz1iEZqsP0YgngxwuUDv4Q4A6aJ0Bo5E_rZo3AnrVHMHUjPp_ZRRSBFs30tQma1qQ0ApK4Gxk0XYCYAcxIv99e78vldVRaGzjEZmQeAVZx4tGcqZP20vG1L84nlhSGnOuZ0FhR8UjRFLXuob6M7EqtMRoqPgRYw47EI3fYBdeSivAg98E5S8R7R1NJc7ef-l03RvfUSY0S3_zBq_4PlHK6A-2kHb__w",
-		"eyJhbGciOiJSUzM4NCJ9.TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQ.meyfoOTjAAjXHFYiNlU7EEnsYtbeUYeEglK6BL_cxISEr2YAGLr1Gwnn2HnucTnH6YilyRio7ZC1ohy_ZojzmaljPHqpr8kn1iqNFu9nFE2M16ZPgJi38-PGzppcDNliyzOQO-c7L-eA-v8Gfww5uyRaOJdiWg-hUJmeGBIngPIeLtSVmhJtz8oTeqeNdUOqQv7f7VRCuvagLhW1PcEM91VUS-gS0WEUXoXWZ2lp91No0v1O24izgX3__FKiX_16XhrOfAgJ82F61vjbTIQYwhexHPZyYTlXYt_scNRzFGhSKeGFin4zVdFLOXWJqKWdUd5IrDP5Nya3FSoWbWDXAg",
-		"eyJhbGciOiJSUzUxMiJ9.TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQ.rQPz0PDh8KyE2AX6JorgI0MLwv-qi1tcWlz6tuZuWQG1hdrlzq5tR1tQg1evYNc_SDDX87DWTSKXT7JEqhKoFixLfZa13IJrOc7FB8r5ZLx7OwOBC4F--OWrvxMA9Y3MTJjPN3FemQePUo-na2vNUZv-YgkcbuOgbO3hTxwQ7j1JGuqy-YutXOFnccdXvntp3t8zYZ4Mg1It_IyL9pzgGqHIEmMV1pCFGHsDa-wStB4ffmdhrADdYZc0q_SvxUdobyC_XzZCz9ENzGIhgwYxyyrqg7kjqUGoKmCLmoSlUFW7goTk9IC5SXdUyLPuESxOWNfHoRClGav230GYjPFQFA",
-	}
-
-	for _, msg := range rsaSampleMessages {
-		obj, err := ParseSigned(msg)
-		if err != nil {
-			t.Error("unable to parse message", msg, err)
-			continue
-		}
-		payload, err := obj.Verify(rsaPublicKey)
-		if err != nil {
-			t.Error("unable to verify message", msg, err)
-			continue
-		}
-		if string(payload) != "Lorem ipsum dolor sit amet" {
-			t.Error("payload is not what we expected for msg", msg)
-		}
-	}
-}
-
-// Test vectors generated with nimbus-jose-jwt
-func TestSampleNimbusJWSMessagesEC(t *testing.T) {
-	ecPublicKeyP256, err := LoadPublicKey(fromBase64Bytes("MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIg62jq6FyL1otEj9Up7S35BUrwGF9TVrAzrrY1rHUKZqYIGEg67u/imjgadVcr7y9Q32I0gB8W8FHqbqt696rA=="))
-	if err != nil {
-		panic(err)
-	}
-	ecPublicKeyP384, err := LoadPublicKey(fromBase64Bytes("MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEPXsVlqCtN2oTY+F+hFZm3M0ldYpb7IeeJM5wYmT0k1RaqzBFDhDMNnYK5Q5x+OyssZrAtHgYDFw02AVJhhng/eHRp7mqmL/vI3wbxJtrLKYldIbBA+9fYBQcKeibjlu5"))
-	if err != nil {
-		panic(err)
-	}
-	ecPublicKeyP521, err := LoadPublicKey(fromBase64Bytes("MIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAa2w3MMJ5FWD6tSf68G+Wy5jIhWXOD3IA7pE5IC/myQzo1lWcD8KS57SM6nm4POtPcxyLmDhL7FLuh8DKoIZyvtAAdK8+tOQP7XXRlT2bkvzIuazp05It3TAPu00YzTIpKfDlc19Y1lvf7etrbFqhShD92B+hHmhT4ddrdbPCBDW8hvU="))
-	if err != nil {
-		panic(err)
-	}
-
-	ecPublicKeys := []interface{}{ecPublicKeyP256, ecPublicKeyP384, ecPublicKeyP521}
-
-	ecSampleMessages := []string{
-		"eyJhbGciOiJFUzI1NiJ9.TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQ.MEWJVlvGRQyzMEGOYm4rwuiwxrX-6LjnlbaRDAuhwmnBm2Gtn7pRpGXRTMFZUXsSGDz2L1p-Hz1qn8j9bFIBtQ",
-		"eyJhbGciOiJFUzM4NCJ9.TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQ.nbdjPnJPYQtVNNdBIx8-KbFKplTxrz-hnW5UNhYUY7SBkwHK4NZnqc2Lv4DXoA0aWHq9eiypgOh1kmyPWGEmqKAHUx0xdIEkBoHk3ZsbmhOQuq2jL_wcMUG6nTWNhLrB",
-		"eyJhbGciOiJFUzUxMiJ9.TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQ.AeYNFC1rwIgQv-5fwd8iRyYzvTaSCYTEICepgu9gRId-IW99kbSVY7yH0MvrQnqI-a0L8zwKWDR35fW5dukPAYRkADp3Y1lzqdShFcEFziUVGo46vqbiSajmKFrjBktJcCsfjKSaLHwxErF-T10YYPCQFHWb2nXJOOI3CZfACYqgO84g",
-	}
-
-	for i, msg := range ecSampleMessages {
-		obj, err := ParseSigned(msg)
-		if err != nil {
-			t.Error("unable to parse message", msg, err)
-			continue
-		}
-		payload, err := obj.Verify(ecPublicKeys[i])
-		if err != nil {
-			t.Error("unable to verify message", msg, err)
-			continue
-		}
-		if string(payload) != "Lorem ipsum dolor sit amet" {
-			t.Error("payload is not what we expected for msg", msg)
-		}
-	}
-}
-
-// Test vectors generated with nimbus-jose-jwt
-func TestSampleNimbusJWSMessagesHMAC(t *testing.T) {
-	hmacTestKey := fromHexBytes("DF1FA4F36FFA7FC42C81D4B3C033928D")
-
-	hmacSampleMessages := []string{
-		"eyJhbGciOiJIUzI1NiJ9.TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQ.W5tc_EUhxexcvLYEEOckyyvdb__M5DQIVpg6Nmk1XGM",
-		"eyJhbGciOiJIUzM4NCJ9.TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQ.sBu44lXOJa4Nd10oqOdYH2uz3lxlZ6o32QSGHaoGdPtYTDG5zvSja6N48CXKqdAh",
-		"eyJhbGciOiJIUzUxMiJ9.TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQ.M0yR4tmipsORIix-BitIbxEPGaxPchDfj8UNOpKuhDEfnb7URjGvCKn4nOlyQ1z9mG1FKbwnqR1hOVAWSzAU_w",
-	}
-
-	for _, msg := range hmacSampleMessages {
-		obj, err := ParseSigned(msg)
-		if err != nil {
-			t.Error("unable to parse message", msg, err)
-			continue
-		}
-		payload, err := obj.Verify(hmacTestKey)
-		if err != nil {
-			t.Error("unable to verify message", msg, err)
-			continue
-		}
-		if string(payload) != "Lorem ipsum dolor sit amet" {
-			t.Error("payload is not what we expected for msg", msg)
-		}
-	}
-}
-
-// Test vectors generated with nimbus-jose-jwt
-func TestErrorMissingPayloadJWS(t *testing.T) {
-	_, err := (&rawJsonWebSignature{}).sanitized()
-	if err == nil {
-		t.Error("was able to parse message with missing payload")
-	}
-	if !strings.Contains(err.Error(), "missing payload") {
-		t.Errorf("unexpected error message, should contain 'missing payload': %s", err)
-	}
-}
diff --git a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/signing_test.go b/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/signing_test.go
deleted file mode 100644
index 981770d56..000000000
--- a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/signing_test.go
+++ /dev/null
@@ -1,447 +0,0 @@
-/*-
- * Copyright 2014 Square Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package jose
-
-import (
-	"bytes"
-	"crypto/ecdsa"
-	"crypto/elliptic"
-	"crypto/rand"
-	"fmt"
-	"io"
-	"testing"
-)
-
-type staticNonceSource string
-
-func (sns staticNonceSource) Nonce() (string, error) {
-	return string(sns), nil
-}
-
-func RoundtripJWS(sigAlg SignatureAlgorithm, serializer func(*JsonWebSignature) (string, error), corrupter func(*JsonWebSignature), signingKey interface{}, verificationKey interface{}, nonce string) error {
-	signer, err := NewSigner(sigAlg, signingKey)
-	if err != nil {
-		return fmt.Errorf("error on new signer: %s", err)
-	}
-
-	if nonce != "" {
-		signer.SetNonceSource(staticNonceSource(nonce))
-	}
-
-	input := []byte("Lorem ipsum dolor sit amet")
-	obj, err := signer.Sign(input)
-	if err != nil {
-		return fmt.Errorf("error on sign: %s", err)
-	}
-
-	msg, err := serializer(obj)
-	if err != nil {
-		return fmt.Errorf("error on serialize: %s", err)
-	}
-
-	obj, err = ParseSigned(msg)
-	if err != nil {
-		return fmt.Errorf("error on parse: %s", err)
-	}
-
-	// (Maybe) mangle the object
-	corrupter(obj)
-
-	output, err := obj.Verify(verificationKey)
-	if err != nil {
-		return fmt.Errorf("error on verify: %s", err)
-	}
-
-	// Check that verify works with embedded keys (if present)
-	for i, sig := range obj.Signatures {
-		if sig.Header.JsonWebKey != nil {
-			_, err = obj.Verify(sig.Header.JsonWebKey)
-			if err != nil {
-				return fmt.Errorf("error on verify with embedded key %d: %s", i, err)
-			}
-		}
-
-		// Check that the nonce correctly round-tripped (if present)
-		if sig.Header.Nonce != nonce {
-			return fmt.Errorf("Incorrect nonce returned: [%s]", sig.Header.Nonce)
-		}
-	}
-
-	if bytes.Compare(output, input) != 0 {
-		return fmt.Errorf("input/output do not match, got '%s', expected '%s'", output, input)
-	}
-
-	return nil
-}
-
-func TestRoundtripsJWS(t *testing.T) {
-	// Test matrix
-	sigAlgs := []SignatureAlgorithm{RS256, RS384, RS512, PS256, PS384, PS512, HS256, HS384, HS512, ES256, ES384, ES512}
-
-	serializers := []func(*JsonWebSignature) (string, error){
-		func(obj *JsonWebSignature) (string, error) { return obj.CompactSerialize() },
-		func(obj *JsonWebSignature) (string, error) { return obj.FullSerialize(), nil },
-	}
-
-	corrupter := func(obj *JsonWebSignature) {}
-
-	for _, alg := range sigAlgs {
-		signingKey, verificationKey := GenerateSigningTestKey(alg)
-
-		for i, serializer := range serializers {
-			err := RoundtripJWS(alg, serializer, corrupter, signingKey, verificationKey, "test_nonce")
-			if err != nil {
-				t.Error(err, alg, i)
-			}
-		}
-	}
-}
-
-func TestRoundtripsJWSCorruptSignature(t *testing.T) {
-	// Test matrix
-	sigAlgs := []SignatureAlgorithm{RS256, RS384, RS512, PS256, PS384, PS512, HS256, HS384, HS512, ES256, ES384, ES512}
-
-	serializers := []func(*JsonWebSignature) (string, error){
-		func(obj *JsonWebSignature) (string, error) { return obj.CompactSerialize() },
-		func(obj *JsonWebSignature) (string, error) { return obj.FullSerialize(), nil },
-	}
-
-	corrupters := []func(*JsonWebSignature){
-		func(obj *JsonWebSignature) {
-			// Changes bytes in signature
-			obj.Signatures[0].Signature[10]++
-		},
-		func(obj *JsonWebSignature) {
-			// Set totally invalid signature
-			obj.Signatures[0].Signature = []byte("###")
-		},
-	}
-
-	// Test all different configurations
-	for _, alg := range sigAlgs {
-		signingKey, verificationKey := GenerateSigningTestKey(alg)
-
-		for i, serializer := range serializers {
-			for j, corrupter := range corrupters {
-				err := RoundtripJWS(alg, serializer, corrupter, signingKey, verificationKey, "test_nonce")
-				if err == nil {
-					t.Error("failed to detect corrupt signature", err, alg, i, j)
-				}
-			}
-		}
-	}
-}
-
-func TestSignerWithBrokenRand(t *testing.T) {
-	sigAlgs := []SignatureAlgorithm{RS256, RS384, RS512, PS256, PS384, PS512}
-
-	serializer := func(obj *JsonWebSignature) (string, error) { return obj.CompactSerialize() }
-	corrupter := func(obj *JsonWebSignature) {}
-
-	// Break rand reader
-	readers := []func() io.Reader{
-		// Totally broken
-		func() io.Reader { return bytes.NewReader([]byte{}) },
-		// Not enough bytes
-		func() io.Reader { return io.LimitReader(rand.Reader, 20) },
-	}
-
-	defer resetRandReader()
-
-	for _, alg := range sigAlgs {
-		signingKey, verificationKey := GenerateSigningTestKey(alg)
-		for i, getReader := range readers {
-			randReader = getReader()
-			err := RoundtripJWS(alg, serializer, corrupter, signingKey, verificationKey, "test_nonce")
-			if err == nil {
-				t.Error("signer should fail if rand is broken", alg, i)
-			}
-		}
-	}
-}
-
-func TestJWSInvalidKey(t *testing.T) {
-	signingKey0, verificationKey0 := GenerateSigningTestKey(RS256)
-	_, verificationKey1 := GenerateSigningTestKey(ES256)
-
-	signer, err := NewSigner(RS256, signingKey0)
-	if err != nil {
-		panic(err)
-	}
-
-	input := []byte("Lorem ipsum dolor sit amet")
-	obj, err := signer.Sign(input)
-	if err != nil {
-		panic(err)
-	}
-
-	// Must work with correct key
-	_, err = obj.Verify(verificationKey0)
-	if err != nil {
-		t.Error("error on verify", err)
-	}
-
-	// Must not work with incorrect key
-	_, err = obj.Verify(verificationKey1)
-	if err == nil {
-		t.Error("verification should fail with incorrect key")
-	}
-
-	// Must not work with invalid key
-	_, err = obj.Verify("")
-	if err == nil {
-		t.Error("verification should fail with incorrect key")
-	}
-}
-
-func TestMultiRecipientJWS(t *testing.T) {
-	signer := NewMultiSigner()
-
-	sharedKey := []byte{
-		0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
-		0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
-	}
-
-	signer.AddRecipient(RS256, rsaTestKey)
-	signer.AddRecipient(HS384, sharedKey)
-
-	input := []byte("Lorem ipsum dolor sit amet")
-	obj, err := signer.Sign(input)
-	if err != nil {
-		t.Error("error on sign: ", err)
-		return
-	}
-
-	_, err = obj.CompactSerialize()
-	if err == nil {
-		t.Error("message with multiple recipient was compact serialized")
-	}
-
-	msg := obj.FullSerialize()
-
-	obj, err = ParseSigned(msg)
-	if err != nil {
-		t.Error("error on parse: ", err)
-		return
-	}
-
-	output, err := obj.Verify(&rsaTestKey.PublicKey)
-	if err != nil {
-		t.Error("error on verify: ", err)
-		return
-	}
-
-	if bytes.Compare(output, input) != 0 {
-		t.Error("input/output do not match", output, input)
-		return
-	}
-
-	output, err = obj.Verify(sharedKey)
-	if err != nil {
-		t.Error("error on verify: ", err)
-		return
-	}
-
-	if bytes.Compare(output, input) != 0 {
-		t.Error("input/output do not match", output, input)
-		return
-	}
-}
-
-func GenerateSigningTestKey(sigAlg SignatureAlgorithm) (sig, ver interface{}) {
-	switch sigAlg {
-	case RS256, RS384, RS512, PS256, PS384, PS512:
-		sig = rsaTestKey
-		ver = &rsaTestKey.PublicKey
-	case HS256, HS384, HS512:
-		sig, _, _ = randomKeyGenerator{size: 16}.genKey()
-		ver = sig
-	case ES256:
-		key, _ := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
-		sig = key
-		ver = &key.PublicKey
-	case ES384:
-		key, _ := ecdsa.GenerateKey(elliptic.P384(), rand.Reader)
-		sig = key
-		ver = &key.PublicKey
-	case ES512:
-		key, _ := ecdsa.GenerateKey(elliptic.P521(), rand.Reader)
-		sig = key
-		ver = &key.PublicKey
-	default:
-		panic("Must update test case")
-	}
-
-	return
-}
-
-func TestInvalidSignerAlg(t *testing.T) {
-	_, err := NewSigner("XYZ", nil)
-	if err == nil {
-		t.Error("should not accept invalid algorithm")
-	}
-
-	_, err = NewSigner("XYZ", []byte{})
-	if err == nil {
-		t.Error("should not accept invalid algorithm")
-	}
-}
-
-func TestInvalidJWS(t *testing.T) {
-	signer, err := NewSigner(PS256, rsaTestKey)
-	if err != nil {
-		panic(err)
-	}
-
-	obj, err := signer.Sign([]byte("Lorem ipsum dolor sit amet"))
-	obj.Signatures[0].header = &rawHeader{
-		Crit: []string{"TEST"},
-	}
-
-	_, err = obj.Verify(&rsaTestKey.PublicKey)
-	if err == nil {
-		t.Error("should not verify message with unknown crit header")
-	}
-
-	// Try without alg header
-	obj.Signatures[0].protected = &rawHeader{}
-	obj.Signatures[0].header = &rawHeader{}
-
-	_, err = obj.Verify(&rsaTestKey.PublicKey)
-	if err == nil {
-		t.Error("should not verify message with missing headers")
-	}
-}
-
-func TestSignerKid(t *testing.T) {
-	kid := "DEADBEEF"
-	payload := []byte("Lorem ipsum dolor sit amet")
-
-	key, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
-	if err != nil {
-		t.Error("problem generating test signing key", err)
-	}
-
-	basejwk := JsonWebKey{Key: key}
-	jsonbar, err := basejwk.MarshalJSON()
-	if err != nil {
-		t.Error("problem marshalling base JWK", err)
-	}
-
-	var jsonmsi map[string]interface{}
-	err = UnmarshalJSON(jsonbar, &jsonmsi)
-	if err != nil {
-		t.Error("problem unmarshalling base JWK", err)
-	}
-	jsonmsi["kid"] = kid
-	jsonbar2, err := MarshalJSON(jsonmsi)
-	if err != nil {
-		t.Error("problem marshalling kided JWK", err)
-	}
-
-	var jwk JsonWebKey
-	err = jwk.UnmarshalJSON(jsonbar2)
-	if err != nil {
-		t.Error("problem unmarshalling kided JWK", err)
-	}
-
-	signer, err := NewSigner(ES256, &jwk)
-	if err != nil {
-		t.Error("problem creating signer", err)
-	}
-	signed, err := signer.Sign(payload)
-
-	serialized := signed.FullSerialize()
-
-	parsed, err := ParseSigned(serialized)
-	if err != nil {
-		t.Error("problem parsing signed object", err)
-	}
-
-	if parsed.Signatures[0].Header.KeyID != kid {
-		t.Error("KeyID did not survive trip")
-	}
-}
-
-func TestEmbedJwk(t *testing.T) {
-	var payload = []byte("Lorem ipsum dolor sit amet")
-	key, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
-	if err != nil {
-		t.Error("Failed to generate key")
-	}
-
-	signer, err := NewSigner(ES256, key)
-	if err != nil {
-		t.Error("Failed to create signer")
-	}
-
-	object, err := signer.Sign(payload)
-	if err != nil {
-		t.Error("Failed to sign payload")
-	}
-
-	object, err = ParseSigned(object.FullSerialize())
-	if err != nil {
-		t.Error("Failed to parse jws")
-	}
-
-	if object.Signatures[0].protected.Jwk == nil {
-		t.Error("JWK isn't set in protected header")
-	}
-
-	// Now sign it again, but don't embed JWK.
-	signer.SetEmbedJwk(false)
-
-	object, err = signer.Sign(payload)
-	if err != nil {
-		t.Error("Failed to sign payload")
-	}
-
-	object, err = ParseSigned(object.FullSerialize())
-	if err != nil {
-		t.Error("Failed to parse jws")
-	}
-
-	if object.Signatures[0].protected.Jwk != nil {
-		t.Error("JWK is set in protected header")
-	}
-}
-
-func TestSignerWithJWKAndKeyID(t *testing.T) {
-	enc, err := NewSigner(HS256, &JsonWebKey{
-		KeyID: "test-id",
-		Key:   []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15},
-	})
-	if err != nil {
-		t.Error(err)
-	}
-
-	signed, _ := enc.Sign([]byte("Lorem ipsum dolor sit amet"))
-
-	serialized1, _ := signed.CompactSerialize()
-	serialized2 := signed.FullSerialize()
-
-	parsed1, _ := ParseSigned(serialized1)
-	parsed2, _ := ParseSigned(serialized2)
-
-	if parsed1.Signatures[0].Header.KeyID != "test-id" {
-		t.Errorf("expected message to have key id from JWK, but found '%s' instead", parsed1.Signatures[0].Header.KeyID)
-	}
-	if parsed2.Signatures[0].Header.KeyID != "test-id" {
-		t.Errorf("expected message to have key id from JWK, but found '%s' instead", parsed2.Signatures[0].Header.KeyID)
-	}
-}
diff --git a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/symmetric_test.go b/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/symmetric_test.go
deleted file mode 100644
index 67f535e3b..000000000
--- a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/symmetric_test.go
+++ /dev/null
@@ -1,131 +0,0 @@
-/*-
- * Copyright 2014 Square Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package jose
-
-import (
-	"bytes"
-	"crypto/cipher"
-	"crypto/rand"
-	"io"
-	"testing"
-)
-
-func TestInvalidSymmetricAlgorithms(t *testing.T) {
-	_, err := newSymmetricRecipient("XYZ", []byte{})
-	if err != ErrUnsupportedAlgorithm {
-		t.Error("should not accept invalid algorithm")
-	}
-
-	enc := &symmetricKeyCipher{}
-	_, err = enc.encryptKey([]byte{}, "XYZ")
-	if err != ErrUnsupportedAlgorithm {
-		t.Error("should not accept invalid algorithm")
-	}
-}
-
-func TestAeadErrors(t *testing.T) {
-	aead := &aeadContentCipher{
-		keyBytes:     16,
-		authtagBytes: 16,
-		getAead: func(key []byte) (cipher.AEAD, error) {
-			return nil, ErrCryptoFailure
-		},
-	}
-
-	parts, err := aead.encrypt([]byte{}, []byte{}, []byte{})
-	if err != ErrCryptoFailure {
-		t.Error("should handle aead failure")
-	}
-
-	_, err = aead.decrypt([]byte{}, []byte{}, parts)
-	if err != ErrCryptoFailure {
-		t.Error("should handle aead failure")
-	}
-}
-
-func TestInvalidKey(t *testing.T) {
-	gcm := newAESGCM(16).(*aeadContentCipher)
-	_, err := gcm.getAead([]byte{})
-	if err == nil {
-		t.Error("should not accept invalid key")
-	}
-}
-
-func TestStaticKeyGen(t *testing.T) {
-	key := make([]byte, 32)
-	io.ReadFull(rand.Reader, key)
-
-	gen := &staticKeyGenerator{key: key}
-	if gen.keySize() != len(key) {
-		t.Error("static key generator reports incorrect size")
-	}
-
-	generated, _, err := gen.genKey()
-	if err != nil {
-		t.Error("static key generator should always succeed", err)
-	}
-	if !bytes.Equal(generated, key) {
-		t.Error("static key generator returns different data")
-	}
-}
-
-func TestVectorsAESGCM(t *testing.T) {
-	// Source: http://tools.ietf.org/html/draft-ietf-jose-json-web-encryption-29#appendix-A.1
-	plaintext := []byte{
-		84, 104, 101, 32, 116, 114, 117, 101, 32, 115, 105, 103, 110, 32,
-		111, 102, 32, 105, 110, 116, 101, 108, 108, 105, 103, 101, 110, 99,
-		101, 32, 105, 115, 32, 110, 111, 116, 32, 107, 110, 111, 119, 108,
-		101, 100, 103, 101, 32, 98, 117, 116, 32, 105, 109, 97, 103, 105,
-		110, 97, 116, 105, 111, 110, 46}
-
-	aad := []byte{
-		101, 121, 74, 104, 98, 71, 99, 105, 79, 105, 74, 83, 85, 48, 69,
-		116, 84, 48, 70, 70, 85, 67, 73, 115, 73, 109, 86, 117, 89, 121, 73,
-		54, 73, 107, 69, 121, 78, 84, 90, 72, 81, 48, 48, 105, 102, 81}
-
-	expectedCiphertext := []byte{
-		229, 236, 166, 241, 53, 191, 115, 196, 174, 43, 73, 109, 39, 122,
-		233, 96, 140, 206, 120, 52, 51, 237, 48, 11, 190, 219, 186, 80, 111,
-		104, 50, 142, 47, 167, 59, 61, 181, 127, 196, 21, 40, 82, 242, 32,
-		123, 143, 168, 226, 73, 216, 176, 144, 138, 247, 106, 60, 16, 205,
-		160, 109, 64, 63, 192}
-
-	expectedAuthtag := []byte{
-		92, 80, 104, 49, 133, 25, 161, 215, 173, 101, 219, 211, 136, 91, 210, 145}
-
-	// Mock random reader
-	randReader = bytes.NewReader([]byte{
-		177, 161, 244, 128, 84, 143, 225, 115, 63, 180, 3, 255, 107, 154,
-		212, 246, 138, 7, 110, 91, 112, 46, 34, 105, 47, 130, 203, 46, 122,
-		234, 64, 252, 227, 197, 117, 252, 2, 219, 233, 68, 180, 225, 77, 219})
-	defer resetRandReader()
-
-	enc := newAESGCM(32)
-	key, _, _ := randomKeyGenerator{size: 32}.genKey()
-	out, err := enc.encrypt(key, aad, plaintext)
-	if err != nil {
-		t.Error("Unable to encrypt:", err)
-		return
-	}
-
-	if bytes.Compare(out.ciphertext, expectedCiphertext) != 0 {
-		t.Error("Ciphertext did not match")
-	}
-	if bytes.Compare(out.tag, expectedAuthtag) != 0 {
-		t.Error("Auth tag did not match")
-	}
-}
diff --git a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/utils_test.go b/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/utils_test.go
deleted file mode 100644
index 6ad622da7..000000000
--- a/vendor/rsc.io/letsencrypt/vendor/gopkg.in/square/go-jose.v1/utils_test.go
+++ /dev/null
@@ -1,225 +0,0 @@
-/*-
- * Copyright 2014 Square Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package jose
-
-import (
-	"crypto/ecdsa"
-	"crypto/rand"
-	"crypto/rsa"
-	"encoding/base64"
-	"encoding/hex"
-	"math/big"
-	"regexp"
-	"testing"
-)
-
-// Reset random reader to original value
-func resetRandReader() {
-	randReader = rand.Reader
-}
-
-// Build big int from hex-encoded string. Strips whitespace (for testing).
-func fromHexInt(base16 string) *big.Int {
-	re := regexp.MustCompile(`\s+`)
-	val, ok := new(big.Int).SetString(re.ReplaceAllString(base16, ""), 16)
-	if !ok {
-		panic("Invalid test data")
-	}
-	return val
-}
-
-// Build big int from base64-encoded string. Strips whitespace (for testing).
-func fromBase64Int(base64 string) *big.Int {
-	re := regexp.MustCompile(`\s+`)
-	val, err := base64URLDecode(re.ReplaceAllString(base64, ""))
-	if err != nil {
-		panic("Invalid test data")
-	}
-	return new(big.Int).SetBytes(val)
-}
-
-// Decode hex-encoded string into byte array. Strips whitespace (for testing).
-func fromHexBytes(base16 string) []byte {
-	re := regexp.MustCompile(`\s+`)
-	val, err := hex.DecodeString(re.ReplaceAllString(base16, ""))
-	if err != nil {
-		panic("Invalid test data")
-	}
-	return val
-}
-
-// Decode base64-encoded string into byte array. Strips whitespace (for testing).
-func fromBase64Bytes(b64 string) []byte {
-	re := regexp.MustCompile(`\s+`)
-	val, err := base64.StdEncoding.DecodeString(re.ReplaceAllString(b64, ""))
-	if err != nil {
-		panic("Invalid test data")
-	}
-	return val
-}
-
-// Test vectors below taken from crypto/x509/x509_test.go in the Go std lib.
-
-var pkixPublicKey = `-----BEGIN PUBLIC KEY-----
-MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3VoPN9PKUjKFLMwOge6+
-wnDi8sbETGIx2FKXGgqtAKpzmem53kRGEQg8WeqRmp12wgp74TGpkEXsGae7RS1k
-enJCnma4fii+noGH7R0qKgHvPrI2Bwa9hzsH8tHxpyM3qrXslOmD45EH9SxIDUBJ
-FehNdaPbLP1gFyahKMsdfxFJLUvbUycuZSJ2ZnIgeVxwm4qbSvZInL9Iu4FzuPtg
-fINKcbbovy1qq4KvPIrXzhbY3PWDc6btxCf3SE0JdE1MCPThntB62/bLMSQ7xdDR
-FF53oIpvxe/SCOymfWq/LW849Ytv3Xwod0+wzAP8STXG4HSELS4UedPYeHJJJYcZ
-+QIDAQAB
------END PUBLIC KEY-----`
-
-var pkcs1PrivateKey = `-----BEGIN RSA PRIVATE KEY-----
-MIIBOgIBAAJBALKZD0nEffqM1ACuak0bijtqE2QrI/KLADv7l3kK3ppMyCuLKoF0
-fd7Ai2KW5ToIwzFofvJcS/STa6HA5gQenRUCAwEAAQJBAIq9amn00aS0h/CrjXqu
-/ThglAXJmZhOMPVn4eiu7/ROixi9sex436MaVeMqSNf7Ex9a8fRNfWss7Sqd9eWu
-RTUCIQDasvGASLqmjeffBNLTXV2A5g4t+kLVCpsEIZAycV5GswIhANEPLmax0ME/
-EO+ZJ79TJKN5yiGBRsv5yvx5UiHxajEXAiAhAol5N4EUyq6I9w1rYdhPMGpLfk7A
-IU2snfRJ6Nq2CQIgFrPsWRCkV+gOYcajD17rEqmuLrdIRexpg8N1DOSXoJ8CIGlS
-tAboUGBxTDq3ZroNism3DaMIbKPyYrAqhKov1h5V
------END RSA PRIVATE KEY-----`
-
-var ecdsaSHA256p384CertPem = `
------BEGIN CERTIFICATE-----
-MIICSjCCAdECCQDje/no7mXkVzAKBggqhkjOPQQDAjCBjjELMAkGA1UEBhMCVVMx
-EzARBgNVBAgMCkNhbGlmb3JuaWExFjAUBgNVBAcMDU1vdW50YWluIFZpZXcxFDAS
-BgNVBAoMC0dvb2dsZSwgSW5jMRcwFQYDVQQDDA53d3cuZ29vZ2xlLmNvbTEjMCEG
-CSqGSIb3DQEJARYUZ29sYW5nLWRldkBnbWFpbC5jb20wHhcNMTIwNTIxMDYxMDM0
-WhcNMjIwNTE5MDYxMDM0WjCBjjELMAkGA1UEBhMCVVMxEzARBgNVBAgMCkNhbGlm
-b3JuaWExFjAUBgNVBAcMDU1vdW50YWluIFZpZXcxFDASBgNVBAoMC0dvb2dsZSwg
-SW5jMRcwFQYDVQQDDA53d3cuZ29vZ2xlLmNvbTEjMCEGCSqGSIb3DQEJARYUZ29s
-YW5nLWRldkBnbWFpbC5jb20wdjAQBgcqhkjOPQIBBgUrgQQAIgNiAARRuzRNIKRK
-jIktEmXanNmrTR/q/FaHXLhWRZ6nHWe26Fw7Rsrbk+VjGy4vfWtNn7xSFKrOu5ze
-qxKnmE0h5E480MNgrUiRkaGO2GMJJVmxx20aqkXOk59U8yGA4CghE6MwCgYIKoZI
-zj0EAwIDZwAwZAIwBZEN8gvmRmfeP/9C1PRLzODIY4JqWub2PLRT4mv9GU+yw3Gr
-PU9A3CHMdEcdw/MEAjBBO1lId8KOCh9UZunsSMfqXiVurpzmhWd6VYZ/32G+M+Mh
-3yILeYQzllt/g0rKVRk=
------END CERTIFICATE-----`
-
-var ecdsaSHA256p384CertDer = fromBase64Bytes(`
-MIICSjCCAdECCQDje/no7mXkVzAKBggqhkjOPQQDAjCBjjELMAkGA1UEBhMCVVMx
-EzARBgNVBAgMCkNhbGlmb3JuaWExFjAUBgNVBAcMDU1vdW50YWluIFZpZXcxFDAS
-BgNVBAoMC0dvb2dsZSwgSW5jMRcwFQYDVQQDDA53d3cuZ29vZ2xlLmNvbTEjMCEG
-CSqGSIb3DQEJARYUZ29sYW5nLWRldkBnbWFpbC5jb20wHhcNMTIwNTIxMDYxMDM0
-WhcNMjIwNTE5MDYxMDM0WjCBjjELMAkGA1UEBhMCVVMxEzARBgNVBAgMCkNhbGlm
-b3JuaWExFjAUBgNVBAcMDU1vdW50YWluIFZpZXcxFDASBgNVBAoMC0dvb2dsZSwg
-SW5jMRcwFQYDVQQDDA53d3cuZ29vZ2xlLmNvbTEjMCEGCSqGSIb3DQEJARYUZ29s
-YW5nLWRldkBnbWFpbC5jb20wdjAQBgcqhkjOPQIBBgUrgQQAIgNiAARRuzRNIKRK
-jIktEmXanNmrTR/q/FaHXLhWRZ6nHWe26Fw7Rsrbk+VjGy4vfWtNn7xSFKrOu5ze
-qxKnmE0h5E480MNgrUiRkaGO2GMJJVmxx20aqkXOk59U8yGA4CghE6MwCgYIKoZI
-zj0EAwIDZwAwZAIwBZEN8gvmRmfeP/9C1PRLzODIY4JqWub2PLRT4mv9GU+yw3Gr
-PU9A3CHMdEcdw/MEAjBBO1lId8KOCh9UZunsSMfqXiVurpzmhWd6VYZ/32G+M+Mh
-3yILeYQzllt/g0rKVRk=`)
-
-var pkcs8ECPrivateKey = `
------BEGIN PRIVATE KEY-----
-MIHtAgEAMBAGByqGSM49AgEGBSuBBAAjBIHVMIHSAgEBBEHqkl65VsjYDQWIHfgv
-zQLPa0JZBsaJI16mjiH8k6VA4lgfK/KNldlEsY433X7wIzo43u8OpX7Nv7n8pVRH
-15XWK6GBiQOBhgAEAfDuikMI4bWsyse7t8iSCmjt9fneW/qStZuIPuVLo7mSJdud
-Cs3J/x9wOnnhLv1u+0atnq5HKKdL4ff3itJPlhmSAQzByKQ5LTvB7d6fn95GJVK/
-hNuS5qGBpB7qeMXVFoki0/2RZIOway8/fXjmNYwe4v/XB5LLn4hcTvEUGYcF8M9K
------END PRIVATE KEY-----`
-
-var ecPrivateKey = `
------BEGIN EC PRIVATE KEY-----
-MIHcAgEBBEIBv2rdY9mWGD/UgiuXB0LJcUzgaB6TXq/Ra1jrZKBV3IGSacM5QDFu
-N8yrywiQaTDEqn1zVcLwrnqoQux3gWN1jxugBwYFK4EEACOhgYkDgYYABAFJgaM/
-2a3+gE6Khm/1PYftqNwAzQ21HSLp27q2lTN+GBFho691ARFRkr9UzlQ8gRnhkTbu
-yGfASamlHsYlr3Tv+gFc4BY8SU0q8kzpQ0dOHWFk7dfGFmKwhJrSFIIOeRn/LY03
-XsVFctNDsGhobS2JguQrxhGx8Ll7vQCakV/PEmCQJA==
------END EC PRIVATE KEY-----`
-
-var ecPrivateKeyDer = fromBase64Bytes(`
-MIHcAgEBBEIBv2rdY9mWGD/UgiuXB0LJcUzgaB6TXq/Ra1jrZKBV3IGSacM5QDFu
-N8yrywiQaTDEqn1zVcLwrnqoQux3gWN1jxugBwYFK4EEACOhgYkDgYYABAFJgaM/
-2a3+gE6Khm/1PYftqNwAzQ21HSLp27q2lTN+GBFho691ARFRkr9UzlQ8gRnhkTbu
-yGfASamlHsYlr3Tv+gFc4BY8SU0q8kzpQ0dOHWFk7dfGFmKwhJrSFIIOeRn/LY03
-XsVFctNDsGhobS2JguQrxhGx8Ll7vQCakV/PEmCQJA==`)
-
-var invalidPemKey = `
------BEGIN PUBLIC KEY-----
-MIHcAgEBBEIBv2rdY9mWGD/UgiuXB0LJcUzgaB6TXq/Ra1jrZKBV3IGSacM5QDFu
-XsVFctNDsGhobS2JguQrxhGx8Ll7vQCakV/PEmCQJA==
------END PUBLIC KEY-----`
-
-func TestLoadPublicKey(t *testing.T) {
-	pub, err := LoadPublicKey([]byte(pkixPublicKey))
-	switch pub.(type) {
-	case *rsa.PublicKey:
-	default:
-		t.Error("failed to parse RSA PKIX public key:", err)
-	}
-
-	pub, err = LoadPublicKey([]byte(ecdsaSHA256p384CertPem))
-	switch pub.(type) {
-	case *ecdsa.PublicKey:
-	default:
-		t.Error("failed to parse ECDSA X.509 cert:", err)
-	}
-
-	pub, err = LoadPublicKey([]byte(ecdsaSHA256p384CertDer))
-	switch pub.(type) {
-	case *ecdsa.PublicKey:
-	default:
-		t.Error("failed to parse ECDSA X.509 cert:", err)
-	}
-
-	pub, err = LoadPublicKey([]byte("###"))
-	if err == nil {
-		t.Error("should not parse invalid key")
-	}
-
-	pub, err = LoadPublicKey([]byte(invalidPemKey))
-	if err == nil {
-		t.Error("should not parse invalid key")
-	}
-}
-
-func TestLoadPrivateKey(t *testing.T) {
-	priv, err := LoadPrivateKey([]byte(pkcs1PrivateKey))
-	switch priv.(type) {
-	case *rsa.PrivateKey:
-	default:
-		t.Error("failed to parse RSA PKCS1 private key:", err)
-	}
-
-	priv, err = LoadPrivateKey([]byte(pkcs8ECPrivateKey))
-	if _, ok := priv.(*ecdsa.PrivateKey); !ok {
-		t.Error("failed to parse EC PKCS8 private key:", err)
-	}
-
-	priv, err = LoadPrivateKey([]byte(ecPrivateKey))
-	if _, ok := priv.(*ecdsa.PrivateKey); !ok {
-		t.Error("failed to parse EC private key:", err)
-	}
-
-	priv, err = LoadPrivateKey([]byte(ecPrivateKeyDer))
-	if _, ok := priv.(*ecdsa.PrivateKey); !ok {
-		t.Error("failed to parse EC private key:", err)
-	}
-
-	priv, err = LoadPrivateKey([]byte("###"))
-	if err == nil {
-		t.Error("should not parse invalid key")
-	}
-
-	priv, err = LoadPrivateKey([]byte(invalidPemKey))
-	if err == nil {
-		t.Error("should not parse invalid key")
-	}
-}
diff --git a/vendor/rsc.io/letsencrypt/vendor/vendor.json b/vendor/rsc.io/letsencrypt/vendor/vendor.json
deleted file mode 100644
index 8a4241102..000000000
--- a/vendor/rsc.io/letsencrypt/vendor/vendor.json
+++ /dev/null
@@ -1,31 +0,0 @@
-{
-	"comment": "",
-	"ignore": "",
-	"package": [
-		{
-			"checksumSHA1": "CHmdoMriAboKW2nHYSXo0yBizaE=",
-			"path": "github.com/xenolf/lego/acme",
-			"revision": "ca19a90028e242e878585941c2a27c8f3b3efc25",
-			"revisionTime": "2016-03-28T16:28:34Z"
-		},
-		{
-			"checksumSHA1": "jrheBzltbBE1frmNXQiu911T7dE=",
-			"path": "gopkg.in/square/go-jose.v1",
-			"revision": "40d457b439244b546f023d056628e5184136899b",
-			"revisionTime": "2016-03-29T20:33:11Z"
-		},
-		{
-			"checksumSHA1": "fX4KSC9E1oX9yRx20Zjb3rVJHn4=",
-			"path": "gopkg.in/square/go-jose.v1/cipher",
-			"revision": "40d457b439244b546f023d056628e5184136899b",
-			"revisionTime": "2016-03-29T20:33:11Z"
-		},
-		{
-			"checksumSHA1": "NxdXsIcLGuuX654ygsaOhoLsg6s=",
-			"path": "gopkg.in/square/go-jose.v1/json",
-			"revision": "40d457b439244b546f023d056628e5184136899b",
-			"revisionTime": "2016-03-29T20:33:11Z"
-		}
-	],
-	"rootPath": "rsc.io/letsencrypt"
-}