From 3c98dcaefa28a3b517c58add75997b098a9c7fb9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20S=CC=8Ctibrany=CC=81?= Date: Thu, 26 Mar 2020 12:31:21 +0100 Subject: [PATCH 01/12] =?UTF-8?q?Updated=20Thanos=20to=20master=20Signed-o?= =?UTF-8?q?ff-by:=20Peter=20S=CC=8Ctibrany=CC=81=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- go.mod | 18 +- go.sum | 39 +- vendor/github.com/pkg/errors/.travis.yml | 11 +- vendor/github.com/pkg/errors/Makefile | 44 + vendor/github.com/pkg/errors/README.md | 11 +- vendor/github.com/pkg/errors/errors.go | 8 +- vendor/github.com/pkg/errors/go113.go | 38 + vendor/github.com/pkg/errors/stack.go | 58 +- .../thanos-io/thanos/pkg/block/block.go | 46 +- .../thanos-io/thanos/pkg/block/fetcher.go | 234 +- .../thanos/pkg/block/metadata/deletionmark.go | 76 + .../thanos/pkg/cacheutil/memcached_client.go | 74 +- .../thanos/pkg/compact/blocks_cleaner.go | 58 + .../thanos-io/thanos/pkg/compact/clean.go | 5 +- .../thanos-io/thanos/pkg/compact/compact.go | 112 +- .../downsample/streamed_block_writer.go | 2 +- .../thanos-io/thanos/pkg/compact/retention.go | 8 +- .../thanos/pkg/component/component.go | 1 + .../pkg/discovery/dns/miekgdns/lookup.go | 2 +- .../thanos/pkg/discovery/dns/provider.go | 49 +- .../thanos-io/thanos/pkg/extprom/tx_gauge.go | 12 +- .../thanos-io/thanos/pkg/gate/gate.go | 9 +- .../pkg/{store/cache => model}/units.go | 2 +- .../thanos-io/thanos/pkg/objstore/objstore.go | 113 +- .../thanos-io/thanos/pkg/runutil/runutil.go | 5 + .../thanos-io/thanos/pkg/shipper/shipper.go | 31 +- .../thanos-io/thanos/pkg/store/bucket.go | 473 +- .../thanos/pkg/store/cache/inmemory.go | 56 +- .../thanos/pkg/store/cache/memcached.go | 9 +- .../thanos/pkg/store/postings_codec.go | 135 + .../thanos-io/thanos/pkg/store/prometheus.go | 78 +- .../thanos-io/thanos/pkg/store/proxy.go | 20 +- .../thanos/pkg/store/storepb/custom.go | 44 + .../thanos/pkg/store/storepb/prompb/README.md | 11 + .../pkg/store/storepb/prompb/remote.pb.go | 1590 ++ .../pkg/store/storepb/prompb/remote.proto | 91 + .../pkg/store/storepb/prompb/types.pb.go | 2272 ++ .../pkg/store/storepb/prompb/types.proto | 94 + .../thanos/pkg/store/storepb/rpc.pb.go | 121 +- .../thanos/pkg/store/storepb/rpc.proto | 4 +- .../thanos/pkg/testutil/testorbench.go | 10 + .../thanos-io/thanos/pkg/testutil/testutil.go | 140 +- .../thanos-io/thanos/pkg/tracing/tracing.go | 12 +- vendor/golang.org/x/mod/LICENSE | 27 + vendor/golang.org/x/mod/PATENTS | 22 + .../{tools/internal => mod}/module/module.go | 394 +- .../{tools/internal => mod}/semver/semver.go | 4 +- vendor/golang.org/x/net/http2/http2.go | 6 - vendor/golang.org/x/net/http2/server.go | 11 +- vendor/golang.org/x/net/http2/transport.go | 21 +- vendor/golang.org/x/net/ipv4/helper.go | 17 +- vendor/golang.org/x/net/ipv4/sys_asmreq.go | 3 + vendor/golang.org/x/net/ipv4/sys_bpf.go | 7 +- vendor/golang.org/x/net/ipv4/sys_linux.go | 3 +- .../golang.org/x/net/ipv4/zsys_linux_386.go | 18 - .../golang.org/x/net/ipv4/zsys_linux_amd64.go | 18 - .../golang.org/x/net/ipv4/zsys_linux_arm.go | 18 - .../golang.org/x/net/ipv4/zsys_linux_arm64.go | 18 - .../golang.org/x/net/ipv4/zsys_linux_mips.go | 18 - .../x/net/ipv4/zsys_linux_mips64.go | 18 - .../x/net/ipv4/zsys_linux_mips64le.go | 18 - .../x/net/ipv4/zsys_linux_mipsle.go | 18 - .../golang.org/x/net/ipv4/zsys_linux_ppc.go | 18 - .../golang.org/x/net/ipv4/zsys_linux_ppc64.go | 18 - .../x/net/ipv4/zsys_linux_ppc64le.go | 18 - .../x/net/ipv4/zsys_linux_riscv64.go | 17 - .../golang.org/x/net/ipv4/zsys_linux_s390x.go | 18 - vendor/golang.org/x/net/ipv6/helper.go | 1 - vendor/golang.org/x/net/ipv6/sys_bpf.go | 7 +- vendor/golang.org/x/net/ipv6/sys_linux.go | 3 +- .../golang.org/x/net/ipv6/zsys_linux_386.go | 18 - .../golang.org/x/net/ipv6/zsys_linux_amd64.go | 18 - .../golang.org/x/net/ipv6/zsys_linux_arm.go | 18 - .../golang.org/x/net/ipv6/zsys_linux_arm64.go | 18 - .../golang.org/x/net/ipv6/zsys_linux_mips.go | 18 - .../x/net/ipv6/zsys_linux_mips64.go | 18 - .../x/net/ipv6/zsys_linux_mips64le.go | 18 - .../x/net/ipv6/zsys_linux_mipsle.go | 18 - .../golang.org/x/net/ipv6/zsys_linux_ppc.go | 18 - .../golang.org/x/net/ipv6/zsys_linux_ppc64.go | 18 - .../x/net/ipv6/zsys_linux_ppc64le.go | 18 - .../x/net/ipv6/zsys_linux_riscv64.go | 17 - .../golang.org/x/net/ipv6/zsys_linux_s390x.go | 18 - vendor/golang.org/x/net/publicsuffix/table.go | 19488 ++++++++-------- .../x/tools/cmd/goimports/goimports.go | 10 +- vendor/golang.org/x/tools/go/analysis/doc.go | 77 +- .../x/tools/go/ast/astutil/imports.go | 5 +- .../x/tools/go/ast/inspector/inspector.go | 4 +- .../go/internal/gcimporter/gcimporter.go | 8 +- .../tools/go/internal/packagesdriver/sizes.go | 102 +- vendor/golang.org/x/tools/go/packages/doc.go | 3 +- .../x/tools/go/packages/external.go | 7 +- .../golang.org/x/tools/go/packages/golist.go | 755 +- .../x/tools/go/packages/golist_overlay.go | 201 +- .../x/tools/go/packages/loadmode_string.go | 57 + .../x/tools/go/packages/packages.go | 44 +- .../x/tools/internal/fastwalk/fastwalk.go | 10 +- .../internal/fastwalk/fastwalk_portable.go | 2 +- .../tools/internal/fastwalk/fastwalk_unix.go | 7 +- .../x/tools/internal/gocommand/invoke.go | 121 + .../x/tools/internal/gopathwalk/walk.go | 43 +- .../x/tools/internal/imports/fix.go | 661 +- .../x/tools/internal/imports/imports.go | 59 +- .../x/tools/internal/imports/mod.go | 287 +- .../x/tools/internal/imports/mod_cache.go | 95 +- .../internal/packagesinternal/packages.go | 27 + .../golang.org/x/tools/internal/span/parse.go | 100 - .../golang.org/x/tools/internal/span/span.go | 285 - .../golang.org/x/tools/internal/span/token.go | 151 - .../x/tools/internal/span/token111.go | 39 - .../x/tools/internal/span/token112.go | 16 - .../golang.org/x/tools/internal/span/uri.go | 152 - .../golang.org/x/tools/internal/span/utf16.go | 94 - vendor/golang.org/x/xerrors/LICENSE | 27 + vendor/golang.org/x/xerrors/PATENTS | 22 + vendor/golang.org/x/xerrors/README | 2 + vendor/golang.org/x/xerrors/adaptor.go | 193 + vendor/golang.org/x/xerrors/codereview.cfg | 1 + vendor/golang.org/x/xerrors/doc.go | 22 + vendor/golang.org/x/xerrors/errors.go | 33 + vendor/golang.org/x/xerrors/fmt.go | 187 + vendor/golang.org/x/xerrors/format.go | 34 + vendor/golang.org/x/xerrors/frame.go | 56 + vendor/golang.org/x/xerrors/go.mod | 3 + .../golang.org/x/xerrors/internal/internal.go | 8 + vendor/golang.org/x/xerrors/wrap.go | 106 + vendor/modules.txt | 20 +- 127 files changed, 17780 insertions(+), 13062 deletions(-) create mode 100644 vendor/github.com/pkg/errors/Makefile create mode 100644 vendor/github.com/pkg/errors/go113.go create mode 100644 vendor/github.com/thanos-io/thanos/pkg/block/metadata/deletionmark.go create mode 100644 vendor/github.com/thanos-io/thanos/pkg/compact/blocks_cleaner.go rename vendor/github.com/thanos-io/thanos/pkg/{store/cache => model}/units.go (96%) create mode 100644 vendor/github.com/thanos-io/thanos/pkg/store/postings_codec.go create mode 100644 vendor/github.com/thanos-io/thanos/pkg/store/storepb/prompb/README.md create mode 100644 vendor/github.com/thanos-io/thanos/pkg/store/storepb/prompb/remote.pb.go create mode 100644 vendor/github.com/thanos-io/thanos/pkg/store/storepb/prompb/remote.proto create mode 100644 vendor/github.com/thanos-io/thanos/pkg/store/storepb/prompb/types.pb.go create mode 100644 vendor/github.com/thanos-io/thanos/pkg/store/storepb/prompb/types.proto create mode 100644 vendor/golang.org/x/mod/LICENSE create mode 100644 vendor/golang.org/x/mod/PATENTS rename vendor/golang.org/x/{tools/internal => mod}/module/module.go (57%) rename vendor/golang.org/x/{tools/internal => mod}/semver/semver.go (99%) create mode 100644 vendor/golang.org/x/tools/go/packages/loadmode_string.go create mode 100644 vendor/golang.org/x/tools/internal/gocommand/invoke.go create mode 100644 vendor/golang.org/x/tools/internal/packagesinternal/packages.go delete mode 100644 vendor/golang.org/x/tools/internal/span/parse.go delete mode 100644 vendor/golang.org/x/tools/internal/span/span.go delete mode 100644 vendor/golang.org/x/tools/internal/span/token.go delete mode 100644 vendor/golang.org/x/tools/internal/span/token111.go delete mode 100644 vendor/golang.org/x/tools/internal/span/token112.go delete mode 100644 vendor/golang.org/x/tools/internal/span/uri.go delete mode 100644 vendor/golang.org/x/tools/internal/span/utf16.go create mode 100644 vendor/golang.org/x/xerrors/LICENSE create mode 100644 vendor/golang.org/x/xerrors/PATENTS create mode 100644 vendor/golang.org/x/xerrors/README create mode 100644 vendor/golang.org/x/xerrors/adaptor.go create mode 100644 vendor/golang.org/x/xerrors/codereview.cfg create mode 100644 vendor/golang.org/x/xerrors/doc.go create mode 100644 vendor/golang.org/x/xerrors/errors.go create mode 100644 vendor/golang.org/x/xerrors/fmt.go create mode 100644 vendor/golang.org/x/xerrors/format.go create mode 100644 vendor/golang.org/x/xerrors/frame.go create mode 100644 vendor/golang.org/x/xerrors/go.mod create mode 100644 vendor/golang.org/x/xerrors/internal/internal.go create mode 100644 vendor/golang.org/x/xerrors/wrap.go diff --git a/go.mod b/go.mod index 05727fa09e..027c77625f 100644 --- a/go.mod +++ b/go.mod @@ -14,15 +14,10 @@ require ( github.com/aws/aws-sdk-go v1.25.48 github.com/blang/semver v3.5.0+incompatible github.com/bradfitz/gomemcache v0.0.0-20190913173617-a41fca850d0b - github.com/cenkalti/backoff v1.0.0 // indirect github.com/cespare/xxhash v1.1.0 - github.com/coreos/go-semver v0.3.0 // indirect - github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d // indirect - github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f // indirect github.com/facette/natsort v0.0.0-20181210072756-2cd4dd1e2dcb github.com/fsouza/fake-gcs-server v1.7.0 github.com/go-kit/kit v0.9.0 - github.com/go-openapi/analysis v0.19.4 // indirect github.com/gocql/gocql v0.0.0-20200121121104-95d072f1b5bb github.com/gogo/protobuf v1.3.1 github.com/gogo/status v1.0.3 @@ -31,24 +26,19 @@ require ( github.com/golang/snappy v0.0.1 github.com/gomodule/redigo v2.0.0+incompatible github.com/gorilla/mux v1.7.1 - github.com/gorilla/websocket v1.4.0 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.1.0 github.com/hashicorp/consul/api v1.3.0 github.com/hashicorp/go-cleanhttp v0.5.1 github.com/hashicorp/go-sockaddr v1.0.2 github.com/hashicorp/memberlist v0.1.5 github.com/json-iterator/go v1.1.9 - github.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348 // indirect - github.com/lann/builder v0.0.0-20150808151131-f22ce00fd939 // indirect - github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 // indirect github.com/lib/pq v1.3.0 - github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e // indirect github.com/mitchellh/go-wordwrap v1.0.0 github.com/oklog/ulid v1.3.1 github.com/opentracing-contrib/go-grpc v0.0.0-20180928155321-4b5a12d3ff02 github.com/opentracing-contrib/go-stdlib v0.0.0-20190519235532-cf7a6c988dc9 github.com/opentracing/opentracing-go v1.1.1-0.20200124165624-2876d2018785 - github.com/pkg/errors v0.8.1 + github.com/pkg/errors v0.9.1 github.com/prometheus/alertmanager v0.20.0 github.com/prometheus/client_golang v1.5.0 github.com/prometheus/client_model v0.2.0 @@ -58,19 +48,17 @@ require ( github.com/segmentio/fasthash v0.0.0-20180216231524-a72b379d632e github.com/spf13/afero v1.2.2 github.com/stretchr/testify v1.4.0 - github.com/thanos-io/thanos v0.11.0 - github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5 // indirect + github.com/thanos-io/thanos v0.8.1-0.20200326105947-214ff4480e93 github.com/uber/jaeger-client-go v2.20.1+incompatible github.com/weaveworks/common v0.0.0-20200310113808-2708ba4e60a4 go.etcd.io/bbolt v1.3.3 go.etcd.io/etcd v0.0.0-20190709142735-eb7dd97135a5 go.uber.org/atomic v1.5.0 - golang.org/x/net v0.0.0-20191112182307-2180aed22343 + golang.org/x/net v0.0.0-20200226121028-0de0cce0169b golang.org/x/time v0.0.0-20191024005414-555d28b269f0 google.golang.org/api v0.14.0 google.golang.org/grpc v1.25.1 gopkg.in/yaml.v2 v2.2.7 - k8s.io/client-go v12.0.0+incompatible // indirect sigs.k8s.io/yaml v1.1.0 ) diff --git a/go.sum b/go.sum index 4bba4dff75..e33fcfc275 100644 --- a/go.sum +++ b/go.sum @@ -60,6 +60,7 @@ github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbt github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/DataDog/datadog-go v2.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/Masterminds/squirrel v0.0.0-20161115235646-20f192218cf5 h1:PPfYWScYacO3Q6JMCLkyh6Ea2Q/REDTMgmiTAeiV8Jg= github.com/Masterminds/squirrel v0.0.0-20161115235646-20f192218cf5/go.mod h1:xnKTFzjGUiZtiOagBsfnvomW+nJg2usB1ZpordQWqNM= @@ -70,6 +71,7 @@ github.com/NYTimes/gziphandler v1.1.1 h1:ZUDjpQae29j0ryrS0u/B8HZfJBtBQHjqw2rQ2cq github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/OneOfOne/xxhash v1.2.5/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q= github.com/OneOfOne/xxhash v1.2.6 h1:U68crOE3y3MPttCMQGywZOLrTeF5HHJ3/vDBCJn9/bA= github.com/OneOfOne/xxhash v1.2.6/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q= github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= @@ -96,6 +98,7 @@ github.com/apache/thrift v0.12.0 h1:pODnxUFNcjP9UTLZGTdeh+j16A8lJbRvD3rOtrk/7bs= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-metrics v0.0.0-20190430140413-ec5e00d3c878/go.mod h1:3AMJUQhVx52RsWOnlkpikZr01T/yAVN2gn0861vByNg= github.com/armon/go-metrics v0.3.0 h1:B7AQgHi8QSEi4uHu7Sbsga+IJDU+CENgjxoo81vDUqU= github.com/armon/go-metrics v0.3.0/go.mod h1:zXjbSimjXTd7vOpY8B0/2LpvNvDoXBuplAD+gJD3GYs= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= @@ -106,6 +109,7 @@ github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a h1:idn718Q4 github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/aws/aws-sdk-go v1.15.78/go.mod h1:E3/ieXAlvM0XWO57iftYVDLLvQ824smPP3ATZkfNZeM= github.com/aws/aws-sdk-go v1.17.7/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.22.4/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.25.48 h1:J82DYDGZHOKHdhx6hD24Tm30c2C3GchYGfN0mf9iKUk= github.com/aws/aws-sdk-go v1.25.48/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f h1:ZNv7On9kyUzm7fvRZumSyy/IUiSC7AzL0I1jKKtwooA= @@ -154,6 +158,7 @@ github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7 github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f h1:lBNOc5arjvs8E5mO2tbpBpLoyyu8B6e44T7hJy6potg= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/cortexproject/cortex v0.6.1-0.20200228110116-92ab6cbe0995/go.mod h1:3Xa3DjJxtpXqxcMGdk850lcIRb81M0fyY1MQ6udY134= github.com/cznic/b v0.0.0-20180115125044-35e9bbe41f07/go.mod h1:URriBxXwVq5ijiJ12C7iIZqlA69nTlI+LgI6/pwftG8= github.com/cznic/fileutil v0.0.0-20180108211300-6a051e75936f/go.mod h1:8S58EK26zhXSxzv7NQFpnliaOQsmDUxvoQO3rt154Vg= github.com/cznic/golex v0.0.0-20170803123110-4ab7c5e190e4/go.mod h1:+bmmJDNmKlhWNG+gwWCkaBoTy39Fs+bzRxVBzoTQbIc= @@ -264,6 +269,7 @@ github.com/go-openapi/loads v0.19.2/go.mod h1:QAskZPMX5V0C2gvfkGZzJlINuP7Hx/4+ix github.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9/go.mod h1:6v9a6LTXWQCdL8k1AO3cvqx5OtZY/Y9wKTgaoP6YRfA= github.com/go-openapi/runtime v0.18.0/go.mod h1:uI6pHuxWYTy94zZxgcwJkUWa9wbIlhteGfloI10GD4U= github.com/go-openapi/runtime v0.19.0/go.mod h1:OwNfisksmmaZse4+gpV3Ne9AyMOlP1lt4sK4FXt0O64= +github.com/go-openapi/runtime v0.19.3/go.mod h1:X277bwSUBxVlCYR3r7xgZZGKVvBd/29gLDlFGtJ8NL4= github.com/go-openapi/runtime v0.19.4 h1:csnOgcgAiuGoM/Po7PEpKDoNulCcF3FGbSnbHfxgjMI= github.com/go-openapi/runtime v0.19.4/go.mod h1:X277bwSUBxVlCYR3r7xgZZGKVvBd/29gLDlFGtJ8NL4= github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= @@ -283,6 +289,7 @@ github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/ github.com/go-openapi/swag v0.17.2/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/swag v0.19.4/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tFY= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/validate v0.17.2/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= @@ -372,6 +379,7 @@ github.com/googleapis/gax-go/v2 v2.0.5 h1:sjZBwGj9Jlw33ImPtvFviGYvseOtDM7hkSKB7+ github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gnostic v0.0.0-20170426233943-68f4ded48ba9/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= +github.com/googleapis/gnostic v0.3.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.3.1 h1:WeAefnSUHlBb0iJKwxFDZdbfGwkd7xRNuV+IpXMJhYk= github.com/googleapis/gnostic v0.3.1/go.mod h1:on+2t9HRStVgn95RSsFWFz+6Q0Snyqv1awfrALZdbtU= github.com/gophercloud/gophercloud v0.0.0-20190126172459-c818fa66e4c8/go.mod h1:3WdhXV3rUYy9p6AUW8d94kr+HS62Y4VL9mBnFxsD8q4= @@ -449,6 +457,7 @@ github.com/hashicorp/memberlist v0.1.4/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2p github.com/hashicorp/memberlist v0.1.5 h1:AYBsgJOW9gab/toO5tEB8lWetVgDKZycqkebJ8xxpqM= github.com/hashicorp/memberlist v0.1.5/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= +github.com/hashicorp/serf v0.8.3/go.mod h1:UpNcs7fFbpKIyZaUuSW6EPiH+eZC7OuyFD+wc1oal+k= github.com/hashicorp/serf v0.8.5 h1:ZynDUIQiA8usmRgPdGPHFdPnb1wgGI9tK3mO9hcAJjc= github.com/hashicorp/serf v0.8.5/go.mod h1:UpNcs7fFbpKIyZaUuSW6EPiH+eZC7OuyFD+wc1oal+k= github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= @@ -468,6 +477,7 @@ github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901/go.mod h1:Z86h9688Y0wesXCyonoVr47MasHilkuLMqGhRZ4Hpak= github.com/jonboulle/clockwork v0.1.0 h1:VKV+ZcuP6l3yW9doeqz6ziZGgcynBVQO+obU0+0hcPo= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/jpillora/backoff v0.0.0-20180909062703-3050d21c67d7/go.mod h1:2iMrUgbbvHEiQClaW2NsSzMyGHqN+rDFqY705q49KG0= github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v0.0.0-20180612202835-f2b4162afba3/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= @@ -547,6 +557,7 @@ github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3N github.com/miekg/dns v1.1.15/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.22 h1:Jm64b3bO9kP43ddLjL2EY3Io6bmy1qGb9Xxz6TqS6rc= github.com/miekg/dns v1.1.22/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= +github.com/minio/minio-go/v6 v6.0.44/go.mod h1:qD0lajrGW49lKZLtXKtCB4X/qkMf0a5tBvN2PaZg7Gg= github.com/minio/minio-go/v6 v6.0.49 h1:bU4kIa/qChTLC1jrWZ8F+8gOiw1MClubddAJVR4gW3w= github.com/minio/minio-go/v6 v6.0.49/go.mod h1:qD0lajrGW49lKZLtXKtCB4X/qkMf0a5tBvN2PaZg7Gg= github.com/minio/sha256-simd v0.1.1 h1:5QHSlgo3nt5yKOJrC7W8w7X+NFl8cMPZm96iu8kKUJU= @@ -632,11 +643,14 @@ github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/prometheus/alertmanager v0.18.0/go.mod h1:WcxHBl40VSPuOaqWae6l6HpnEOVRIycEJ7i9iYkadEE= +github.com/prometheus/alertmanager v0.19.0/go.mod h1:Eyp94Yi/T+kdeb2qvq66E3RGuph5T/jm/RBVh4yz1xo= github.com/prometheus/alertmanager v0.20.0 h1:PBMNY7oyIvYMBBIag35/C0hO7xn8+35p4V5rNAph5N8= github.com/prometheus/alertmanager v0.20.0/go.mod h1:9g2i48FAyZW6BtbsnvHtMHQXl2aVtrORKwKVCQ+nbrg= github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= @@ -644,6 +658,7 @@ github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXP github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM= github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= github.com/prometheus/client_golang v1.2.0/go.mod h1:XMU6Z2MjaRKVu/dC1qupJI9SiNkDYzz3xecMgSW/F+U= github.com/prometheus/client_golang v1.2.1 h1:JnMpQc6ppsNgw9QPAGF6Dod479itz7lvlsMzzNayLOI= github.com/prometheus/client_golang v1.2.1/go.mod h1:XMU6Z2MjaRKVu/dC1qupJI9SiNkDYzz3xecMgSW/F+U= @@ -661,6 +676,7 @@ github.com/prometheus/common v0.0.0-20180518154759-7600349dcfe1/go.mod h1:daVV7q github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= github.com/prometheus/common v0.7.0 h1:L+1lyG48J1zAQXA3RBX/nG/B3gjlHq0zTt2tlbJLyCY= github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= github.com/prometheus/common v0.8.0 h1:bLkjvFe2ZRX1DpcgZcdf7j/+MnusEps5hktST/FHA34= @@ -681,7 +697,8 @@ github.com/prometheus/procfs v0.0.6/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+Gx github.com/prometheus/procfs v0.0.8 h1:+fpWZdT24pJBiqJdAwYBjPSk+5YmQzYNPYzQsdzLkt8= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/prometheus v0.0.0-20180315085919-58e2a31db8de/go.mod h1:oAIUtOny2rjMX0OWN5vPR5/q/twIROJvdqnQKDdil/s= -github.com/prometheus/prometheus v1.8.2-0.20200110114423-1e64d757f711/go.mod h1:7U90zPoLkWjEIQcy/rweQla82OCTUzxVHE51G3OhJbI= +github.com/prometheus/prometheus v0.0.0-20190818123050-43acd0e2e93f/go.mod h1:rMTlmxGCvukf2KMu3fClMDKLLoJ5hl61MhcJ7xKakf0= +github.com/prometheus/prometheus v1.8.2-0.20200107122003-4708915ac6ef/go.mod h1:7U90zPoLkWjEIQcy/rweQla82OCTUzxVHE51G3OhJbI= github.com/prometheus/prometheus v1.8.2-0.20200213233353-b90be6f32a33 h1:HBYrMJj5iosUjUkAK9L5GO+5eEQXbcrzdjkqY9HV5W4= github.com/prometheus/prometheus v1.8.2-0.20200213233353-b90be6f32a33/go.mod h1:fkIPPkuZnkXyopYHmXPxf9rgiPkVgZCN8w9o8+UgBlY= github.com/rafaeljusto/redigomock v0.0.0-20190202135759-257e089e14a1 h1:+kGqA4dNN5hn7WwvKdzHl0rdN5AEkbNZd0VjRltAiZg= @@ -752,8 +769,9 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/thanos-io/thanos v0.11.0 h1:UkWLa93sihcxCofelRH/NBGQxFyFU73eXIr2a+dwOFM= -github.com/thanos-io/thanos v0.11.0/go.mod h1:N/Yes7J68KqvmY+xM6J5CJqEvWIvKSR5sqGtmuD6wDc= +github.com/thanos-io/thanos v0.8.1-0.20200109203923-552ffa4c1a0d/go.mod h1:usT/TxtJQ7DzinTt+G9kinDQmRS5sxwu0unVKZ9vdcw= +github.com/thanos-io/thanos v0.8.1-0.20200326105947-214ff4480e93 h1:6SlyEQmt5MivC6HxPGeYaB6pDeackPDzGTYHfjCdh04= +github.com/thanos-io/thanos v0.8.1-0.20200326105947-214ff4480e93/go.mod h1:PeLHoE5XdPZss/3eLvuxDCFXnM6Sd2Kh+saQIRJVtBE= github.com/tidwall/pretty v0.0.0-20180105212114-65a9db5fad51/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= @@ -768,6 +786,7 @@ github.com/uber/jaeger-lib v1.5.1-0.20181102163054-1fc5c315e03c/go.mod h1:ComeND github.com/uber/jaeger-lib v2.2.0+incompatible h1:MxZXOiR2JuoANZ3J6DE/U0kSFv/eJ/GfSYVCjK7dyaw= github.com/uber/jaeger-lib v2.2.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= +github.com/weaveworks/common v0.0.0-20200206153930-760e36ae819a/go.mod h1:6enWAqfQBFrE8X/XdJwZr8IKgh1chStuFR0mjU/UOUw= github.com/weaveworks/common v0.0.0-20200310113808-2708ba4e60a4 h1:H1CjeKf1q/bL7OBvb6KZclHsvnGRGr0Tsuy6y5rtFEc= github.com/weaveworks/common v0.0.0-20200310113808-2708ba4e60a4/go.mod h1:6enWAqfQBFrE8X/XdJwZr8IKgh1chStuFR0mjU/UOUw= github.com/weaveworks/promrus v1.2.0 h1:jOLf6pe6/vss4qGHjXmGz4oDJQA+AOCqEL3FvvZGz7M= @@ -788,6 +807,7 @@ go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/etcd v0.0.0-20190709142735-eb7dd97135a5 h1:3unozPyUjPcbSbfhBb4EgA3O1/yBYHNgRr4ZGjO9iyQ= go.etcd.io/etcd v0.0.0-20190709142735-eb7dd97135a5/go.mod h1:N0RPWo9FXJYZQI4BTkDtQylrstIigYHeR18ONnyTufk= go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= +go.mongodb.org/mongo-driver v1.0.4/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= go.mongodb.org/mongo-driver v1.1.0 h1:aeOqSrhl9eDRAap/3T5pCfMBEBxZ0vuXBP+RMtp2KX8= go.mongodb.org/mongo-driver v1.1.0/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= @@ -822,7 +842,9 @@ golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191112222119-e1110fd1c708 h1:pXVtWnwHkrWD9ru3sDxY/qFK/bfc0egRovX91EjWjf4= golang.org/x/crypto v0.0.0-20191112222119-e1110fd1c708/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -846,6 +868,8 @@ golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.2.0 h1:KU7oHjnv3XNWfa5COkzUifxZmxp1TyI7ImMXqFxLwvQ= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -878,6 +902,8 @@ golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191112182307-2180aed22343 h1:00ohfJ4K98s3m6BGUoBd8nyfp4Yl0GoIKvw5abItTjI= golang.org/x/net v0.0.0-20191112182307-2180aed22343/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b h1:0mm1VjtFUOIlE1SbDlwjYaDxZVDP2S5ou6y0gSgXHu8= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181106182150-f42d05182288/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -917,6 +943,7 @@ golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190712062909-fae7ac547cb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -977,7 +1004,11 @@ golang.org/x/tools v0.0.0-20191111182352-50fa39b762bc/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2 h1:EtTFh6h4SAKemS+CURDMTDIANuduG5zKEXShyy18bGA= golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200306191617-51e69f71924f h1:bFIWQKTZ5vXyr7xMDvzbWUj5Y/WBE4a4sf35MAyZjx0= +golang.org/x/tools v0.0.0-20200306191617-51e69f71924f/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= @@ -1095,9 +1126,11 @@ k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= k8s.io/kube-openapi v0.0.0-20190228160746-b3a7cee44a30/go.mod h1:BXM9ceUBTj2QnfH2MK1odQs778ajze1RxcmP6S8RVVc= k8s.io/kube-openapi v0.0.0-20190709113604-33be087ad058/go.mod h1:nfDlWeOsu3pUf4yWGL+ERqohP4YsZcBJXWMK+gkzOA4= +k8s.io/kube-openapi v0.0.0-20190722073852-5e22f3d471e6/go.mod h1:RZvgC8MSN6DjiMV6oIfEE9pDL9CYXokkfaCKZeHm3nc= k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a h1:UcxjrRMyNx/i/y8G7kPvLyy7rfbeuf1PYyBf973pgyU= k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= k8s.io/utils v0.0.0-20190221042446-c2654d5206da/go.mod h1:8k8uAuAQ0rXslZKaEWd0c3oVhZz7sSzSiPnVZayjIX0= +k8s.io/utils v0.0.0-20190809000727-6c36bc71fc4a/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= k8s.io/utils v0.0.0-20191114200735-6ca3b61696b6 h1:p0Ai3qVtkbCG/Af26dBmU0E1W58NID3hSSh7cMyylpM= k8s.io/utils v0.0.0-20191114200735-6ca3b61696b6/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= rsc.io/binaryregexp v0.2.0 h1:HfqmD5MEmC0zvwBuF187nq9mdnXjXsSivRiXN7SmRkE= diff --git a/vendor/github.com/pkg/errors/.travis.yml b/vendor/github.com/pkg/errors/.travis.yml index d4b92663ba..9159de03e0 100644 --- a/vendor/github.com/pkg/errors/.travis.yml +++ b/vendor/github.com/pkg/errors/.travis.yml @@ -1,15 +1,10 @@ language: go go_import_path: github.com/pkg/errors go: - - 1.4.x - - 1.5.x - - 1.6.x - - 1.7.x - - 1.8.x - - 1.9.x - - 1.10.x - 1.11.x + - 1.12.x + - 1.13.x - tip script: - - go test -v ./... + - make check diff --git a/vendor/github.com/pkg/errors/Makefile b/vendor/github.com/pkg/errors/Makefile new file mode 100644 index 0000000000..ce9d7cded6 --- /dev/null +++ b/vendor/github.com/pkg/errors/Makefile @@ -0,0 +1,44 @@ +PKGS := github.com/pkg/errors +SRCDIRS := $(shell go list -f '{{.Dir}}' $(PKGS)) +GO := go + +check: test vet gofmt misspell unconvert staticcheck ineffassign unparam + +test: + $(GO) test $(PKGS) + +vet: | test + $(GO) vet $(PKGS) + +staticcheck: + $(GO) get honnef.co/go/tools/cmd/staticcheck + staticcheck -checks all $(PKGS) + +misspell: + $(GO) get github.com/client9/misspell/cmd/misspell + misspell \ + -locale GB \ + -error \ + *.md *.go + +unconvert: + $(GO) get github.com/mdempsky/unconvert + unconvert -v $(PKGS) + +ineffassign: + $(GO) get github.com/gordonklaus/ineffassign + find $(SRCDIRS) -name '*.go' | xargs ineffassign + +pedantic: check errcheck + +unparam: + $(GO) get mvdan.cc/unparam + unparam ./... + +errcheck: + $(GO) get github.com/kisielk/errcheck + errcheck $(PKGS) + +gofmt: + @echo Checking code is gofmted + @test -z "$(shell gofmt -s -l -d -e $(SRCDIRS) | tee /dev/stderr)" diff --git a/vendor/github.com/pkg/errors/README.md b/vendor/github.com/pkg/errors/README.md index 6483ba2afb..54dfdcb12e 100644 --- a/vendor/github.com/pkg/errors/README.md +++ b/vendor/github.com/pkg/errors/README.md @@ -41,11 +41,18 @@ default: [Read the package documentation for more information](https://godoc.org/github.com/pkg/errors). +## Roadmap + +With the upcoming [Go2 error proposals](https://go.googlesource.com/proposal/+/master/design/go2draft.md) this package is moving into maintenance mode. The roadmap for a 1.0 release is as follows: + +- 0.9. Remove pre Go 1.9 and Go 1.10 support, address outstanding pull requests (if possible) +- 1.0. Final release. + ## Contributing -We welcome pull requests, bug fixes and issue reports. With that said, the bar for adding new symbols to this package is intentionally set high. +Because of the Go2 errors changes, this package is not accepting proposals for new functionality. With that said, we welcome pull requests, bug fixes and issue reports. -Before proposing a change, please discuss your change by raising an issue. +Before sending a PR, please discuss your change by raising an issue. ## License diff --git a/vendor/github.com/pkg/errors/errors.go b/vendor/github.com/pkg/errors/errors.go index 7421f326ff..161aea2582 100644 --- a/vendor/github.com/pkg/errors/errors.go +++ b/vendor/github.com/pkg/errors/errors.go @@ -82,7 +82,7 @@ // // if err, ok := err.(stackTracer); ok { // for _, f := range err.StackTrace() { -// fmt.Printf("%+s:%d", f) +// fmt.Printf("%+s:%d\n", f, f) // } // } // @@ -159,6 +159,9 @@ type withStack struct { func (w *withStack) Cause() error { return w.error } +// Unwrap provides compatibility for Go 1.13 error chains. +func (w *withStack) Unwrap() error { return w.error } + func (w *withStack) Format(s fmt.State, verb rune) { switch verb { case 'v': @@ -241,6 +244,9 @@ type withMessage struct { func (w *withMessage) Error() string { return w.msg + ": " + w.cause.Error() } func (w *withMessage) Cause() error { return w.cause } +// Unwrap provides compatibility for Go 1.13 error chains. +func (w *withMessage) Unwrap() error { return w.cause } + func (w *withMessage) Format(s fmt.State, verb rune) { switch verb { case 'v': diff --git a/vendor/github.com/pkg/errors/go113.go b/vendor/github.com/pkg/errors/go113.go new file mode 100644 index 0000000000..be0d10d0c7 --- /dev/null +++ b/vendor/github.com/pkg/errors/go113.go @@ -0,0 +1,38 @@ +// +build go1.13 + +package errors + +import ( + stderrors "errors" +) + +// Is reports whether any error in err's chain matches target. +// +// The chain consists of err itself followed by the sequence of errors obtained by +// repeatedly calling Unwrap. +// +// An error is considered to match a target if it is equal to that target or if +// it implements a method Is(error) bool such that Is(target) returns true. +func Is(err, target error) bool { return stderrors.Is(err, target) } + +// As finds the first error in err's chain that matches target, and if so, sets +// target to that error value and returns true. +// +// The chain consists of err itself followed by the sequence of errors obtained by +// repeatedly calling Unwrap. +// +// An error matches target if the error's concrete value is assignable to the value +// pointed to by target, or if the error has a method As(interface{}) bool such that +// As(target) returns true. In the latter case, the As method is responsible for +// setting target. +// +// As will panic if target is not a non-nil pointer to either a type that implements +// error, or to any interface type. As returns false if err is nil. +func As(err error, target interface{}) bool { return stderrors.As(err, target) } + +// Unwrap returns the result of calling the Unwrap method on err, if err's +// type contains an Unwrap method returning error. +// Otherwise, Unwrap returns nil. +func Unwrap(err error) error { + return stderrors.Unwrap(err) +} diff --git a/vendor/github.com/pkg/errors/stack.go b/vendor/github.com/pkg/errors/stack.go index 2874a048cf..779a8348fb 100644 --- a/vendor/github.com/pkg/errors/stack.go +++ b/vendor/github.com/pkg/errors/stack.go @@ -5,10 +5,13 @@ import ( "io" "path" "runtime" + "strconv" "strings" ) // Frame represents a program counter inside a stack frame. +// For historical reasons if Frame is interpreted as a uintptr +// its value represents the program counter + 1. type Frame uintptr // pc returns the program counter for this frame; @@ -37,6 +40,15 @@ func (f Frame) line() int { return line } +// name returns the name of this function, if known. +func (f Frame) name() string { + fn := runtime.FuncForPC(f.pc()) + if fn == nil { + return "unknown" + } + return fn.Name() +} + // Format formats the frame according to the fmt.Formatter interface. // // %s source file @@ -54,22 +66,16 @@ func (f Frame) Format(s fmt.State, verb rune) { case 's': switch { case s.Flag('+'): - pc := f.pc() - fn := runtime.FuncForPC(pc) - if fn == nil { - io.WriteString(s, "unknown") - } else { - file, _ := fn.FileLine(pc) - fmt.Fprintf(s, "%s\n\t%s", fn.Name(), file) - } + io.WriteString(s, f.name()) + io.WriteString(s, "\n\t") + io.WriteString(s, f.file()) default: io.WriteString(s, path.Base(f.file())) } case 'd': - fmt.Fprintf(s, "%d", f.line()) + io.WriteString(s, strconv.Itoa(f.line())) case 'n': - name := runtime.FuncForPC(f.pc()).Name() - io.WriteString(s, funcname(name)) + io.WriteString(s, funcname(f.name())) case 'v': f.Format(s, 's') io.WriteString(s, ":") @@ -77,6 +83,16 @@ func (f Frame) Format(s fmt.State, verb rune) { } } +// MarshalText formats a stacktrace Frame as a text string. The output is the +// same as that of fmt.Sprintf("%+v", f), but without newlines or tabs. +func (f Frame) MarshalText() ([]byte, error) { + name := f.name() + if name == "unknown" { + return []byte(name), nil + } + return []byte(fmt.Sprintf("%s %s:%d", name, f.file(), f.line())), nil +} + // StackTrace is stack of Frames from innermost (newest) to outermost (oldest). type StackTrace []Frame @@ -94,16 +110,30 @@ func (st StackTrace) Format(s fmt.State, verb rune) { switch { case s.Flag('+'): for _, f := range st { - fmt.Fprintf(s, "\n%+v", f) + io.WriteString(s, "\n") + f.Format(s, verb) } case s.Flag('#'): fmt.Fprintf(s, "%#v", []Frame(st)) default: - fmt.Fprintf(s, "%v", []Frame(st)) + st.formatSlice(s, verb) } case 's': - fmt.Fprintf(s, "%s", []Frame(st)) + st.formatSlice(s, verb) + } +} + +// formatSlice will format this StackTrace into the given buffer as a slice of +// Frame, only valid when called with '%s' or '%v'. +func (st StackTrace) formatSlice(s fmt.State, verb rune) { + io.WriteString(s, "[") + for i, f := range st { + if i > 0 { + io.WriteString(s, " ") + } + f.Format(s, verb) } + io.WriteString(s, "]") } // stack represents a stack of program counters. diff --git a/vendor/github.com/thanos-io/thanos/pkg/block/block.go b/vendor/github.com/thanos-io/thanos/pkg/block/block.go index 740b3d6306..40398cf3d9 100644 --- a/vendor/github.com/thanos-io/thanos/pkg/block/block.go +++ b/vendor/github.com/thanos-io/thanos/pkg/block/block.go @@ -6,6 +6,7 @@ package block import ( + "bytes" "context" "encoding/json" "fmt" @@ -14,6 +15,7 @@ import ( "path" "path/filepath" "strings" + "time" "github.com/go-kit/kit/log" "github.com/go-kit/kit/log/level" @@ -87,7 +89,7 @@ func Upload(ctx context.Context, logger log.Logger, bkt objstore.Bucket, bdir st } if meta.Thanos.Labels == nil || len(meta.Thanos.Labels) == 0 { - return errors.Errorf("empty external labels are not allowed for Thanos block.") + return errors.New("empty external labels are not allowed for Thanos block.") } if err := objstore.UploadFile(ctx, logger, bkt, path.Join(bdir, MetaFilename), path.Join(DebugMetas, fmt.Sprintf("%s.json", id))); err != nil { @@ -126,6 +128,34 @@ func cleanUp(logger log.Logger, bkt objstore.Bucket, id ulid.ULID, err error) er return err } +// MarkForDeletion creates a file which stores information about when the block was marked for deletion. +func MarkForDeletion(ctx context.Context, logger log.Logger, bkt objstore.Bucket, id ulid.ULID) error { + deletionMarkFile := path.Join(id.String(), metadata.DeletionMarkFilename) + deletionMarkExists, err := bkt.Exists(ctx, deletionMarkFile) + if err != nil { + return errors.Wrapf(err, "check exists %s in bucket", deletionMarkFile) + } + if deletionMarkExists { + return errors.Errorf("file %s already exists in bucket", deletionMarkFile) + } + + deletionMark, err := json.Marshal(metadata.DeletionMark{ + ID: id, + DeletionTime: time.Now().Unix(), + Version: metadata.DeletionMarkVersion1, + }) + if err != nil { + return errors.Wrap(err, "json encode deletion mark") + } + + if err := bkt.Upload(ctx, deletionMarkFile, bytes.NewReader(deletionMark)); err != nil { + return errors.Wrapf(err, "upload file %s to bucket", deletionMarkFile) + } + + level.Info(logger).Log("msg", "block has been marked for deletion", "block", id) + return nil +} + // Delete removes directory that is meant to be block directory. // NOTE: Always prefer this method for deleting blocks. // * We have to delete block's files in the certain order (meta.json first) @@ -145,16 +175,22 @@ func Delete(ctx context.Context, logger log.Logger, bkt objstore.Bucket, id ulid level.Debug(logger).Log("msg", "deleted file", "file", metaFile, "bucket", bkt.Name()) } - return deleteDir(ctx, logger, bkt, id.String()) + // Delete the bucket, but skip the metaFile as we just deleted that. This is required for eventual object storages (list after write). + return deleteDirRec(ctx, logger, bkt, id.String(), func(name string) bool { + return name == metaFile + }) } -// deleteDir removes all objects prefixed with dir from the bucket. +// deleteDirRec removes all objects prefixed with dir from the bucket. It skips objects that return true for the passed keep function. // NOTE: For objects removal use `block.Delete` strictly. -func deleteDir(ctx context.Context, logger log.Logger, bkt objstore.Bucket, dir string) error { +func deleteDirRec(ctx context.Context, logger log.Logger, bkt objstore.Bucket, dir string, keep func(name string) bool) error { return bkt.Iter(ctx, dir, func(name string) error { // If we hit a directory, call DeleteDir recursively. if strings.HasSuffix(name, objstore.DirDelim) { - return deleteDir(ctx, logger, bkt, name) + return deleteDirRec(ctx, logger, bkt, name, keep) + } + if keep(name) { + return nil } if err := bkt.Delete(ctx, name); err != nil { return err diff --git a/vendor/github.com/thanos-io/thanos/pkg/block/fetcher.go b/vendor/github.com/thanos-io/thanos/pkg/block/fetcher.go index b68141531f..80377041d9 100644 --- a/vendor/github.com/thanos-io/thanos/pkg/block/fetcher.go +++ b/vendor/github.com/thanos-io/thanos/pkg/block/fetcher.go @@ -6,7 +6,6 @@ package block import ( "context" "encoding/json" - stderrors "errors" "io/ioutil" "os" "path" @@ -20,6 +19,7 @@ import ( "github.com/oklog/ulid" "github.com/pkg/errors" "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promauto" "github.com/prometheus/prometheus/pkg/labels" "github.com/prometheus/prometheus/pkg/relabel" "github.com/prometheus/prometheus/tsdb" @@ -32,50 +32,67 @@ import ( "github.com/thanos-io/thanos/pkg/runutil" ) -type syncMetrics struct { +type fetcherMetrics struct { syncs prometheus.Counter syncFailures prometheus.Counter syncDuration prometheus.Histogram - synced *extprom.TxGaugeVec + synced *extprom.TxGaugeVec + modified *extprom.TxGaugeVec +} + +func (s *fetcherMetrics) submit() { + s.synced.Submit() + s.modified.Submit() +} + +func (s *fetcherMetrics) resetTx() { + s.synced.ResetTx() + s.modified.ResetTx() } const ( - syncMetricSubSys = "blocks_meta" + fetcherSubSys = "blocks_meta" corruptedMeta = "corrupted-meta-json" noMeta = "no-meta-json" loadedMeta = "loaded" failedMeta = "failed" - // Filter's label values. + // Synced label values. labelExcludedMeta = "label-excluded" timeExcludedMeta = "time-excluded" tooFreshMeta = "too-fresh" duplicateMeta = "duplicate" + // Blocks that are marked for deletion can be loaded as well. This is done to make sure that we load blocks that are meant to be deleted, + // but don't have a replacement block yet. + markedForDeletionMeta = "marked-for-deletion" + + // Modified label values. + replicaRemovedMeta = "replica-label-removed" ) -func newSyncMetrics(r prometheus.Registerer) *syncMetrics { - var m syncMetrics +func newFetcherMetrics(reg prometheus.Registerer) *fetcherMetrics { + var m fetcherMetrics - m.syncs = prometheus.NewCounter(prometheus.CounterOpts{ - Subsystem: syncMetricSubSys, + m.syncs = promauto.With(reg).NewCounter(prometheus.CounterOpts{ + Subsystem: fetcherSubSys, Name: "syncs_total", Help: "Total blocks metadata synchronization attempts", }) - m.syncFailures = prometheus.NewCounter(prometheus.CounterOpts{ - Subsystem: syncMetricSubSys, + m.syncFailures = promauto.With(reg).NewCounter(prometheus.CounterOpts{ + Subsystem: fetcherSubSys, Name: "sync_failures_total", Help: "Total blocks metadata synchronization failures", }) - m.syncDuration = prometheus.NewHistogram(prometheus.HistogramOpts{ - Subsystem: syncMetricSubSys, + m.syncDuration = promauto.With(reg).NewHistogram(prometheus.HistogramOpts{ + Subsystem: fetcherSubSys, Name: "sync_duration_seconds", Help: "Duration of the blocks metadata synchronization in seconds", Buckets: []float64{0.01, 1, 10, 100, 1000}, }) - m.synced = extprom.NewTxGaugeVec(prometheus.GaugeOpts{ - Subsystem: syncMetricSubSys, + m.synced = extprom.NewTxGaugeVec(reg, prometheus.GaugeOpts{ + Subsystem: fetcherSubSys, Name: "synced", Help: "Number of block metadata synced", }, @@ -88,15 +105,16 @@ func newSyncMetrics(r prometheus.Registerer) *syncMetrics { []string{labelExcludedMeta}, []string{timeExcludedMeta}, []string{duplicateMeta}, + []string{markedForDeletionMeta}, + ) + m.modified = extprom.NewTxGaugeVec(reg, prometheus.GaugeOpts{ + Subsystem: fetcherSubSys, + Name: "modified", + Help: "Number of blocks that their metadata modified", + }, + []string{"modified"}, + []string{replicaRemovedMeta}, ) - if r != nil { - r.MustRegister( - m.syncs, - m.syncFailures, - m.syncDuration, - m.synced, - ) - } return &m } @@ -104,13 +122,16 @@ type MetadataFetcher interface { Fetch(ctx context.Context) (metas map[ulid.ULID]*metadata.Meta, partial map[ulid.ULID]error, err error) } -type GaugeLabeled interface { - WithLabelValues(lvs ...string) prometheus.Gauge +type MetadataFilter interface { + Filter(ctx context.Context, metas map[ulid.ULID]*metadata.Meta, synced *extprom.TxGaugeVec, incompleteView bool) error } -type MetaFetcherFilter func(metas map[ulid.ULID]*metadata.Meta, synced GaugeLabeled, incompleteView bool) +type MetadataModifier interface { + Modify(ctx context.Context, metas map[ulid.ULID]*metadata.Meta, modified *extprom.TxGaugeVec, incompleteView bool) error +} // MetaFetcher is a struct that synchronizes filtered metadata of all block in the object storage with the local state. +// Not go-routine safe. type MetaFetcher struct { logger log.Logger concurrency int @@ -118,15 +139,16 @@ type MetaFetcher struct { // Optional local directory to cache meta.json files. cacheDir string - metrics *syncMetrics + metrics *fetcherMetrics - filters []MetaFetcherFilter + filters []MetadataFilter + modifiers []MetadataModifier cached map[ulid.ULID]*metadata.Meta } // NewMetaFetcher constructs MetaFetcher. -func NewMetaFetcher(logger log.Logger, concurrency int, bkt objstore.BucketReader, dir string, r prometheus.Registerer, filters ...MetaFetcherFilter) (*MetaFetcher, error) { +func NewMetaFetcher(logger log.Logger, concurrency int, bkt objstore.BucketReader, dir string, r prometheus.Registerer, filters []MetadataFilter, modifiers ...MetadataModifier) (*MetaFetcher, error) { if logger == nil { logger = log.NewNopLogger() } @@ -144,8 +166,9 @@ func NewMetaFetcher(logger log.Logger, concurrency int, bkt objstore.BucketReade concurrency: concurrency, bkt: bkt, cacheDir: cacheDir, - metrics: newSyncMetrics(r), + metrics: newFetcherMetrics(r), filters: filters, + modifiers: modifiers, cached: map[ulid.ULID]*metadata.Meta{}, }, nil } @@ -185,7 +208,7 @@ func (s *MetaFetcher) loadMeta(ctx context.Context, id ulid.ULID) (*metadata.Met return m, nil } - if !stderrors.Is(err, os.ErrNotExist) { + if !errors.Is(err, os.ErrNotExist) { level.Warn(s.logger).Log("msg", "best effort read of the local meta.json failed; removing cached block dir", "dir", cachedBlockDir, "err", err) if err := os.RemoveAll(cachedBlockDir); err != nil { level.Warn(s.logger).Log("msg", "best effort remove of cached dir failed; ignoring", "dir", cachedBlockDir, "err", err) @@ -193,8 +216,6 @@ func (s *MetaFetcher) loadMeta(ctx context.Context, id ulid.ULID) (*metadata.Met } } - level.Debug(s.logger).Log("msg", "download meta", "name", metaFile) - r, err := s.bkt.Get(ctx, metaFile) if s.bkt.IsObjNotFoundErr(err) { // Meta.json was deleted between bkt.Exists and here. @@ -258,7 +279,7 @@ func (s *MetaFetcher) Fetch(ctx context.Context) (metas map[ulid.ULID]*metadata. metaErrs tsdberrors.MultiError ) - s.metrics.synced.ResetTx() + s.metrics.resetTx() for i := 0; i < s.concurrency; i++ { wg.Add(1) @@ -355,23 +376,33 @@ func (s *MetaFetcher) Fetch(ctx context.Context) (metas map[ulid.ULID]*metadata. for _, f := range s.filters { // NOTE: filter can update synced metric accordingly to the reason of the exclude. - f(metas, s.metrics.synced, incompleteView) + if err := f.Filter(ctx, metas, s.metrics.synced, incompleteView); err != nil { + return nil, nil, errors.Wrap(err, "filter metas") + } + } + + for _, m := range s.modifiers { + // NOTE: modifier can update modified metric accordingly to the reason of the modification. + if err := m.Modify(ctx, metas, s.metrics.modified, incompleteView); err != nil { + return nil, nil, errors.Wrap(err, "modify metas") + } } s.metrics.synced.WithLabelValues(loadedMeta).Set(float64(len(metas))) - s.metrics.synced.Submit() + s.metrics.submit() if incompleteView { return metas, partial, errors.Wrap(metaErrs, "incomplete view") } - level.Info(s.logger).Log("msg", "successfully fetched block metadata", "duration", time.Since(start).String(), "cached", len(s.cached), "returned", len(metas), "partial", len(partial)) + level.Debug(s.logger).Log("msg", "successfully fetched block metadata", "duration", time.Since(start).String(), "cached", len(s.cached), "returned", len(metas), "partial", len(partial)) return metas, partial, nil } -var _ MetaFetcherFilter = (&TimePartitionMetaFilter{}).Filter +var _ MetadataFilter = &TimePartitionMetaFilter{} // TimePartitionMetaFilter is a MetaFetcher filter that filters out blocks that are outside of specified time range. +// Not go-routine safe. type TimePartitionMetaFilter struct { minTime, maxTime model.TimeOrDurationValue } @@ -382,7 +413,7 @@ func NewTimePartitionMetaFilter(MinTime, MaxTime model.TimeOrDurationValue) *Tim } // Filter filters out blocks that are outside of specified time range. -func (f *TimePartitionMetaFilter) Filter(metas map[ulid.ULID]*metadata.Meta, synced GaugeLabeled, _ bool) { +func (f *TimePartitionMetaFilter) Filter(_ context.Context, metas map[ulid.ULID]*metadata.Meta, synced *extprom.TxGaugeVec, _ bool) error { for id, m := range metas { if m.MaxTime >= f.minTime.PrometheusTimestamp() && m.MinTime <= f.maxTime.PrometheusTimestamp() { continue @@ -390,11 +421,13 @@ func (f *TimePartitionMetaFilter) Filter(metas map[ulid.ULID]*metadata.Meta, syn synced.WithLabelValues(timeExcludedMeta).Inc() delete(metas, id) } + return nil } -var _ MetaFetcherFilter = (&LabelShardedMetaFilter{}).Filter +var _ MetadataFilter = &LabelShardedMetaFilter{} -// LabelShardedMetaFilter is a MetaFetcher filter that filters out blocks that have no labels after relabelling. +// LabelShardedMetaFilter represents struct that allows sharding. +// Not go-routine safe. type LabelShardedMetaFilter struct { relabelConfig []*relabel.Config } @@ -404,18 +437,29 @@ func NewLabelShardedMetaFilter(relabelConfig []*relabel.Config) *LabelShardedMet return &LabelShardedMetaFilter{relabelConfig: relabelConfig} } -// Filter filters out blocks that filters blocks that have no labels after relabelling. -func (f *LabelShardedMetaFilter) Filter(metas map[ulid.ULID]*metadata.Meta, synced GaugeLabeled, _ bool) { +// Special label that will have an ULID of the meta.json being referenced to. +const blockIDLabel = "__block_id" + +// Filter filters out blocks that have no labels after relabelling of each block external (Thanos) labels. +func (f *LabelShardedMetaFilter) Filter(_ context.Context, metas map[ulid.ULID]*metadata.Meta, synced *extprom.TxGaugeVec, _ bool) error { + var lbls labels.Labels for id, m := range metas { - if processedLabels := relabel.Process(labels.FromMap(m.Thanos.Labels), f.relabelConfig...); processedLabels != nil { - continue + lbls = lbls[:0] + lbls = append(lbls, labels.Label{Name: blockIDLabel, Value: id.String()}) + for k, v := range m.Thanos.Labels { + lbls = append(lbls, labels.Label{Name: k, Value: v}) + } + + if processedLabels := relabel.Process(lbls, f.relabelConfig...); len(processedLabels) == 0 { + synced.WithLabelValues(labelExcludedMeta).Inc() + delete(metas, id) } - synced.WithLabelValues(labelExcludedMeta).Inc() - delete(metas, id) } + return nil } // DeduplicateFilter is a MetaFetcher filter that filters out older blocks that have exactly the same data. +// Not go-routine safe. type DeduplicateFilter struct { duplicateIDs []ulid.ULID } @@ -427,7 +471,7 @@ func NewDeduplicateFilter() *DeduplicateFilter { // Filter filters out duplicate blocks that can be formed // from two or more overlapping blocks that fully submatches the source blocks of the older blocks. -func (f *DeduplicateFilter) Filter(metas map[ulid.ULID]*metadata.Meta, synced GaugeLabeled, _ bool) { +func (f *DeduplicateFilter) Filter(_ context.Context, metas map[ulid.ULID]*metadata.Meta, synced *extprom.TxGaugeVec, _ bool) error { var wg sync.WaitGroup metasByResolution := make(map[int64][]*metadata.Meta) @@ -449,9 +493,11 @@ func (f *DeduplicateFilter) Filter(metas map[ulid.ULID]*metadata.Meta, synced Ga } wg.Wait() + + return nil } -func (f *DeduplicateFilter) filterForResolution(root *Node, metaSlice []*metadata.Meta, metas map[ulid.ULID]*metadata.Meta, res int64, synced GaugeLabeled) { +func (f *DeduplicateFilter) filterForResolution(root *Node, metaSlice []*metadata.Meta, metas map[ulid.ULID]*metadata.Meta, res int64, synced *extprom.TxGaugeVec) { sort.Slice(metaSlice, func(i, j int) bool { ilen := len(metaSlice[i].Compaction.Sources) jlen := len(metaSlice[j].Compaction.Sources) @@ -477,8 +523,7 @@ func (f *DeduplicateFilter) filterForResolution(root *Node, metaSlice []*metadat } } -// DuplicateIDs returns slice of block ids -// that are filtered out by DeduplicateFilter. +// DuplicateIDs returns slice of block ids that are filtered out by DeduplicateFilter. func (f *DeduplicateFilter) DuplicateIDs() []ulid.ULID { return f.duplicateIDs } @@ -527,7 +572,36 @@ func contains(s1 []ulid.ULID, s2 []ulid.ULID) bool { return true } +// ReplicaLabelRemover is a MetaFetcher modifier modifies external labels of existing blocks, it removes given replica labels from the metadata of blocks that have it. +type ReplicaLabelRemover struct { + logger log.Logger + + replicaLabels []string +} + +// NewReplicaLabelRemover creates a ReplicaLabelRemover. +func NewReplicaLabelRemover(logger log.Logger, replicaLabels []string) *ReplicaLabelRemover { + return &ReplicaLabelRemover{logger: logger, replicaLabels: replicaLabels} +} + +// Modify modifies external labels of existing blocks, it removes given replica labels from the metadata of blocks that have it. +func (r *ReplicaLabelRemover) Modify(_ context.Context, metas map[ulid.ULID]*metadata.Meta, modified *extprom.TxGaugeVec, _ bool) error { + for u, meta := range metas { + l := meta.Thanos.Labels + for _, replicaLabel := range r.replicaLabels { + if _, exists := l[replicaLabel]; exists { + level.Debug(r.logger).Log("msg", "replica label removed", "label", replicaLabel) + delete(l, replicaLabel) + modified.WithLabelValues(replicaRemovedMeta).Inc() + } + } + metas[u].Thanos.Labels = l + } + return nil +} + // ConsistencyDelayMetaFilter is a MetaFetcher filter that filters out blocks that are created before a specified consistency delay. +// Not go-routine safe. type ConsistencyDelayMetaFilter struct { logger log.Logger consistencyDelay time.Duration @@ -538,13 +612,12 @@ func NewConsistencyDelayMetaFilter(logger log.Logger, consistencyDelay time.Dura if logger == nil { logger = log.NewNopLogger() } - consistencyDelayMetric := prometheus.NewGaugeFunc(prometheus.GaugeOpts{ + _ = promauto.With(reg).NewGaugeFunc(prometheus.GaugeOpts{ Name: "consistency_delay_seconds", Help: "Configured consistency delay in seconds.", }, func() float64 { return consistencyDelay.Seconds() }) - reg.MustRegister(consistencyDelayMetric) return &ConsistencyDelayMetaFilter{ logger: logger, @@ -553,7 +626,7 @@ func NewConsistencyDelayMetaFilter(logger log.Logger, consistencyDelay time.Dura } // Filter filters out blocks that filters blocks that have are created before a specified consistency delay. -func (f *ConsistencyDelayMetaFilter) Filter(metas map[ulid.ULID]*metadata.Meta, synced GaugeLabeled, _ bool) { +func (f *ConsistencyDelayMetaFilter) Filter(_ context.Context, metas map[ulid.ULID]*metadata.Meta, synced *extprom.TxGaugeVec, _ bool) error { for id, meta := range metas { // TODO(khyatisoneji): Remove the checks about Thanos Source // by implementing delete delay to fetch metas. @@ -568,4 +641,57 @@ func (f *ConsistencyDelayMetaFilter) Filter(metas map[ulid.ULID]*metadata.Meta, delete(metas, id) } } + + return nil +} + +// IgnoreDeletionMarkFilter is a filter that filters out the blocks that are marked for deletion after a given delay. +// The delay duration is to make sure that the replacement block can be fetched before we filter out the old block. +// Delay is not considered when computing DeletionMarkBlocks map. +// Not go-routine safe. +type IgnoreDeletionMarkFilter struct { + logger log.Logger + delay time.Duration + bkt objstore.BucketReader + deletionMarkMap map[ulid.ULID]*metadata.DeletionMark +} + +// NewIgnoreDeletionMarkFilter creates IgnoreDeletionMarkFilter. +func NewIgnoreDeletionMarkFilter(logger log.Logger, bkt objstore.BucketReader, delay time.Duration) *IgnoreDeletionMarkFilter { + return &IgnoreDeletionMarkFilter{ + logger: logger, + bkt: bkt, + delay: delay, + } +} + +// DeletionMarkBlocks returns block ids that were marked for deletion. +func (f *IgnoreDeletionMarkFilter) DeletionMarkBlocks() map[ulid.ULID]*metadata.DeletionMark { + return f.deletionMarkMap +} + +// Filter filters out blocks that are marked for deletion after a given delay. +// It also returns the blocks that can be deleted since they were uploaded delay duration before current time. +func (f *IgnoreDeletionMarkFilter) Filter(ctx context.Context, metas map[ulid.ULID]*metadata.Meta, synced *extprom.TxGaugeVec, _ bool) error { + f.deletionMarkMap = make(map[ulid.ULID]*metadata.DeletionMark) + + for id := range metas { + deletionMark, err := metadata.ReadDeletionMark(ctx, f.bkt, f.logger, id.String()) + if err == metadata.ErrorDeletionMarkNotFound { + continue + } + if errors.Cause(err) == metadata.ErrorUnmarshalDeletionMark { + level.Warn(f.logger).Log("msg", "found partial deletion-mark.json; if we will see it happening often for the same block, consider manually deleting deletion-mark.json from the object storage", "block", id, "err", err) + continue + } + if err != nil { + return err + } + f.deletionMarkMap[id] = deletionMark + if time.Since(time.Unix(deletionMark.DeletionTime, 0)).Seconds() > f.delay.Seconds() { + synced.WithLabelValues(markedForDeletionMeta).Inc() + delete(metas, id) + } + } + return nil } diff --git a/vendor/github.com/thanos-io/thanos/pkg/block/metadata/deletionmark.go b/vendor/github.com/thanos-io/thanos/pkg/block/metadata/deletionmark.go new file mode 100644 index 0000000000..bda97e92c6 --- /dev/null +++ b/vendor/github.com/thanos-io/thanos/pkg/block/metadata/deletionmark.go @@ -0,0 +1,76 @@ +// Copyright (c) The Thanos Authors. +// Licensed under the Apache License 2.0. + +package metadata + +import ( + "context" + "encoding/json" + "io/ioutil" + "path" + + "github.com/go-kit/kit/log" + "github.com/oklog/ulid" + "github.com/pkg/errors" + "github.com/thanos-io/thanos/pkg/objstore" + "github.com/thanos-io/thanos/pkg/runutil" +) + +const ( + // DeletionMarkFilename is the known json filename to store details about when block is marked for deletion. + DeletionMarkFilename = "deletion-mark.json" + + // DeletionMarkVersion1 is the version of deletion-mark file supported by Thanos. + DeletionMarkVersion1 = 1 +) + +// ErrorDeletionMarkNotFound is the error when deletion-mark.json file is not found. +var ErrorDeletionMarkNotFound = errors.New("deletion-mark.json not found") + +// ErrorUnmarshalDeletionMark is the error when unmarshalling deletion-mark.json file. +// This error can occur because deletion-mark.json has been partially uploaded to block storage +// or the deletion-mark.json file is not a valid json file. +var ErrorUnmarshalDeletionMark = errors.New("unmarshal deletion-mark.json") + +// DeletionMark stores block id and when block was marked for deletion. +type DeletionMark struct { + // ID of the tsdb block. + ID ulid.ULID `json:"id"` + + // DeletionTime is a unix timestamp of when the block was marked to be deleted. + DeletionTime int64 `json:"deletion_time"` + + // Version of the file. + Version int `json:"version"` +} + +// ReadDeletionMark reads the given deletion mark file from /deletion-mark.json in bucket. +func ReadDeletionMark(ctx context.Context, bkt objstore.BucketReader, logger log.Logger, dir string) (*DeletionMark, error) { + deletionMarkFile := path.Join(dir, DeletionMarkFilename) + + r, err := bkt.Get(ctx, deletionMarkFile) + if err != nil { + if bkt.IsObjNotFoundErr(err) { + return nil, ErrorDeletionMarkNotFound + } + return nil, errors.Wrapf(err, "get file: %s", deletionMarkFile) + } + + defer runutil.CloseWithLogOnErr(logger, r, "close bkt deletion-mark reader") + + metaContent, err := ioutil.ReadAll(r) + if err != nil { + return nil, errors.Wrapf(err, "read file: %s", deletionMarkFile) + } + + deletionMark := DeletionMark{} + if err := json.Unmarshal(metaContent, &deletionMark); err != nil { + return nil, errors.Wrapf(ErrorUnmarshalDeletionMark, "file: %s; err: %v", deletionMarkFile, err.Error()) + } + + if deletionMark.Version != DeletionMarkVersion1 { + return nil, errors.Errorf("unexpected deletion-mark file version %d", deletionMark.Version) + } + + return &deletionMark, nil +} diff --git a/vendor/github.com/thanos-io/thanos/pkg/cacheutil/memcached_client.go b/vendor/github.com/thanos-io/thanos/pkg/cacheutil/memcached_client.go index 2785f59d00..9c522bcc7c 100644 --- a/vendor/github.com/thanos-io/thanos/pkg/cacheutil/memcached_client.go +++ b/vendor/github.com/thanos-io/thanos/pkg/cacheutil/memcached_client.go @@ -13,16 +13,19 @@ import ( "github.com/go-kit/kit/log/level" "github.com/pkg/errors" "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promauto" "github.com/thanos-io/thanos/pkg/discovery/dns" "github.com/thanos-io/thanos/pkg/extprom" "github.com/thanos-io/thanos/pkg/gate" + "github.com/thanos-io/thanos/pkg/model" "github.com/thanos-io/thanos/pkg/tracing" yaml "gopkg.in/yaml.v2" ) const ( - opSet = "set" - opGetMulti = "getmulti" + opSet = "set" + opGetMulti = "getmulti" + reasonMaxItemSize = "max-item-size" ) var ( @@ -34,6 +37,7 @@ var ( MaxIdleConnections: 100, MaxAsyncConcurrency: 20, MaxAsyncBufferSize: 10000, + MaxItemSize: model.Bytes(1024 * 1024), MaxGetMultiConcurrency: 100, MaxGetMultiBatchSize: 0, DNSProviderUpdateInterval: 10 * time.Second, @@ -87,6 +91,11 @@ type MemcachedClientConfig struct { // running GetMulti() operations. If set to 0, concurrency is unlimited. MaxGetMultiConcurrency int `yaml:"max_get_multi_concurrency"` + // MaxItemSize specifies the maximum size of an item stored in memcached. Bigger + // items are skipped to be stored by the client. If set to 0, no maximum size is + // enforced. + MaxItemSize model.Bytes `yaml:"max_item_size"` + // MaxGetMultiBatchSize specifies the maximum number of keys a single underlying // GetMulti() should run. If more keys are specified, internally keys are splitted // into multiple batches and fetched concurrently, honoring MaxGetMultiConcurrency @@ -139,6 +148,7 @@ type memcachedClient struct { // Tracked metrics. operations *prometheus.CounterVec failures *prometheus.CounterVec + skipped *prometheus.CounterVec duration *prometheus.HistogramVec } @@ -202,29 +212,31 @@ func newMemcachedClient( ), } - c.operations = prometheus.NewCounterVec(prometheus.CounterOpts{ + c.operations = promauto.With(reg).NewCounterVec(prometheus.CounterOpts{ Name: "thanos_memcached_operations_total", Help: "Total number of operations against memcached.", ConstLabels: prometheus.Labels{"name": name}, }, []string{"operation"}) - c.failures = prometheus.NewCounterVec(prometheus.CounterOpts{ + c.failures = promauto.With(reg).NewCounterVec(prometheus.CounterOpts{ Name: "thanos_memcached_operation_failures_total", Help: "Total number of operations against memcached that failed.", ConstLabels: prometheus.Labels{"name": name}, }, []string{"operation"}) - c.duration = prometheus.NewHistogramVec(prometheus.HistogramOpts{ + c.skipped = promauto.With(reg).NewCounterVec(prometheus.CounterOpts{ + Name: "thanos_memcached_operation_skipped_total", + Help: "Total number of operations against memcached that have been skipped.", + ConstLabels: prometheus.Labels{"name": name}, + }, []string{"operation", "reason"}) + + c.duration = promauto.With(reg).NewHistogramVec(prometheus.HistogramOpts{ Name: "thanos_memcached_operation_duration_seconds", Help: "Duration of operations against memcached.", ConstLabels: prometheus.Labels{"name": name}, Buckets: []float64{0.001, 0.005, 0.01, 0.025, 0.05, 0.1, 0.2, 0.5, 1}, }, []string{"operation"}) - if reg != nil { - reg.MustRegister(c.operations, c.failures, c.duration) - } - // As soon as the client is created it must ensure that memcached server // addresses are resolved, so we're going to trigger an initial addresses // resolution here. @@ -252,21 +264,27 @@ func (c *memcachedClient) Stop() { c.workers.Wait() } -func (c *memcachedClient) SetAsync(ctx context.Context, key string, value []byte, ttl time.Duration) error { +func (c *memcachedClient) SetAsync(ctx context.Context, key string, value []byte, ttl time.Duration) (err error) { + // Skip hitting memcached at all if the item is bigger than the max allowed size. + if c.config.MaxItemSize > 0 && uint64(len(value)) > uint64(c.config.MaxItemSize) { + c.skipped.WithLabelValues(opSet, reasonMaxItemSize).Inc() + return nil + } + return c.enqueueAsync(func() { start := time.Now() c.operations.WithLabelValues(opSet).Inc() - span, _ := tracing.StartSpan(ctx, "memcached_set") - err := c.client.Set(&memcache.Item{ - Key: key, - Value: value, - Expiration: int32(time.Now().Add(ttl).Unix()), + tracing.DoInSpan(ctx, "memcached_set", func(ctx context.Context) { + err = c.client.Set(&memcache.Item{ + Key: key, + Value: value, + Expiration: int32(time.Now().Add(ttl).Unix()), + }) }) - span.Finish() if err != nil { c.failures.WithLabelValues(opSet).Inc() - level.Warn(c.logger).Log("msg", "failed to store item to memcached", "key", key, "err", err) + level.Warn(c.logger).Log("msg", "failed to store item to memcached", "key", key, "sizeBytes", len(value), "err", err) return } @@ -275,9 +293,13 @@ func (c *memcachedClient) SetAsync(ctx context.Context, key string, value []byte } func (c *memcachedClient) GetMulti(ctx context.Context, keys []string) map[string][]byte { + if len(keys) == 0 { + return nil + } + batches, err := c.getMultiBatched(ctx, keys) if err != nil { - level.Warn(c.logger).Log("msg", "failed to fetch items from memcached", "err", err) + level.Warn(c.logger).Log("msg", "failed to fetch items from memcached", "numKeys", len(keys), "firstKey", keys[0], "err", err) // In case we have both results and an error, it means some batch requests // failed and other succeeded. In this case we prefer to log it and move on, @@ -358,13 +380,14 @@ func (c *memcachedClient) getMultiBatched(ctx context.Context, keys []string) ([ return items, lastErr } -func (c *memcachedClient) getMultiSingle(ctx context.Context, keys []string) (map[string]*memcache.Item, error) { +func (c *memcachedClient) getMultiSingle(ctx context.Context, keys []string) (items map[string]*memcache.Item, err error) { // Wait until we get a free slot from the gate, if the max // concurrency should be enforced. if c.config.MaxGetMultiConcurrency > 0 { - span, _ := tracing.StartSpan(ctx, "memcached_getmulti_gate_ismyturn") - err := c.getMultiGate.IsMyTurn(ctx) - span.Finish() + tracing.DoInSpan(ctx, "memcached_getmulti_gate_ismyturn", func(ctx context.Context) { + // TODO(bwplotka): Consider putting span directly in gate. + err = c.getMultiGate.IsMyTurn(ctx) + }) if err != nil { return nil, errors.Wrapf(err, "failed to wait for turn") } @@ -373,10 +396,9 @@ func (c *memcachedClient) getMultiSingle(ctx context.Context, keys []string) (ma start := time.Now() c.operations.WithLabelValues(opGetMulti).Inc() - - span, _ := tracing.StartSpan(ctx, "memcached_getmulti") - items, err := c.client.GetMulti(keys) - span.Finish() + tracing.DoInSpan(ctx, "memcached_getmulti", func(ctx context.Context) { + items, err = c.client.GetMulti(keys) + }) if err != nil { c.failures.WithLabelValues(opGetMulti).Inc() } else { diff --git a/vendor/github.com/thanos-io/thanos/pkg/compact/blocks_cleaner.go b/vendor/github.com/thanos-io/thanos/pkg/compact/blocks_cleaner.go new file mode 100644 index 0000000000..820346a1bf --- /dev/null +++ b/vendor/github.com/thanos-io/thanos/pkg/compact/blocks_cleaner.go @@ -0,0 +1,58 @@ +// Copyright (c) The Thanos Authors. +// Licensed under the Apache License 2.0. + +package compact + +import ( + "context" + "time" + + "github.com/go-kit/kit/log" + "github.com/go-kit/kit/log/level" + "github.com/pkg/errors" + "github.com/prometheus/client_golang/prometheus" + "github.com/thanos-io/thanos/pkg/block" + "github.com/thanos-io/thanos/pkg/objstore" +) + +// BlocksCleaner is a struct that deletes blocks from bucket which are marked for deletion. +type BlocksCleaner struct { + logger log.Logger + ignoreDeletionMarkFilter *block.IgnoreDeletionMarkFilter + bkt objstore.Bucket + deleteDelay time.Duration + blocksCleaned prometheus.Counter + blockCleanupFailures prometheus.Counter +} + +// NewBlocksCleaner creates a new BlocksCleaner. +func NewBlocksCleaner(logger log.Logger, bkt objstore.Bucket, ignoreDeletionMarkFilter *block.IgnoreDeletionMarkFilter, deleteDelay time.Duration, blocksCleaned prometheus.Counter, blockCleanupFailures prometheus.Counter) *BlocksCleaner { + return &BlocksCleaner{ + logger: logger, + ignoreDeletionMarkFilter: ignoreDeletionMarkFilter, + bkt: bkt, + deleteDelay: deleteDelay, + blocksCleaned: blocksCleaned, + blockCleanupFailures: blockCleanupFailures, + } +} + +// DeleteMarkedBlocks uses ignoreDeletionMarkFilter to delete the blocks that are marked for deletion. +func (s *BlocksCleaner) DeleteMarkedBlocks(ctx context.Context) error { + level.Info(s.logger).Log("msg", "started cleaning of blocks marked for deletion") + + deletionMarkMap := s.ignoreDeletionMarkFilter.DeletionMarkBlocks() + for _, deletionMark := range deletionMarkMap { + if time.Since(time.Unix(deletionMark.DeletionTime, 0)).Seconds() > s.deleteDelay.Seconds() { + if err := block.Delete(ctx, s.logger, s.bkt, deletionMark.ID); err != nil { + s.blockCleanupFailures.Inc() + return errors.Wrap(err, "delete block") + } + s.blocksCleaned.Inc() + level.Info(s.logger).Log("msg", "deleted block marked for deletion", "block", deletionMark.ID) + } + } + + level.Info(s.logger).Log("msg", "cleaning of blocks marked for deletion done") + return nil +} diff --git a/vendor/github.com/thanos-io/thanos/pkg/compact/clean.go b/vendor/github.com/thanos-io/thanos/pkg/compact/clean.go index af681a940e..14fdfc4d7c 100644 --- a/vendor/github.com/thanos-io/thanos/pkg/compact/clean.go +++ b/vendor/github.com/thanos-io/thanos/pkg/compact/clean.go @@ -21,7 +21,7 @@ const ( PartialUploadThresholdAge = 2 * 24 * time.Hour ) -func BestEffortCleanAbortedPartialUploads(ctx context.Context, logger log.Logger, fetcher block.MetadataFetcher, bkt objstore.Bucket, deleteAttempts prometheus.Counter) { +func BestEffortCleanAbortedPartialUploads(ctx context.Context, logger log.Logger, fetcher block.MetadataFetcher, bkt objstore.Bucket, deleteAttempts prometheus.Counter, blocksMarkedForDeletion prometheus.Counter) { level.Info(logger).Log("msg", "started cleaning of aborted partial uploads") _, partial, err := fetcher.Fetch(ctx) if err != nil { @@ -41,10 +41,11 @@ func BestEffortCleanAbortedPartialUploads(ctx context.Context, logger log.Logger } deleteAttempts.Inc() - if err := block.Delete(ctx, logger, bkt, id); err != nil { + if err := block.MarkForDeletion(ctx, logger, bkt, id); err != nil { level.Warn(logger).Log("msg", "failed to delete aborted partial upload; skipping", "block", id, "thresholdAge", PartialUploadThresholdAge, "err", err) return } + blocksMarkedForDeletion.Inc() level.Info(logger).Log("msg", "deleted aborted partial upload", "block", id, "thresholdAge", PartialUploadThresholdAge) } level.Info(logger).Log("msg", "cleaning of aborted partial uploads done") diff --git a/vendor/github.com/thanos-io/thanos/pkg/compact/compact.go b/vendor/github.com/thanos-io/thanos/pkg/compact/compact.go index 3a963783f8..6443ba5ae8 100644 --- a/vendor/github.com/thanos-io/thanos/pkg/compact/compact.go +++ b/vendor/github.com/thanos-io/thanos/pkg/compact/compact.go @@ -18,6 +18,7 @@ import ( "github.com/oklog/ulid" "github.com/pkg/errors" "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promauto" "github.com/prometheus/prometheus/pkg/labels" "github.com/prometheus/prometheus/tsdb" terrors "github.com/prometheus/prometheus/tsdb/errors" @@ -50,6 +51,7 @@ type Syncer struct { acceptMalformedIndex bool enableVerticalCompaction bool duplicateBlocksFilter *block.DeduplicateFilter + ignoreDeletionMarkFilter *block.IgnoreDeletionMarkFilter } type syncerMetrics struct { @@ -62,82 +64,72 @@ type syncerMetrics struct { compactionRunsCompleted *prometheus.CounterVec compactionFailures *prometheus.CounterVec verticalCompactions *prometheus.CounterVec + blocksMarkedForDeletion prometheus.Counter } -func newSyncerMetrics(reg prometheus.Registerer) *syncerMetrics { +func newSyncerMetrics(reg prometheus.Registerer, blocksMarkedForDeletion prometheus.Counter) *syncerMetrics { var m syncerMetrics - m.garbageCollectedBlocks = prometheus.NewCounter(prometheus.CounterOpts{ + m.garbageCollectedBlocks = promauto.With(reg).NewCounter(prometheus.CounterOpts{ Name: "thanos_compact_garbage_collected_blocks_total", Help: "Total number of deleted blocks by compactor.", }) - m.garbageCollections = prometheus.NewCounter(prometheus.CounterOpts{ + m.garbageCollections = promauto.With(reg).NewCounter(prometheus.CounterOpts{ Name: "thanos_compact_garbage_collection_total", Help: "Total number of garbage collection operations.", }) - m.garbageCollectionFailures = prometheus.NewCounter(prometheus.CounterOpts{ + m.garbageCollectionFailures = promauto.With(reg).NewCounter(prometheus.CounterOpts{ Name: "thanos_compact_garbage_collection_failures_total", Help: "Total number of failed garbage collection operations.", }) - m.garbageCollectionDuration = prometheus.NewHistogram(prometheus.HistogramOpts{ + m.garbageCollectionDuration = promauto.With(reg).NewHistogram(prometheus.HistogramOpts{ Name: "thanos_compact_garbage_collection_duration_seconds", Help: "Time it took to perform garbage collection iteration.", Buckets: []float64{0.01, 0.1, 0.3, 0.6, 1, 3, 6, 9, 20, 30, 60, 90, 120, 240, 360, 720}, }) - m.compactions = prometheus.NewCounterVec(prometheus.CounterOpts{ + m.compactions = promauto.With(reg).NewCounterVec(prometheus.CounterOpts{ Name: "thanos_compact_group_compactions_total", Help: "Total number of group compaction attempts that resulted in a new block.", }, []string{"group"}) - m.compactionRunsStarted = prometheus.NewCounterVec(prometheus.CounterOpts{ + m.compactionRunsStarted = promauto.With(reg).NewCounterVec(prometheus.CounterOpts{ Name: "thanos_compact_group_compaction_runs_started_total", Help: "Total number of group compaction attempts.", }, []string{"group"}) - m.compactionRunsCompleted = prometheus.NewCounterVec(prometheus.CounterOpts{ + m.compactionRunsCompleted = promauto.With(reg).NewCounterVec(prometheus.CounterOpts{ Name: "thanos_compact_group_compaction_runs_completed_total", Help: "Total number of group completed compaction runs. This also includes compactor group runs that resulted with no compaction.", }, []string{"group"}) - m.compactionFailures = prometheus.NewCounterVec(prometheus.CounterOpts{ + m.compactionFailures = promauto.With(reg).NewCounterVec(prometheus.CounterOpts{ Name: "thanos_compact_group_compactions_failures_total", Help: "Total number of failed group compactions.", }, []string{"group"}) - m.verticalCompactions = prometheus.NewCounterVec(prometheus.CounterOpts{ + m.verticalCompactions = promauto.With(reg).NewCounterVec(prometheus.CounterOpts{ Name: "thanos_compact_group_vertical_compactions_total", Help: "Total number of group compaction attempts that resulted in a new block based on overlapping blocks.", }, []string{"group"}) + m.blocksMarkedForDeletion = blocksMarkedForDeletion - if reg != nil { - reg.MustRegister( - m.garbageCollectedBlocks, - m.garbageCollections, - m.garbageCollectionFailures, - m.garbageCollectionDuration, - m.compactions, - m.compactionRunsStarted, - m.compactionRunsCompleted, - m.compactionFailures, - m.verticalCompactions, - ) - } return &m } // NewMetaSyncer returns a new Syncer for the given Bucket and directory. // Blocks must be at least as old as the sync delay for being considered. -func NewSyncer(logger log.Logger, reg prometheus.Registerer, bkt objstore.Bucket, fetcher block.MetadataFetcher, duplicateBlocksFilter *block.DeduplicateFilter, blockSyncConcurrency int, acceptMalformedIndex bool, enableVerticalCompaction bool) (*Syncer, error) { +func NewSyncer(logger log.Logger, reg prometheus.Registerer, bkt objstore.Bucket, fetcher block.MetadataFetcher, duplicateBlocksFilter *block.DeduplicateFilter, ignoreDeletionMarkFilter *block.IgnoreDeletionMarkFilter, blocksMarkedForDeletion prometheus.Counter, blockSyncConcurrency int, acceptMalformedIndex bool, enableVerticalCompaction bool) (*Syncer, error) { if logger == nil { logger = log.NewNopLogger() } return &Syncer{ - logger: logger, - reg: reg, - bkt: bkt, - fetcher: fetcher, - blocks: map[ulid.ULID]*metadata.Meta{}, - metrics: newSyncerMetrics(reg), - duplicateBlocksFilter: duplicateBlocksFilter, - blockSyncConcurrency: blockSyncConcurrency, - acceptMalformedIndex: acceptMalformedIndex, + logger: logger, + reg: reg, + bkt: bkt, + fetcher: fetcher, + blocks: map[ulid.ULID]*metadata.Meta{}, + metrics: newSyncerMetrics(reg, blocksMarkedForDeletion), + duplicateBlocksFilter: duplicateBlocksFilter, + ignoreDeletionMarkFilter: ignoreDeletionMarkFilter, + blockSyncConcurrency: blockSyncConcurrency, + acceptMalformedIndex: acceptMalformedIndex, // The syncer offers an option to enable vertical compaction, even if it's // not currently used by Thanos, because the compactor is also used by Cortex // which needs vertical compaction. @@ -157,7 +149,7 @@ func UntilNextDownsampling(m *metadata.Meta) (time.Duration, error) { case downsample.ResLevel0: return time.Duration(downsample.DownsampleRange0*time.Millisecond) - timeRange, nil default: - panic(fmt.Errorf("invalid resolution %v", m.Thanos.Downsample.Resolution)) + panic(errors.Errorf("invalid resolution %v", m.Thanos.Downsample.Resolution)) } } @@ -195,10 +187,11 @@ func (s *Syncer) Groups() (res []*Group, err error) { groupKey := GroupKey(m.Thanos) g, ok := groups[groupKey] if !ok { + lbls := labels.FromMap(m.Thanos.Labels) g, err = newGroup( - log.With(s.logger, "compactionGroup", groupKey), + log.With(s.logger, "compactionGroup", fmt.Sprintf("%d@%v", m.Thanos.Downsample.Resolution, lbls.String()), "compactionGroupKey", groupKey), s.bkt, - labels.FromMap(m.Thanos.Labels), + lbls, m.Thanos.Downsample.Resolution, s.acceptMalformedIndex, s.enableVerticalCompaction, @@ -208,6 +201,7 @@ func (s *Syncer) Groups() (res []*Group, err error) { s.metrics.compactionFailures.WithLabelValues(groupKey), s.metrics.verticalCompactions.WithLabelValues(groupKey), s.metrics.garbageCollectedBlocks, + s.metrics.blocksMarkedForDeletion, ) if err != nil { return nil, errors.Wrap(err, "create compaction group") @@ -234,8 +228,19 @@ func (s *Syncer) GarbageCollect(ctx context.Context) error { begin := time.Now() - garbageIds := s.duplicateBlocksFilter.DuplicateIDs() - for _, id := range garbageIds { + duplicateIDs := s.duplicateBlocksFilter.DuplicateIDs() + deletionMarkMap := s.ignoreDeletionMarkFilter.DeletionMarkBlocks() + + // GarbageIDs contains the duplicateIDs, since these blocks can be replaced with other blocks. + // We also remove ids present in deletionMarkMap since these blocks are already marked for deletion. + garbageIDs := []ulid.ULID{} + for _, id := range duplicateIDs { + if _, exists := deletionMarkMap[id]; !exists { + garbageIDs = append(garbageIDs, id) + } + } + + for _, id := range garbageIDs { if ctx.Err() != nil { return ctx.Err() } @@ -243,14 +248,15 @@ func (s *Syncer) GarbageCollect(ctx context.Context) error { // Spawn a new context so we always delete a block in full on shutdown. delCtx, cancel := context.WithTimeout(context.Background(), 5*time.Minute) - level.Info(s.logger).Log("msg", "deleting outdated block", "block", id) + level.Info(s.logger).Log("msg", "marking outdated block for deletion", "block", id) - err := block.Delete(delCtx, s.logger, s.bkt, id) + err := block.MarkForDeletion(delCtx, s.logger, s.bkt, id) cancel() if err != nil { s.metrics.garbageCollectionFailures.Inc() return retry(errors.Wrapf(err, "delete block %s from bucket", id)) } + s.metrics.blocksMarkedForDeletion.Inc() // Immediately update our in-memory state so no further call to SyncMetas is needed // after running garbage collection. @@ -279,6 +285,7 @@ type Group struct { compactionFailures prometheus.Counter verticalCompactions prometheus.Counter groupGarbageCollectedBlocks prometheus.Counter + blocksMarkedForDeletion prometheus.Counter } // newGroup returns a new compaction group. @@ -295,6 +302,7 @@ func newGroup( compactionFailures prometheus.Counter, verticalCompactions prometheus.Counter, groupGarbageCollectedBlocks prometheus.Counter, + blocksMarkedForDeletion prometheus.Counter, ) (*Group, error) { if logger == nil { logger = log.NewNopLogger() @@ -313,6 +321,7 @@ func newGroup( compactionFailures: compactionFailures, verticalCompactions: verticalCompactions, groupGarbageCollectedBlocks: groupGarbageCollectedBlocks, + blocksMarkedForDeletion: blocksMarkedForDeletion, } return g, nil } @@ -427,7 +436,7 @@ func (e HaltError) Error() string { // IsHaltError returns true if the base error is a HaltError. // If a multierror is passed, any halt error will return true. func IsHaltError(err error) bool { - if multiErr, ok := err.(terrors.MultiError); ok { + if multiErr, ok := errors.Cause(err).(terrors.MultiError); ok { for _, err := range multiErr { if _, ok := errors.Cause(err).(HaltError); ok { return true @@ -508,7 +517,7 @@ func (cg *Group) areBlocksOverlapping(include *metadata.Meta, excludeDirs ...str } // RepairIssue347 repairs the https://github.com/prometheus/tsdb/issues/347 issue when having issue347Error. -func RepairIssue347(ctx context.Context, logger log.Logger, bkt objstore.Bucket, issue347Err error) error { +func RepairIssue347(ctx context.Context, logger log.Logger, bkt objstore.Bucket, blocksMarkedForDeletion prometheus.Counter, issue347Err error) error { ie, ok := errors.Cause(issue347Err).(Issue347Error) if !ok { return errors.Errorf("Given error is not an issue347 error: %v", issue347Err) @@ -559,10 +568,10 @@ func RepairIssue347(ctx context.Context, logger log.Logger, bkt objstore.Bucket, defer cancel() // TODO(bplotka): Issue with this will introduce overlap that will halt compactor. Automate that (fix duplicate overlaps caused by this). - if err := block.Delete(delCtx, logger, bkt, ie.id); err != nil { + if err := block.MarkForDeletion(delCtx, logger, bkt, ie.id); err != nil { return errors.Wrapf(err, "deleting old block %s failed. You need to delete this block manually", ie.id) } - + blocksMarkedForDeletion.Inc() return nil } @@ -573,6 +582,8 @@ func (cg *Group) compact(ctx context.Context, dir string, comp tsdb.Compactor) ( // Check for overlapped blocks. overlappingBlocks := false if err := cg.areBlocksOverlapping(nil); err != nil { + // TODO(bwplotka): It would really nice if we could still check for other overlaps than replica. In fact this should be checked + // in syncer itself. Otherwise with vertical compaction enabled we will sacrifice this important check. if !cg.enableVerticalCompaction { return false, ulid.ULID{}, halt(errors.Wrap(err, "pre compaction overlap check")) } @@ -690,7 +701,7 @@ func (cg *Group) compact(ctx context.Context, dir string, comp tsdb.Compactor) ( if overlappingBlocks { cg.verticalCompactions.Inc() } - level.Debug(cg.logger).Log("msg", "compacted blocks", + level.Info(cg.logger).Log("msg", "compacted blocks", "blocks", fmt.Sprintf("%v", plan), "duration", time.Since(begin), "overlapping_blocks", overlappingBlocks) bdir := filepath.Join(dir, compID.String()) @@ -732,7 +743,7 @@ func (cg *Group) compact(ctx context.Context, dir string, comp tsdb.Compactor) ( if err := block.Upload(ctx, cg.logger, cg.bkt, bdir); err != nil { return false, ulid.ULID{}, retry(errors.Wrapf(err, "upload of %s failed", compID)) } - level.Debug(cg.logger).Log("msg", "uploaded block", "result_block", compID, "duration", time.Since(begin)) + level.Info(cg.logger).Log("msg", "uploaded block", "result_block", compID, "duration", time.Since(begin)) // Delete the blocks we just compacted from the group and bucket so they do not get included // into the next planning cycle. @@ -760,10 +771,11 @@ func (cg *Group) deleteBlock(b string) error { // Spawn a new context so we always delete a block in full on shutdown. delCtx, cancel := context.WithTimeout(context.Background(), 5*time.Minute) defer cancel() - level.Info(cg.logger).Log("msg", "deleting compacted block", "old_block", id) - if err := block.Delete(delCtx, cg.logger, cg.bkt, id); err != nil { + level.Info(cg.logger).Log("msg", "marking compacted block for deletion", "old_block", id) + if err := block.MarkForDeletion(delCtx, cg.logger, cg.bkt, id); err != nil { return errors.Wrapf(err, "delete block %s from bucket", id) } + cg.blocksMarkedForDeletion.Inc() return nil } @@ -837,14 +849,14 @@ func (c *BucketCompactor) Compact(ctx context.Context) error { } if IsIssue347Error(err) { - if err := RepairIssue347(workCtx, c.logger, c.bkt, err); err == nil { + if err := RepairIssue347(workCtx, c.logger, c.bkt, c.sy.metrics.blocksMarkedForDeletion, err); err == nil { mtx.Lock() finishedAllGroups = false mtx.Unlock() continue } } - errChan <- errors.Wrap(err, fmt.Sprintf("compaction failed for group %s", g.Key())) + errChan <- errors.Wrapf(err, "group %s", g.Key()) return } }() diff --git a/vendor/github.com/thanos-io/thanos/pkg/compact/downsample/streamed_block_writer.go b/vendor/github.com/thanos-io/thanos/pkg/compact/downsample/streamed_block_writer.go index 267a93bfab..a987c6fa95 100644 --- a/vendor/github.com/thanos-io/thanos/pkg/compact/downsample/streamed_block_writer.go +++ b/vendor/github.com/thanos-io/thanos/pkg/compact/downsample/streamed_block_writer.go @@ -108,7 +108,7 @@ func NewStreamedBlockWriter( // labelsValues sets and memPostings to be written on the finalize state in the end of downsampling process. func (w *streamedBlockWriter) WriteSeries(lset labels.Labels, chunks []chunks.Meta) error { if w.finalized || w.ignoreFinalize { - return errors.Errorf("series can't be added, writers has been closed or internal error happened") + return errors.New("series can't be added, writers has been closed or internal error happened") } if len(chunks) == 0 { diff --git a/vendor/github.com/thanos-io/thanos/pkg/compact/retention.go b/vendor/github.com/thanos-io/thanos/pkg/compact/retention.go index 47f61f0cfb..eb07507d9d 100644 --- a/vendor/github.com/thanos-io/thanos/pkg/compact/retention.go +++ b/vendor/github.com/thanos-io/thanos/pkg/compact/retention.go @@ -10,13 +10,14 @@ import ( "github.com/go-kit/kit/log" "github.com/go-kit/kit/log/level" "github.com/pkg/errors" + "github.com/prometheus/client_golang/prometheus" "github.com/thanos-io/thanos/pkg/block" "github.com/thanos-io/thanos/pkg/objstore" ) // ApplyRetentionPolicyByResolution removes blocks depending on the specified retentionByResolution based on blocks MaxTime. // A value of 0 disables the retention for its resolution. -func ApplyRetentionPolicyByResolution(ctx context.Context, logger log.Logger, bkt objstore.Bucket, fetcher block.MetadataFetcher, retentionByResolution map[ResolutionLevel]time.Duration) error { +func ApplyRetentionPolicyByResolution(ctx context.Context, logger log.Logger, bkt objstore.Bucket, fetcher block.MetadataFetcher, retentionByResolution map[ResolutionLevel]time.Duration, blocksMarkedForDeletion prometheus.Counter) error { level.Info(logger).Log("msg", "start optional retention") metas, _, err := fetcher.Fetch(ctx) if err != nil { @@ -31,10 +32,11 @@ func ApplyRetentionPolicyByResolution(ctx context.Context, logger log.Logger, bk maxTime := time.Unix(m.MaxTime/1000, 0) if time.Now().After(maxTime.Add(retentionDuration)) { - level.Info(logger).Log("msg", "applying retention: deleting block", "id", id, "maxTime", maxTime.String()) - if err := block.Delete(ctx, logger, bkt, id); err != nil { + level.Info(logger).Log("msg", "applying retention: marking block for deletion", "id", id, "maxTime", maxTime.String()) + if err := block.MarkForDeletion(ctx, logger, bkt, id); err != nil { return errors.Wrap(err, "delete block") } + blocksMarkedForDeletion.Inc() } } diff --git a/vendor/github.com/thanos-io/thanos/pkg/component/component.go b/vendor/github.com/thanos-io/thanos/pkg/component/component.go index 675caa6034..f86ae85503 100644 --- a/vendor/github.com/thanos-io/thanos/pkg/component/component.go +++ b/vendor/github.com/thanos-io/thanos/pkg/component/component.go @@ -95,4 +95,5 @@ var ( Sidecar = sourceStoreAPI{component: component{name: "sidecar"}} Store = sourceStoreAPI{component: component{name: "store"}} Receive = sourceStoreAPI{component: component{name: "receive"}} + Replicate = sourceStoreAPI{component: component{name: "replicate"}} ) diff --git a/vendor/github.com/thanos-io/thanos/pkg/discovery/dns/miekgdns/lookup.go b/vendor/github.com/thanos-io/thanos/pkg/discovery/dns/miekgdns/lookup.go index 4e3fb492e2..b9b95ce908 100644 --- a/vendor/github.com/thanos-io/thanos/pkg/discovery/dns/miekgdns/lookup.go +++ b/vendor/github.com/thanos-io/thanos/pkg/discovery/dns/miekgdns/lookup.go @@ -140,7 +140,7 @@ func askServerForName(name string, qType dns.Type, client *dns.Client, servAddr if response.Truncated { if client.Net == "tcp" { - return nil, errors.Errorf("got truncated message on TCP (64kiB limit exceeded?)") + return nil, errors.New("got truncated message on TCP (64kiB limit exceeded?)") } // TCP fallback. diff --git a/vendor/github.com/thanos-io/thanos/pkg/discovery/dns/provider.go b/vendor/github.com/thanos-io/thanos/pkg/discovery/dns/provider.go index a3e0730730..5df9e97320 100644 --- a/vendor/github.com/thanos-io/thanos/pkg/discovery/dns/provider.go +++ b/vendor/github.com/thanos-io/thanos/pkg/discovery/dns/provider.go @@ -12,7 +12,9 @@ import ( "github.com/go-kit/kit/log" "github.com/go-kit/kit/log/level" "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promauto" "github.com/thanos-io/thanos/pkg/discovery/dns/miekgdns" + "github.com/thanos-io/thanos/pkg/extprom" ) // Provider is a stateful cache for asynchronous DNS resolutions. It provides a way to resolve addresses and obtain them. @@ -23,7 +25,7 @@ type Provider struct { resolved map[string][]string logger log.Logger - resolverAddrs *prometheus.GaugeVec + resolverAddrs *extprom.TxGaugeVec resolverLookupsCount prometheus.Counter resolverFailuresCount prometheus.Counter } @@ -56,26 +58,20 @@ func NewProvider(logger log.Logger, reg prometheus.Registerer, resolverType Reso resolver: NewResolver(resolverType.ToResolver(logger)), resolved: make(map[string][]string), logger: logger, - resolverAddrs: prometheus.NewGaugeVec(prometheus.GaugeOpts{ + resolverAddrs: extprom.NewTxGaugeVec(reg, prometheus.GaugeOpts{ Name: "dns_provider_results", Help: "The number of resolved endpoints for each configured address", }, []string{"addr"}), - resolverLookupsCount: prometheus.NewCounter(prometheus.CounterOpts{ + resolverLookupsCount: promauto.With(reg).NewCounter(prometheus.CounterOpts{ Name: "dns_lookups_total", Help: "The number of DNS lookups resolutions attempts", }), - resolverFailuresCount: prometheus.NewCounter(prometheus.CounterOpts{ + resolverFailuresCount: promauto.With(reg).NewCounter(prometheus.CounterOpts{ Name: "dns_failures_total", Help: "The number of DNS lookup failures", }), } - if reg != nil { - reg.MustRegister(p.resolverAddrs) - reg.MustRegister(p.resolverLookupsCount) - reg.MustRegister(p.resolverFailuresCount) - } - return p } @@ -98,12 +94,17 @@ func (p *Provider) Resolve(ctx context.Context, addrs []string) { p.Lock() defer p.Unlock() + p.resolverAddrs.ResetTx() + defer p.resolverAddrs.Submit() + + resolvedAddrs := map[string][]string{} for _, addr := range addrs { var resolved []string qtypeAndName := strings.SplitN(addr, "+", 2) if len(qtypeAndName) != 2 { // No lookup specified. Add to results and continue to the next address. - p.resolved[addr] = []string{addr} + resolvedAddrs[addr] = []string{addr} + p.resolverAddrs.WithLabelValues(addr).Set(1.0) continue } qtype, name := qtypeAndName[0], qtypeAndName[1] @@ -114,20 +115,13 @@ func (p *Provider) Resolve(ctx context.Context, addrs []string) { // The DNS resolution failed. Continue without modifying the old records. p.resolverFailuresCount.Inc() level.Error(p.logger).Log("msg", "dns resolution failed", "addr", addr, "err", err) - continue - } - p.resolved[addr] = resolved - } - - // Remove stored addresses that are no longer requested. - for existingAddr := range p.resolved { - if !contains(addrs, existingAddr) { - delete(p.resolved, existingAddr) - p.resolverAddrs.DeleteLabelValues(existingAddr) - } else { - p.resolverAddrs.WithLabelValues(existingAddr).Set(float64(len(p.resolved[existingAddr]))) + // Use cached values. + resolved = p.resolved[addr] } + resolvedAddrs[addr] = resolved + p.resolverAddrs.WithLabelValues(addr).Set(float64(len(resolved))) } + p.resolved = resolvedAddrs } // Addresses returns the latest addresses present in the Provider. @@ -141,12 +135,3 @@ func (p *Provider) Addresses() []string { } return result } - -func contains(slice []string, str string) bool { - for _, s := range slice { - if str == s { - return true - } - } - return false -} diff --git a/vendor/github.com/thanos-io/thanos/pkg/extprom/tx_gauge.go b/vendor/github.com/thanos-io/thanos/pkg/extprom/tx_gauge.go index d85bf4f921..a619b122e9 100644 --- a/vendor/github.com/thanos-io/thanos/pkg/extprom/tx_gauge.go +++ b/vendor/github.com/thanos-io/thanos/pkg/extprom/tx_gauge.go @@ -7,6 +7,7 @@ import ( "sync" "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promauto" ) type TxGaugeVec struct { @@ -24,18 +25,23 @@ type TxGaugeVec struct { // // Additionally it allows to init LabelValues on each transaction. // NOTE: This is quite naive implementation creating new prometheus.GaugeVec on each `ResetTx`, use wisely. -func NewTxGaugeVec(opts prometheus.GaugeOpts, labelNames []string, initLabelValues ...[]string) *TxGaugeVec { +func NewTxGaugeVec(reg prometheus.Registerer, opts prometheus.GaugeOpts, labelNames []string, initLabelValues ...[]string) *TxGaugeVec { + // Nil as we will register it on our own later. f := func() *prometheus.GaugeVec { - g := prometheus.NewGaugeVec(opts, labelNames) + g := promauto.With(nil).NewGaugeVec(opts, labelNames) for _, vals := range initLabelValues { g.WithLabelValues(vals...) } return g } - return &TxGaugeVec{ + tx := &TxGaugeVec{ current: f(), newMetricVal: f, } + if reg != nil { + reg.MustRegister(tx) + } + return tx } // ResetTx starts new transaction. Not goroutine-safe. diff --git a/vendor/github.com/thanos-io/thanos/pkg/gate/gate.go b/vendor/github.com/thanos-io/thanos/pkg/gate/gate.go index 43bc3a47b4..549b0f3300 100644 --- a/vendor/github.com/thanos-io/thanos/pkg/gate/gate.go +++ b/vendor/github.com/thanos-io/thanos/pkg/gate/gate.go @@ -8,6 +8,7 @@ import ( "time" "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promauto" "github.com/prometheus/prometheus/pkg/gate" ) @@ -27,21 +28,17 @@ type Gate struct { func NewGate(maxConcurrent int, reg prometheus.Registerer) *Gate { g := &Gate{ g: gate.New(maxConcurrent), - inflightQueries: prometheus.NewGauge(prometheus.GaugeOpts{ + inflightQueries: promauto.With(reg).NewGauge(prometheus.GaugeOpts{ Name: "gate_queries_in_flight", Help: "Number of queries that are currently in flight.", }), - gateTiming: prometheus.NewHistogram(prometheus.HistogramOpts{ + gateTiming: promauto.With(reg).NewHistogram(prometheus.HistogramOpts{ Name: "gate_duration_seconds", Help: "How many seconds it took for queries to wait at the gate.", Buckets: []float64{0.01, 0.1, 0.3, 0.6, 1, 3, 6, 9, 20, 30, 60, 90, 120, 240, 360, 720}, }), } - if reg != nil { - reg.MustRegister(g.inflightQueries, g.gateTiming) - } - return g } diff --git a/vendor/github.com/thanos-io/thanos/pkg/store/cache/units.go b/vendor/github.com/thanos-io/thanos/pkg/model/units.go similarity index 96% rename from vendor/github.com/thanos-io/thanos/pkg/store/cache/units.go rename to vendor/github.com/thanos-io/thanos/pkg/model/units.go index 156ea54ddb..cd4944f6d7 100644 --- a/vendor/github.com/thanos-io/thanos/pkg/store/cache/units.go +++ b/vendor/github.com/thanos-io/thanos/pkg/model/units.go @@ -1,7 +1,7 @@ // Copyright (c) The Thanos Authors. // Licensed under the Apache License 2.0. -package storecache +package model import ( "github.com/alecthomas/units" diff --git a/vendor/github.com/thanos-io/thanos/pkg/objstore/objstore.go b/vendor/github.com/thanos-io/thanos/pkg/objstore/objstore.go index e187be3c62..ff63a9018a 100644 --- a/vendor/github.com/thanos-io/thanos/pkg/objstore/objstore.go +++ b/vendor/github.com/thanos-io/thanos/pkg/objstore/objstore.go @@ -18,6 +18,7 @@ import ( "github.com/go-kit/kit/log/level" "github.com/pkg/errors" "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promauto" "github.com/thanos-io/thanos/pkg/runutil" ) @@ -171,172 +172,156 @@ func DownloadDir(ctx context.Context, logger log.Logger, bkt BucketReader, src, return nil } -// Exists returns true, if file exists, otherwise false and nil error if presence IsObjNotFoundErr, otherwise false with -// returning error. -func Exists(ctx context.Context, bkt Bucket, src string) (bool, error) { - rc, err := bkt.Get(ctx, src) - if rc != nil { - _ = rc.Close() - } - if err != nil { - if bkt.IsObjNotFoundErr(err) { - return false, nil - } - return false, errors.Wrap(err, "stat object") - } - - return true, nil -} +const ( + iterOp = "iter" + sizeOp = "objectsize" + getOp = "get" + getRangeOp = "get_range" + existsOp = "exists" + uploadOp = "upload" + deleteOp = "delete" +) // BucketWithMetrics takes a bucket and registers metrics with the given registry for // operations run against the bucket. -func BucketWithMetrics(name string, b Bucket, r prometheus.Registerer) Bucket { +func BucketWithMetrics(name string, b Bucket, reg prometheus.Registerer) Bucket { bkt := &metricBucket{ bkt: b, - ops: prometheus.NewCounterVec(prometheus.CounterOpts{ + ops: promauto.With(reg).NewCounterVec(prometheus.CounterOpts{ Name: "thanos_objstore_bucket_operations_total", Help: "Total number of operations against a bucket.", ConstLabels: prometheus.Labels{"bucket": name}, }, []string{"operation"}), - opsFailures: prometheus.NewCounterVec(prometheus.CounterOpts{ + opsFailures: promauto.With(reg).NewCounterVec(prometheus.CounterOpts{ Name: "thanos_objstore_bucket_operation_failures_total", Help: "Total number of operations against a bucket that failed.", ConstLabels: prometheus.Labels{"bucket": name}, }, []string{"operation"}), - opsDuration: prometheus.NewHistogramVec(prometheus.HistogramOpts{ + opsDuration: promauto.With(reg).NewHistogramVec(prometheus.HistogramOpts{ Name: "thanos_objstore_bucket_operation_duration_seconds", Help: "Duration of operations against the bucket", ConstLabels: prometheus.Labels{"bucket": name}, Buckets: []float64{0.001, 0.01, 0.1, 0.3, 0.6, 1, 3, 6, 9, 20, 30, 60, 90, 120}, }, []string{"operation"}), - lastSuccessfullUploadTime: prometheus.NewGaugeVec(prometheus.GaugeOpts{ + lastSuccessfulUploadTime: promauto.With(reg).NewGaugeVec(prometheus.GaugeOpts{ Name: "thanos_objstore_bucket_last_successful_upload_time", Help: "Second timestamp of the last successful upload to the bucket.", }, []string{"bucket"}), } - if r != nil { - r.MustRegister(bkt.ops, bkt.opsFailures, bkt.opsDuration, bkt.lastSuccessfullUploadTime) + for _, op := range []string{iterOp, sizeOp, getOp, getRangeOp, existsOp, uploadOp, deleteOp} { + bkt.ops.WithLabelValues(op) + bkt.opsFailures.WithLabelValues(op) + bkt.opsDuration.WithLabelValues(op) } + bkt.lastSuccessfulUploadTime.WithLabelValues(b.Name()) return bkt } type metricBucket struct { bkt Bucket - ops *prometheus.CounterVec - opsFailures *prometheus.CounterVec - opsDuration *prometheus.HistogramVec - lastSuccessfullUploadTime *prometheus.GaugeVec + ops *prometheus.CounterVec + opsFailures *prometheus.CounterVec + opsDuration *prometheus.HistogramVec + lastSuccessfulUploadTime *prometheus.GaugeVec } func (b *metricBucket) Iter(ctx context.Context, dir string, f func(name string) error) error { - const op = "iter" - err := b.bkt.Iter(ctx, dir, f) if err != nil { - b.opsFailures.WithLabelValues(op).Inc() + b.opsFailures.WithLabelValues(iterOp).Inc() } - b.ops.WithLabelValues(op).Inc() + b.ops.WithLabelValues(iterOp).Inc() return err } // ObjectSize returns the size of the specified object. func (b *metricBucket) ObjectSize(ctx context.Context, name string) (uint64, error) { - const op = "objectsize" - b.ops.WithLabelValues(op).Inc() + b.ops.WithLabelValues(sizeOp).Inc() start := time.Now() rc, err := b.bkt.ObjectSize(ctx, name) if err != nil { - b.opsFailures.WithLabelValues(op).Inc() + b.opsFailures.WithLabelValues(sizeOp).Inc() return 0, err } - b.opsDuration.WithLabelValues(op).Observe(time.Since(start).Seconds()) + b.opsDuration.WithLabelValues(sizeOp).Observe(time.Since(start).Seconds()) return rc, nil } func (b *metricBucket) Get(ctx context.Context, name string) (io.ReadCloser, error) { - const op = "get" - b.ops.WithLabelValues(op).Inc() + b.ops.WithLabelValues(getOp).Inc() rc, err := b.bkt.Get(ctx, name) if err != nil { - b.opsFailures.WithLabelValues(op).Inc() + b.opsFailures.WithLabelValues(getOp).Inc() return nil, err } - rc = newTimingReadCloser( + return newTimingReadCloser( rc, - op, + getOp, b.opsDuration, b.opsFailures, - ) - - return rc, nil + ), nil } func (b *metricBucket) GetRange(ctx context.Context, name string, off, length int64) (io.ReadCloser, error) { - const op = "get_range" - b.ops.WithLabelValues(op).Inc() + b.ops.WithLabelValues(getRangeOp).Inc() rc, err := b.bkt.GetRange(ctx, name, off, length) if err != nil { - b.opsFailures.WithLabelValues(op).Inc() + b.opsFailures.WithLabelValues(getRangeOp).Inc() return nil, err } - rc = newTimingReadCloser( + return newTimingReadCloser( rc, - op, + getRangeOp, b.opsDuration, b.opsFailures, - ) - - return rc, nil + ), nil } func (b *metricBucket) Exists(ctx context.Context, name string) (bool, error) { - const op = "exists" start := time.Now() ok, err := b.bkt.Exists(ctx, name) if err != nil { - b.opsFailures.WithLabelValues(op).Inc() + b.opsFailures.WithLabelValues(existsOp).Inc() } - b.ops.WithLabelValues(op).Inc() - b.opsDuration.WithLabelValues(op).Observe(time.Since(start).Seconds()) + b.ops.WithLabelValues(existsOp).Inc() + b.opsDuration.WithLabelValues(existsOp).Observe(time.Since(start).Seconds()) return ok, err } func (b *metricBucket) Upload(ctx context.Context, name string, r io.Reader) error { - const op = "upload" start := time.Now() err := b.bkt.Upload(ctx, name, r) if err != nil { - b.opsFailures.WithLabelValues(op).Inc() + b.opsFailures.WithLabelValues(uploadOp).Inc() } else { - b.lastSuccessfullUploadTime.WithLabelValues(b.bkt.Name()).SetToCurrentTime() + b.lastSuccessfulUploadTime.WithLabelValues(b.bkt.Name()).SetToCurrentTime() } - b.ops.WithLabelValues(op).Inc() - b.opsDuration.WithLabelValues(op).Observe(time.Since(start).Seconds()) + b.ops.WithLabelValues(uploadOp).Inc() + b.opsDuration.WithLabelValues(uploadOp).Observe(time.Since(start).Seconds()) return err } func (b *metricBucket) Delete(ctx context.Context, name string) error { - const op = "delete" start := time.Now() err := b.bkt.Delete(ctx, name) if err != nil { - b.opsFailures.WithLabelValues(op).Inc() + b.opsFailures.WithLabelValues(deleteOp).Inc() } - b.ops.WithLabelValues(op).Inc() - b.opsDuration.WithLabelValues(op).Observe(time.Since(start).Seconds()) + b.ops.WithLabelValues(deleteOp).Inc() + b.opsDuration.WithLabelValues(deleteOp).Observe(time.Since(start).Seconds()) return err } diff --git a/vendor/github.com/thanos-io/thanos/pkg/runutil/runutil.go b/vendor/github.com/thanos-io/thanos/pkg/runutil/runutil.go index 45d06f4e08..5b3e85940b 100644 --- a/vendor/github.com/thanos-io/thanos/pkg/runutil/runutil.go +++ b/vendor/github.com/thanos-io/thanos/pkg/runutil/runutil.go @@ -111,6 +111,11 @@ func CloseWithLogOnErr(logger log.Logger, closer io.Closer, format string, a ... return } + // Not a problem if it has been closed already. + if errors.Is(err, os.ErrClosed) { + return + } + if logger == nil { logger = log.NewLogfmtLogger(os.Stderr) } diff --git a/vendor/github.com/thanos-io/thanos/pkg/shipper/shipper.go b/vendor/github.com/thanos-io/thanos/pkg/shipper/shipper.go index 39e7d61d86..a865ac5c71 100644 --- a/vendor/github.com/thanos-io/thanos/pkg/shipper/shipper.go +++ b/vendor/github.com/thanos-io/thanos/pkg/shipper/shipper.go @@ -20,6 +20,7 @@ import ( "github.com/oklog/ulid" "github.com/pkg/errors" "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promauto" "github.com/prometheus/prometheus/pkg/labels" "github.com/prometheus/prometheus/tsdb" "github.com/prometheus/prometheus/tsdb/fileutil" @@ -37,40 +38,33 @@ type metrics struct { uploadedCompacted prometheus.Gauge } -func newMetrics(r prometheus.Registerer, uploadCompacted bool) *metrics { +func newMetrics(reg prometheus.Registerer, uploadCompacted bool) *metrics { var m metrics - m.dirSyncs = prometheus.NewCounter(prometheus.CounterOpts{ + m.dirSyncs = promauto.With(reg).NewCounter(prometheus.CounterOpts{ Name: "thanos_shipper_dir_syncs_total", Help: "Total number of dir syncs", }) - m.dirSyncFailures = prometheus.NewCounter(prometheus.CounterOpts{ + m.dirSyncFailures = promauto.With(reg).NewCounter(prometheus.CounterOpts{ Name: "thanos_shipper_dir_sync_failures_total", Help: "Total number of failed dir syncs", }) - m.uploads = prometheus.NewCounter(prometheus.CounterOpts{ + m.uploads = promauto.With(reg).NewCounter(prometheus.CounterOpts{ Name: "thanos_shipper_uploads_total", Help: "Total number of uploaded blocks", }) - m.uploadFailures = prometheus.NewCounter(prometheus.CounterOpts{ + m.uploadFailures = promauto.With(reg).NewCounter(prometheus.CounterOpts{ Name: "thanos_shipper_upload_failures_total", Help: "Total number of block upload failures", }) - m.uploadedCompacted = prometheus.NewGauge(prometheus.GaugeOpts{ + uploadCompactedGaugeOpts := prometheus.GaugeOpts{ Name: "thanos_shipper_upload_compacted_done", Help: "If 1 it means shipper uploaded all compacted blocks from the filesystem.", - }) - - if r != nil { - r.MustRegister( - m.dirSyncs, - m.dirSyncFailures, - m.uploads, - m.uploadFailures, - ) - if uploadCompacted { - r.MustRegister(m.uploadedCompacted) - } + } + if uploadCompacted { + m.uploadedCompacted = promauto.With(reg).NewGauge(uploadCompactedGaugeOpts) + } else { + m.uploadedCompacted = promauto.With(nil).NewGauge(uploadCompactedGaugeOpts) } return &m } @@ -348,6 +342,7 @@ func (s *Shipper) Sync(ctx context.Context) (uploaded int, err error) { } // sync uploads the block if not exists in remote storage. +// TODO(khyatisoneji): Double check if block does not have deletion-mark.json for some reason, otherwise log it or return error. func (s *Shipper) upload(ctx context.Context, meta *metadata.Meta) error { level.Info(s.logger).Log("msg", "upload new block", "id", meta.ULID) diff --git a/vendor/github.com/thanos-io/thanos/pkg/store/bucket.go b/vendor/github.com/thanos-io/thanos/pkg/store/bucket.go index 0ce8f97402..81dcb4ff1e 100644 --- a/vendor/github.com/thanos-io/thanos/pkg/store/bucket.go +++ b/vendor/github.com/thanos-io/thanos/pkg/store/bucket.go @@ -24,6 +24,7 @@ import ( "github.com/oklog/ulid" "github.com/pkg/errors" "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promauto" "github.com/prometheus/prometheus/pkg/labels" "github.com/prometheus/prometheus/tsdb/chunkenc" "github.com/prometheus/prometheus/tsdb/chunks" @@ -96,70 +97,76 @@ type bucketStoreMetrics struct { queriesDropped prometheus.Counter queriesLimit prometheus.Gauge seriesRefetches prometheus.Counter + + cachedPostingsCompressions *prometheus.CounterVec + cachedPostingsCompressionErrors *prometheus.CounterVec + cachedPostingsCompressionTimeSeconds *prometheus.CounterVec + cachedPostingsOriginalSizeBytes prometheus.Counter + cachedPostingsCompressedSizeBytes prometheus.Counter } func newBucketStoreMetrics(reg prometheus.Registerer) *bucketStoreMetrics { var m bucketStoreMetrics - m.blockLoads = prometheus.NewCounter(prometheus.CounterOpts{ + m.blockLoads = promauto.With(reg).NewCounter(prometheus.CounterOpts{ Name: "thanos_bucket_store_block_loads_total", Help: "Total number of remote block loading attempts.", }) - m.blockLoadFailures = prometheus.NewCounter(prometheus.CounterOpts{ + m.blockLoadFailures = promauto.With(reg).NewCounter(prometheus.CounterOpts{ Name: "thanos_bucket_store_block_load_failures_total", Help: "Total number of failed remote block loading attempts.", }) - m.blockDrops = prometheus.NewCounter(prometheus.CounterOpts{ + m.blockDrops = promauto.With(reg).NewCounter(prometheus.CounterOpts{ Name: "thanos_bucket_store_block_drops_total", Help: "Total number of local blocks that were dropped.", }) - m.blockDropFailures = prometheus.NewCounter(prometheus.CounterOpts{ + m.blockDropFailures = promauto.With(reg).NewCounter(prometheus.CounterOpts{ Name: "thanos_bucket_store_block_drop_failures_total", Help: "Total number of local blocks that failed to be dropped.", }) - m.blocksLoaded = prometheus.NewGauge(prometheus.GaugeOpts{ + m.blocksLoaded = promauto.With(reg).NewGauge(prometheus.GaugeOpts{ Name: "thanos_bucket_store_blocks_loaded", Help: "Number of currently loaded blocks.", }) - m.seriesDataTouched = prometheus.NewSummaryVec(prometheus.SummaryOpts{ + m.seriesDataTouched = promauto.With(reg).NewSummaryVec(prometheus.SummaryOpts{ Name: "thanos_bucket_store_series_data_touched", Help: "How many items of a data type in a block were touched for a single series request.", }, []string{"data_type"}) - m.seriesDataFetched = prometheus.NewSummaryVec(prometheus.SummaryOpts{ + m.seriesDataFetched = promauto.With(reg).NewSummaryVec(prometheus.SummaryOpts{ Name: "thanos_bucket_store_series_data_fetched", Help: "How many items of a data type in a block were fetched for a single series request.", }, []string{"data_type"}) - m.seriesDataSizeTouched = prometheus.NewSummaryVec(prometheus.SummaryOpts{ + m.seriesDataSizeTouched = promauto.With(reg).NewSummaryVec(prometheus.SummaryOpts{ Name: "thanos_bucket_store_series_data_size_touched_bytes", Help: "Size of all items of a data type in a block were touched for a single series request.", }, []string{"data_type"}) - m.seriesDataSizeFetched = prometheus.NewSummaryVec(prometheus.SummaryOpts{ + m.seriesDataSizeFetched = promauto.With(reg).NewSummaryVec(prometheus.SummaryOpts{ Name: "thanos_bucket_store_series_data_size_fetched_bytes", Help: "Size of all items of a data type in a block were fetched for a single series request.", }, []string{"data_type"}) - m.seriesBlocksQueried = prometheus.NewSummary(prometheus.SummaryOpts{ + m.seriesBlocksQueried = promauto.With(reg).NewSummary(prometheus.SummaryOpts{ Name: "thanos_bucket_store_series_blocks_queried", Help: "Number of blocks in a bucket store that were touched to satisfy a query.", }) - m.seriesGetAllDuration = prometheus.NewHistogram(prometheus.HistogramOpts{ + m.seriesGetAllDuration = promauto.With(reg).NewHistogram(prometheus.HistogramOpts{ Name: "thanos_bucket_store_series_get_all_duration_seconds", Help: "Time it takes until all per-block prepares and preloads for a query are finished.", Buckets: []float64{0.001, 0.01, 0.1, 0.3, 0.6, 1, 3, 6, 9, 20, 30, 60, 90, 120}, }) - m.seriesMergeDuration = prometheus.NewHistogram(prometheus.HistogramOpts{ + m.seriesMergeDuration = promauto.With(reg).NewHistogram(prometheus.HistogramOpts{ Name: "thanos_bucket_store_series_merge_duration_seconds", Help: "Time it takes to merge sub-results from all queried blocks into a single result.", Buckets: []float64{0.001, 0.01, 0.1, 0.3, 0.6, 1, 3, 6, 9, 20, 30, 60, 90, 120}, }) - m.resultSeriesCount = prometheus.NewSummary(prometheus.SummaryOpts{ + m.resultSeriesCount = promauto.With(reg).NewSummary(prometheus.SummaryOpts{ Name: "thanos_bucket_store_series_result_series", Help: "Number of series observed in the final result of a query.", }) - m.chunkSizeBytes = prometheus.NewHistogram(prometheus.HistogramOpts{ + m.chunkSizeBytes = promauto.With(reg).NewHistogram(prometheus.HistogramOpts{ Name: "thanos_bucket_store_sent_chunk_size_bytes", Help: "Size in bytes of the chunks for the single series, which is adequate to the gRPC message size sent to querier.", Buckets: []float64{ @@ -167,40 +174,40 @@ func newBucketStoreMetrics(reg prometheus.Registerer) *bucketStoreMetrics { }, }) - m.queriesDropped = prometheus.NewCounter(prometheus.CounterOpts{ + m.queriesDropped = promauto.With(reg).NewCounter(prometheus.CounterOpts{ Name: "thanos_bucket_store_queries_dropped_total", Help: "Number of queries that were dropped due to the sample limit.", }) - m.queriesLimit = prometheus.NewGauge(prometheus.GaugeOpts{ + m.queriesLimit = promauto.With(reg).NewGauge(prometheus.GaugeOpts{ Name: "thanos_bucket_store_queries_concurrent_max", Help: "Number of maximum concurrent queries.", }) - m.seriesRefetches = prometheus.NewCounter(prometheus.CounterOpts{ + m.seriesRefetches = promauto.With(reg).NewCounter(prometheus.CounterOpts{ Name: "thanos_bucket_store_series_refetches_total", Help: fmt.Sprintf("Total number of cases where %v bytes was not enough was to fetch series from index, resulting in refetch.", maxSeriesSize), }) - if reg != nil { - reg.MustRegister( - m.blockLoads, - m.blockLoadFailures, - m.blockDrops, - m.blockDropFailures, - m.blocksLoaded, - m.seriesDataTouched, - m.seriesDataFetched, - m.seriesDataSizeTouched, - m.seriesDataSizeFetched, - m.seriesBlocksQueried, - m.seriesGetAllDuration, - m.seriesMergeDuration, - m.resultSeriesCount, - m.chunkSizeBytes, - m.queriesDropped, - m.queriesLimit, - m.seriesRefetches, - ) - } + m.cachedPostingsCompressions = promauto.With(reg).NewCounterVec(prometheus.CounterOpts{ + Name: "thanos_bucket_store_cached_postings_compressions_total", + Help: "Number of postings compressions before storing to index cache.", + }, []string{"op"}) + m.cachedPostingsCompressionErrors = promauto.With(reg).NewCounterVec(prometheus.CounterOpts{ + Name: "thanos_bucket_store_cached_postings_compression_errors_total", + Help: "Number of postings compression errors.", + }, []string{"op"}) + m.cachedPostingsCompressionTimeSeconds = promauto.With(reg).NewCounterVec(prometheus.CounterOpts{ + Name: "thanos_bucket_store_cached_postings_compression_time_seconds", + Help: "Time spent compressing postings before storing them into postings cache.", + }, []string{"op"}) + m.cachedPostingsOriginalSizeBytes = promauto.With(reg).NewCounter(prometheus.CounterOpts{ + Name: "thanos_bucket_store_cached_postings_original_size_bytes_total", + Help: "Original size of postings stored into cache.", + }) + m.cachedPostingsCompressedSizeBytes = promauto.With(reg).NewCounter(prometheus.CounterOpts{ + Name: "thanos_bucket_store_cached_postings_compressed_size_bytes_total", + Help: "Compressed size of postings stored into cache.", + }) + return &m } @@ -241,6 +248,11 @@ type BucketStore struct { advLabelSets []storepb.LabelSet enableCompatibilityLabel bool enableIndexHeader bool + + // Reencode postings using diff+varint+snappy when storing to cache. + // This makes them smaller, but takes extra CPU and memory. + // When used with in-memory cache, memory usage should decrease overall, thanks to postings being smaller. + enablePostingsCompression bool } // NewBucketStore creates a new bucket backed store that implements the store API against @@ -260,6 +272,7 @@ func NewBucketStore( filterConfig *FilterConfig, enableCompatibilityLabel bool, enableIndexHeader bool, + enablePostingsCompression bool, ) (*BucketStore, error) { if logger == nil { logger = log.NewNopLogger() @@ -291,10 +304,11 @@ func NewBucketStore( maxConcurrent, extprom.WrapRegistererWithPrefix("thanos_bucket_store_series_", reg), ), - samplesLimiter: NewLimiter(maxSampleCount, metrics.queriesDropped), - partitioner: gapBasedPartitioner{maxGapSize: partitionerMaxGapSize}, - enableCompatibilityLabel: enableCompatibilityLabel, - enableIndexHeader: enableIndexHeader, + samplesLimiter: NewLimiter(maxSampleCount, metrics.queriesDropped), + partitioner: gapBasedPartitioner{maxGapSize: partitionerMaxGapSize}, + enableCompatibilityLabel: enableCompatibilityLabel, + enableIndexHeader: enableIndexHeader, + enablePostingsCompression: enablePostingsCompression, } s.metrics = metrics @@ -365,10 +379,10 @@ func (s *BucketStore) SyncBlocks(ctx context.Context) error { continue } if err := s.removeBlock(id); err != nil { - level.Warn(s.logger).Log("msg", "drop outdated block failed", "block", id, "err", err) + level.Warn(s.logger).Log("msg", "drop of outdated block failed", "block", id, "err", err) s.metrics.blockDropFailures.Inc() } - level.Debug(s.logger).Log("msg", "dropped outdated block", "block", id) + level.Info(s.logger).Log("msg", "dropped outdated block", "block", id) s.metrics.blockDrops.Inc() } @@ -439,7 +453,7 @@ func (s *BucketStore) addBlock(ctx context.Context, meta *metadata.Meta) (err er } level.Warn(s.logger).Log("msg", "loading block failed", "elapsed", time.Since(start), "id", meta.ULID, "err", err) } else { - level.Debug(s.logger).Log("msg", "loaded block", "elapsed", time.Since(start), "id", meta.ULID) + level.Info(s.logger).Log("msg", "loaded new block", "elapsed", time.Since(start), "id", meta.ULID) } }() s.metrics.blockLoads.Inc() @@ -476,6 +490,7 @@ func (s *BucketStore) addBlock(ctx context.Context, meta *metadata.Meta) (err er indexHeaderReader, s.partitioner, s.metrics.seriesRefetches, + s.enablePostingsCompression, ) if err != nil { return errors.Wrap(err, "new bucket block") @@ -825,14 +840,13 @@ func debugFoundBlockSetOverview(logger log.Logger, mint, maxt, maxResolutionMill // Series implements the storepb.StoreServer interface. func (s *BucketStore) Series(req *storepb.SeriesRequest, srv storepb.Store_SeriesServer) (err error) { - { - span, _ := tracing.StartSpan(srv.Context(), "store_query_gate_ismyturn") - err := s.queryGate.IsMyTurn(srv.Context()) - span.Finish() - if err != nil { - return errors.Wrapf(err, "failed to wait for turn") - } + tracing.DoInSpan(srv.Context(), "store_query_gate_ismyturn", func(ctx context.Context) { + err = s.queryGate.IsMyTurn(srv.Context()) + }) + if err != nil { + return errors.Wrapf(err, "failed to wait for turn") } + defer s.queryGate.Done() matchers, err := translateMatchers(req.Matchers) @@ -843,10 +857,11 @@ func (s *BucketStore) Series(req *storepb.SeriesRequest, srv storepb.Store_Serie req.MaxTime = s.limitMaxTime(req.MaxTime) var ( - stats = &queryStats{} - res []storepb.SeriesSet - mtx sync.Mutex - g, ctx = errgroup.WithContext(srv.Context()) + ctx = srv.Context() + stats = &queryStats{} + res []storepb.SeriesSet + mtx sync.Mutex + g, gctx = errgroup.WithContext(ctx) ) s.mtx.RLock() @@ -871,8 +886,8 @@ func (s *BucketStore) Series(req *storepb.SeriesRequest, srv storepb.Store_Serie b := b // We must keep the readers open until all their data has been sent. - indexr := b.indexReader(ctx) - chunkr := b.chunkReader(ctx) + indexr := b.indexReader(gctx) + chunkr := b.chunkReader(gctx) // Defer all closes to the end of Series method. defer runutil.CloseWithLogOnErr(s.logger, indexr, "series block") @@ -917,6 +932,14 @@ func (s *BucketStore) Series(req *storepb.SeriesRequest, srv storepb.Store_Serie s.metrics.seriesDataSizeTouched.WithLabelValues("chunks").Observe(float64(stats.chunksTouchedSizeSum)) s.metrics.seriesDataSizeFetched.WithLabelValues("chunks").Observe(float64(stats.chunksFetchedSizeSum)) s.metrics.resultSeriesCount.Observe(float64(stats.mergedSeriesCount)) + s.metrics.cachedPostingsCompressions.WithLabelValues("encode").Add(float64(stats.cachedPostingsCompressions)) + s.metrics.cachedPostingsCompressions.WithLabelValues("decode").Add(float64(stats.cachedPostingsDecompressions)) + s.metrics.cachedPostingsCompressionErrors.WithLabelValues("encode").Add(float64(stats.cachedPostingsCompressionErrors)) + s.metrics.cachedPostingsCompressionErrors.WithLabelValues("decode").Add(float64(stats.cachedPostingsDecompressionErrors)) + s.metrics.cachedPostingsCompressionTimeSeconds.WithLabelValues("encode").Add(stats.cachedPostingsCompressionTimeSum.Seconds()) + s.metrics.cachedPostingsCompressionTimeSeconds.WithLabelValues("decode").Add(stats.cachedPostingsDecompressionTimeSum.Seconds()) + s.metrics.cachedPostingsOriginalSizeBytes.Add(float64(stats.cachedPostingsOriginalSizeSum)) + s.metrics.cachedPostingsCompressedSizeBytes.Add(float64(stats.cachedPostingsCompressedSizeSum)) level.Debug(s.logger).Log("msg", "stats query processed", "stats", fmt.Sprintf("%+v", stats), "err", err) @@ -924,11 +947,10 @@ func (s *BucketStore) Series(req *storepb.SeriesRequest, srv storepb.Store_Serie // Concurrently get data from all blocks. { - span, _ := tracing.StartSpan(srv.Context(), "bucket_store_preload_all") begin := time.Now() - err := g.Wait() - span.Finish() - + tracing.DoInSpan(ctx, "bucket_store_preload_all", func(_ context.Context) { + err = g.Wait() + }) if err != nil { return status.Error(codes.Aborted, err.Error()) } @@ -937,10 +959,7 @@ func (s *BucketStore) Series(req *storepb.SeriesRequest, srv storepb.Store_Serie s.metrics.seriesBlocksQueried.Observe(float64(stats.blocksQueried)) } // Merge the sub-results from each selected block. - { - span, _ := tracing.StartSpan(srv.Context(), "bucket_store_merge_all") - defer span.Finish() - + tracing.DoInSpan(ctx, "bucket_store_merge_all", func(ctx context.Context) { begin := time.Now() // Merge series set into an union of all block sets. This exposes all blocks are single seriesSet. @@ -961,17 +980,21 @@ func (s *BucketStore) Series(req *storepb.SeriesRequest, srv storepb.Store_Serie s.metrics.chunkSizeBytes.Observe(float64(chunksSize(series.Chunks))) } - if err := srv.Send(storepb.NewSeriesResponse(&series)); err != nil { - return status.Error(codes.Unknown, errors.Wrap(err, "send series response").Error()) + if err = srv.Send(storepb.NewSeriesResponse(&series)); err != nil { + err = status.Error(codes.Unknown, errors.Wrap(err, "send series response").Error()) + return } } if set.Err() != nil { - return status.Error(codes.Unknown, errors.Wrap(set.Err(), "expand series set").Error()) + err = status.Error(codes.Unknown, errors.Wrap(set.Err(), "expand series set").Error()) + return } stats.mergeDuration = time.Since(begin) s.metrics.seriesMergeDuration.Observe(stats.mergeDuration.Seconds()) - } - return nil + + err = nil + }) + return err } func chunksSize(chks []storepb.AggrChunk) (size int) { @@ -1088,7 +1111,11 @@ func (s *bucketBlockSet) add(b *bucketBlock) error { bs := append(s.blocks[i], b) s.blocks[i] = bs + // Always sort blocks by min time, then max time. sort.Slice(bs, func(j, k int) bool { + if bs[j].meta.MinTime == bs[k].meta.MinTime { + return bs[j].meta.MaxTime < bs[k].meta.MaxTime + } return bs[j].meta.MinTime < bs[k].meta.MinTime }) return nil @@ -1120,6 +1147,9 @@ func int64index(s []int64, x int64) int { // getFor returns a time-ordered list of blocks that cover date between mint and maxt. // Blocks with the biggest resolution possible but not bigger than the given max resolution are returned. +// It supports overlapping blocks. +// +// NOTE: s.blocks are expected to be sorted in minTime order. func (s *bucketBlockSet) getFor(mint, maxt, maxResolutionMillis int64) (bs []*bucketBlock) { if mint > maxt { return nil @@ -1197,6 +1227,8 @@ type bucketBlock struct { partitioner partitioner seriesRefetches prometheus.Counter + + enablePostingsCompression bool } func newBucketBlock( @@ -1210,17 +1242,19 @@ func newBucketBlock( indexHeadReader indexheader.Reader, p partitioner, seriesRefetches prometheus.Counter, + enablePostingsCompression bool, ) (b *bucketBlock, err error) { b = &bucketBlock{ - logger: logger, - bkt: bkt, - indexCache: indexCache, - chunkPool: chunkPool, - dir: dir, - partitioner: p, - meta: meta, - indexHeaderReader: indexHeadReader, - seriesRefetches: seriesRefetches, + logger: logger, + bkt: bkt, + indexCache: indexCache, + chunkPool: chunkPool, + dir: dir, + partitioner: p, + meta: meta, + indexHeaderReader: indexHeadReader, + seriesRefetches: seriesRefetches, + enablePostingsCompression: enablePostingsCompression, } // Get object handles for all chunk files. @@ -1286,7 +1320,6 @@ func (b *bucketBlock) chunkReader(ctx context.Context) *bucketChunkReader { // Close waits for all pending readers to finish and then closes all underlying resources. func (b *bucketBlock) Close() error { b.pendingReaders.Wait() - return b.indexHeaderReader.Close() } @@ -1325,7 +1358,12 @@ func newBucketIndexReader(ctx context.Context, block *bucketBlock) *bucketIndexR // chunk where the series contains the matching label-value pair for a given block of data. Postings can be fetched by // single label name=value. func (r *bucketIndexReader) ExpandedPostings(ms []*labels.Matcher) ([]uint64, error) { - var postingGroups []*postingGroup + var ( + postingGroups []*postingGroup + allRequested = false + hasAdds = false + keys []labels.Label + ) // NOTE: Derived from tsdb.PostingsForMatchers. for _, m := range ms { @@ -1335,23 +1373,71 @@ func (r *bucketIndexReader) ExpandedPostings(ms []*labels.Matcher) ([]uint64, er return nil, errors.Wrap(err, "toPostingGroup") } + // If this groups adds nothing, it's an empty group. We can shortcut this, since intersection with empty + // postings would return no postings anyway. + // E.g. label="non-existing-value" returns empty group. + if !pg.addAll && len(pg.addKeys) == 0 { + return nil, nil + } + postingGroups = append(postingGroups, pg) + allRequested = allRequested || pg.addAll + hasAdds = hasAdds || len(pg.addKeys) > 0 + + // Postings returned by fetchPostings will be in the same order as keys + // so it's important that we iterate them in the same order later. + // We don't have any other way of pairing keys and fetched postings. + keys = append(keys, pg.addKeys...) + keys = append(keys, pg.removeKeys...) } if len(postingGroups) == 0 { return nil, nil } - if err := r.fetchPostings(postingGroups); err != nil { + // We only need special All postings if there are no other adds. If there are, we can skip fetching + // special All postings completely. + if allRequested && !hasAdds { + // add group with label to fetch "special All postings". + name, value := index.AllPostingsKey() + allPostingsLabel := labels.Label{Name: name, Value: value} + + postingGroups = append(postingGroups, newPostingGroup(true, []labels.Label{allPostingsLabel}, nil)) + keys = append(keys, allPostingsLabel) + } + + fetchedPostings, err := r.fetchPostings(keys) + if err != nil { return nil, errors.Wrap(err, "get postings") } - var postings []index.Postings + // Get "add" and "remove" postings from groups. We iterate over postingGroups and their keys + // again, and this is exactly the same order as before (when building the groups), so we can simply + // use one incrementing index to fetch postings from returned slice. + postingIndex := 0 + + var groupAdds, groupRemovals []index.Postings for _, g := range postingGroups { - postings = append(postings, g.Postings()) + // We cannot add empty set to groupAdds, since they are intersected. + if len(g.addKeys) > 0 { + toMerge := make([]index.Postings, 0, len(g.addKeys)) + for _, l := range g.addKeys { + toMerge = append(toMerge, checkNilPosting(l, fetchedPostings[postingIndex])) + postingIndex++ + } + + groupAdds = append(groupAdds, index.Merge(toMerge...)) + } + + for _, l := range g.removeKeys { + groupRemovals = append(groupRemovals, checkNilPosting(l, fetchedPostings[postingIndex])) + postingIndex++ + } } - ps, err := index.ExpandPostings(index.Intersect(postings...)) + result := index.Without(index.Intersect(groupAdds...), index.Merge(groupRemovals...)) + + ps, err := index.ExpandPostings(result) if err != nil { return nil, errors.Wrap(err, "expand") } @@ -1367,82 +1453,71 @@ func (r *bucketIndexReader) ExpandedPostings(ms []*labels.Matcher) ([]uint64, er return ps, nil } +// postingGroup keeps posting keys for single matcher. Logical result of the group is: +// If addAll is set: special All postings minus postings for removeKeys labels. No need to merge postings for addKeys in this case. +// If addAll is not set: Merge of postings for "addKeys" labels minus postings for removeKeys labels +// This computation happens in ExpandedPostings. type postingGroup struct { - keys labels.Labels - postings []index.Postings - - aggregate func(postings []index.Postings) index.Postings + addAll bool + addKeys []labels.Label + removeKeys []labels.Label } -func newPostingGroup(keys labels.Labels, aggr func(postings []index.Postings) index.Postings) *postingGroup { +func newPostingGroup(addAll bool, addKeys, removeKeys []labels.Label) *postingGroup { return &postingGroup{ - keys: keys, - postings: make([]index.Postings, len(keys)), - aggregate: aggr, + addAll: addAll, + addKeys: addKeys, + removeKeys: removeKeys, } } -func (p *postingGroup) Fill(i int, posting index.Postings) { - p.postings[i] = posting -} - -func (p *postingGroup) Postings() index.Postings { - if len(p.keys) == 0 { - return index.EmptyPostings() - } - - for i, posting := range p.postings { - if posting == nil { - // This should not happen. Debug for https://github.com/thanos-io/thanos/issues/874. - return index.ErrPostings(errors.Errorf("at least one of %d postings is nil for %s. It was never fetched.", i, p.keys[i])) - } +func checkNilPosting(l labels.Label, p index.Postings) index.Postings { + if p == nil { + // This should not happen. Debug for https://github.com/thanos-io/thanos/issues/874. + return index.ErrPostings(errors.Errorf("postings is nil for %s. It was never fetched.", l)) } - - return p.aggregate(p.postings) + return p } -func merge(p []index.Postings) index.Postings { - return index.Merge(p...) -} - -func allWithout(p []index.Postings) index.Postings { - return index.Without(p[0], index.Merge(p[1:]...)) -} +var ( + allPostingsGroup = newPostingGroup(true, nil, nil) + emptyPostingsGroup = newPostingGroup(false, nil, nil) +) // NOTE: Derived from tsdb.postingsForMatcher. index.Merge is equivalent to map duplication. func toPostingGroup(lvalsFn func(name string) ([]string, error), m *labels.Matcher) (*postingGroup, error) { - var matchingLabels labels.Labels + // This matches any label value, and also series that don't have this label at all. + if m.Type == labels.MatchRegexp && (m.Value == ".*" || m.Value == "^.*$") { + return allPostingsGroup, nil + } + + // NOT matching any value = match nothing. We can shortcut this easily. + if m.Type == labels.MatchNotRegexp && (m.Value == ".*" || m.Value == "^.*$") { + return emptyPostingsGroup, nil + } // If the matcher selects an empty value, it selects all the series which don't // have the label name set too. See: https://github.com/prometheus/prometheus/issues/3575 // and https://github.com/prometheus/prometheus/pull/3578#issuecomment-351653555. if m.Matches("") { - allName, allValue := index.AllPostingsKey() - - matchingLabels = append(matchingLabels, labels.Label{Name: allName, Value: allValue}) vals, err := lvalsFn(m.Name) if err != nil { return nil, err } + + var toRemove []labels.Label for _, val := range vals { if !m.Matches(val) { - matchingLabels = append(matchingLabels, labels.Label{Name: m.Name, Value: val}) + toRemove = append(toRemove, labels.Label{Name: m.Name, Value: val}) } } - if len(matchingLabels) == 1 { - // This is known hack to return all series. - // Ask for x != . Allow for that as Prometheus does, - // even though it is expensive. - return newPostingGroup(matchingLabels, merge), nil - } - - return newPostingGroup(matchingLabels, allWithout), nil + return newPostingGroup(true, nil, toRemove), nil } // Fast-path for equal matching. if m.Type == labels.MatchEqual { - return newPostingGroup(labels.Labels{{Name: m.Name, Value: m.Value}}, merge), nil + return newPostingGroup(false, []labels.Label{{Name: m.Name, Value: m.Value}}, nil), nil } vals, err := lvalsFn(m.Name) @@ -1450,67 +1525,81 @@ func toPostingGroup(lvalsFn func(name string) ([]string, error), m *labels.Match return nil, err } + var toAdd []labels.Label for _, val := range vals { if m.Matches(val) { - matchingLabels = append(matchingLabels, labels.Label{Name: m.Name, Value: val}) + toAdd = append(toAdd, labels.Label{Name: m.Name, Value: val}) } } - return newPostingGroup(matchingLabels, merge), nil + return newPostingGroup(false, toAdd, nil), nil } type postingPtr struct { - groupID int - keyID int - ptr index.Range + keyID int + ptr index.Range } // fetchPostings fill postings requested by posting groups. -func (r *bucketIndexReader) fetchPostings(groups []*postingGroup) error { +// It returns one postings for each key, in the same order. +// If postings for given key is not fetched, entry at given index will be nil. +func (r *bucketIndexReader) fetchPostings(keys []labels.Label) ([]index.Postings, error) { var ptrs []postingPtr - // Fetch postings from the cache with a single call. - keys := make([]labels.Label, 0) - for _, g := range groups { - keys = append(keys, g.keys...) - } + output := make([]index.Postings, len(keys)) + // Fetch postings from the cache with a single call. fromCache, _ := r.block.indexCache.FetchMultiPostings(r.ctx, r.block.meta.ULID, keys) // Iterate over all groups and fetch posting from cache. // If we have a miss, mark key to be fetched in `ptrs` slice. // Overlaps are well handled by partitioner, so we don't need to deduplicate keys. - for i, g := range groups { - for j, key := range g.keys { - // Get postings for the given key from cache first. - if b, ok := fromCache[key]; ok { - r.stats.postingsTouched++ - r.stats.postingsTouchedSizeSum += len(b) - - _, l, err := r.dec.Postings(b) + for ix, key := range keys { + // Get postings for the given key from cache first. + if b, ok := fromCache[key]; ok { + r.stats.postingsTouched++ + r.stats.postingsTouchedSizeSum += len(b) + + // Even if this instance is not using compression, there may be compressed + // entries in the cache written by other stores. + var ( + l index.Postings + err error + ) + if isDiffVarintSnappyEncodedPostings(b) { + s := time.Now() + l, err = diffVarintSnappyDecode(b) + r.stats.cachedPostingsDecompressions += 1 + r.stats.cachedPostingsDecompressionTimeSum += time.Since(s) if err != nil { - return errors.Wrap(err, "decode postings") + r.stats.cachedPostingsDecompressionErrors += 1 } - - g.Fill(j, l) - continue - } - - // Cache miss; save pointer for actual posting in index stored in object store. - ptr, err := r.block.indexHeaderReader.PostingsOffset(key.Name, key.Value) - if err == indexheader.NotFoundRangeErr { - // This block does not have any posting for given key. - g.Fill(j, index.EmptyPostings()) - continue + } else { + _, l, err = r.dec.Postings(b) } if err != nil { - return errors.Wrap(err, "index header PostingsOffset") + return nil, errors.Wrap(err, "decode postings") } - r.stats.postingsToFetch++ - ptrs = append(ptrs, postingPtr{ptr: ptr, groupID: i, keyID: j}) + output[ix] = l + continue + } + + // Cache miss; save pointer for actual posting in index stored in object store. + ptr, err := r.block.indexHeaderReader.PostingsOffset(key.Name, key.Value) + if err == indexheader.NotFoundRangeErr { + // This block does not have any posting for given key. + output[ix] = index.EmptyPostings() + continue } + + if err != nil { + return nil, errors.Wrap(err, "index header PostingsOffset") + } + + r.stats.postingsToFetch++ + ptrs = append(ptrs, postingPtr{ptr: ptr, keyID: ix}) } sort.Slice(ptrs, func(i, j int) bool { @@ -1555,22 +1644,50 @@ func (r *bucketIndexReader) fetchPostings(groups []*postingGroup) error { return err } + dataToCache := pBytes + + compressionTime := time.Duration(0) + compressions, compressionErrors, compressedSize := 0, 0, 0 + + if r.block.enablePostingsCompression { + // Reencode postings before storing to cache. If that fails, we store original bytes. + // This can only fail, if postings data was somehow corrupted, + // and there is nothing we can do about it. + // Errors from corrupted postings will be reported when postings are used. + compressions++ + s := time.Now() + data, err := diffVarintSnappyEncode(newBigEndianPostings(pBytes[4:])) + compressionTime = time.Since(s) + if err == nil { + dataToCache = data + compressedSize = len(data) + } else { + compressionErrors = 1 + } + } + r.mtx.Lock() // Return postings and fill LRU cache. // Truncate first 4 bytes which are length of posting. - groups[p.groupID].Fill(p.keyID, newBigEndianPostings(pBytes[4:])) - r.block.indexCache.StorePostings(r.ctx, r.block.meta.ULID, groups[p.groupID].keys[p.keyID], pBytes) + output[p.keyID] = newBigEndianPostings(pBytes[4:]) + + r.block.indexCache.StorePostings(r.ctx, r.block.meta.ULID, keys[p.keyID], dataToCache) // If we just fetched it we still have to update the stats for touched postings. r.stats.postingsTouched++ r.stats.postingsTouchedSizeSum += len(pBytes) + r.stats.cachedPostingsCompressions += compressions + r.stats.cachedPostingsCompressionErrors += compressionErrors + r.stats.cachedPostingsOriginalSizeSum += len(pBytes) + r.stats.cachedPostingsCompressedSizeSum += compressedSize + r.stats.cachedPostingsCompressionTimeSum += compressionTime r.mtx.Unlock() } return nil }) } - return g.Wait() + return output, g.Wait() } func resizePostings(b []byte) ([]byte, error) { @@ -1869,7 +1986,7 @@ func (r *bucketChunkReader) loadChunks(ctx context.Context, offs []uint32, seq i l, n := binary.Uvarint(cb) if n < 1 { - return errors.Errorf("reading chunk length failed") + return errors.New("reading chunk length failed") } if len(cb) < n+int(l)+1 { return errors.Errorf("preloaded chunk too small, expecting %d", n+int(l)+1) @@ -1937,6 +2054,15 @@ type queryStats struct { postingsFetchCount int postingsFetchDurationSum time.Duration + cachedPostingsCompressions int + cachedPostingsCompressionErrors int + cachedPostingsOriginalSizeSum int + cachedPostingsCompressedSizeSum int + cachedPostingsCompressionTimeSum time.Duration + cachedPostingsDecompressions int + cachedPostingsDecompressionErrors int + cachedPostingsDecompressionTimeSum time.Duration + seriesTouched int seriesTouchedSizeSum int seriesFetched int @@ -1967,6 +2093,15 @@ func (s queryStats) merge(o *queryStats) *queryStats { s.postingsFetchCount += o.postingsFetchCount s.postingsFetchDurationSum += o.postingsFetchDurationSum + s.cachedPostingsCompressions += o.cachedPostingsCompressions + s.cachedPostingsCompressionErrors += o.cachedPostingsCompressionErrors + s.cachedPostingsOriginalSizeSum += o.cachedPostingsOriginalSizeSum + s.cachedPostingsCompressedSizeSum += o.cachedPostingsCompressedSizeSum + s.cachedPostingsCompressionTimeSum += o.cachedPostingsCompressionTimeSum + s.cachedPostingsDecompressions += o.cachedPostingsDecompressions + s.cachedPostingsDecompressionErrors += o.cachedPostingsDecompressionErrors + s.cachedPostingsDecompressionTimeSum += o.cachedPostingsDecompressionTimeSum + s.seriesTouched += o.seriesTouched s.seriesTouchedSizeSum += o.seriesTouchedSizeSum s.seriesFetched += o.seriesFetched diff --git a/vendor/github.com/thanos-io/thanos/pkg/store/cache/inmemory.go b/vendor/github.com/thanos-io/thanos/pkg/store/cache/inmemory.go index 739d73b5bb..f91ec5de48 100644 --- a/vendor/github.com/thanos-io/thanos/pkg/store/cache/inmemory.go +++ b/vendor/github.com/thanos-io/thanos/pkg/store/cache/inmemory.go @@ -5,7 +5,6 @@ package storecache import ( "context" - "math" "reflect" "sync" "unsafe" @@ -16,7 +15,9 @@ import ( "github.com/oklog/ulid" "github.com/pkg/errors" "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promauto" "github.com/prometheus/prometheus/pkg/labels" + "github.com/thanos-io/thanos/pkg/model" "gopkg.in/yaml.v2" ) @@ -27,6 +28,8 @@ var ( } ) +const maxInt = int(^uint(0) >> 1) + type InMemoryIndexCache struct { mtx sync.Mutex @@ -50,9 +53,9 @@ type InMemoryIndexCache struct { // InMemoryIndexCacheConfig holds the in-memory index cache config. type InMemoryIndexCacheConfig struct { // MaxSize represents overall maximum number of bytes cache can contain. - MaxSize Bytes `yaml:"max_size"` + MaxSize model.Bytes `yaml:"max_size"` // MaxItemSize represents maximum size of single item. - MaxItemSize Bytes `yaml:"max_item_size"` + MaxItemSize model.Bytes `yaml:"max_item_size"` } // parseInMemoryIndexCacheConfig unmarshals a buffer into a InMemoryIndexCacheConfig with default values. @@ -89,81 +92,78 @@ func NewInMemoryIndexCacheWithConfig(logger log.Logger, reg prometheus.Registere maxItemSizeBytes: uint64(config.MaxItemSize), } - c.evicted = prometheus.NewCounterVec(prometheus.CounterOpts{ + c.evicted = promauto.With(reg).NewCounterVec(prometheus.CounterOpts{ Name: "thanos_store_index_cache_items_evicted_total", Help: "Total number of items that were evicted from the index cache.", }, []string{"item_type"}) c.evicted.WithLabelValues(cacheTypePostings) c.evicted.WithLabelValues(cacheTypeSeries) - c.added = prometheus.NewCounterVec(prometheus.CounterOpts{ + c.added = promauto.With(reg).NewCounterVec(prometheus.CounterOpts{ Name: "thanos_store_index_cache_items_added_total", Help: "Total number of items that were added to the index cache.", }, []string{"item_type"}) c.added.WithLabelValues(cacheTypePostings) c.added.WithLabelValues(cacheTypeSeries) - c.requests = prometheus.NewCounterVec(prometheus.CounterOpts{ + c.requests = promauto.With(reg).NewCounterVec(prometheus.CounterOpts{ Name: "thanos_store_index_cache_requests_total", Help: "Total number of requests to the cache.", }, []string{"item_type"}) c.requests.WithLabelValues(cacheTypePostings) c.requests.WithLabelValues(cacheTypeSeries) - c.overflow = prometheus.NewCounterVec(prometheus.CounterOpts{ + c.overflow = promauto.With(reg).NewCounterVec(prometheus.CounterOpts{ Name: "thanos_store_index_cache_items_overflowed_total", Help: "Total number of items that could not be added to the cache due to being too big.", }, []string{"item_type"}) c.overflow.WithLabelValues(cacheTypePostings) c.overflow.WithLabelValues(cacheTypeSeries) - c.hits = prometheus.NewCounterVec(prometheus.CounterOpts{ + c.hits = promauto.With(reg).NewCounterVec(prometheus.CounterOpts{ Name: "thanos_store_index_cache_hits_total", Help: "Total number of requests to the cache that were a hit.", }, []string{"item_type"}) c.hits.WithLabelValues(cacheTypePostings) c.hits.WithLabelValues(cacheTypeSeries) - c.current = prometheus.NewGaugeVec(prometheus.GaugeOpts{ + c.current = promauto.With(reg).NewGaugeVec(prometheus.GaugeOpts{ Name: "thanos_store_index_cache_items", Help: "Current number of items in the index cache.", }, []string{"item_type"}) c.current.WithLabelValues(cacheTypePostings) c.current.WithLabelValues(cacheTypeSeries) - c.currentSize = prometheus.NewGaugeVec(prometheus.GaugeOpts{ + c.currentSize = promauto.With(reg).NewGaugeVec(prometheus.GaugeOpts{ Name: "thanos_store_index_cache_items_size_bytes", Help: "Current byte size of items in the index cache.", }, []string{"item_type"}) c.currentSize.WithLabelValues(cacheTypePostings) c.currentSize.WithLabelValues(cacheTypeSeries) - c.totalCurrentSize = prometheus.NewGaugeVec(prometheus.GaugeOpts{ + c.totalCurrentSize = promauto.With(reg).NewGaugeVec(prometheus.GaugeOpts{ Name: "thanos_store_index_cache_total_size_bytes", Help: "Current byte size of items (both value and key) in the index cache.", }, []string{"item_type"}) c.totalCurrentSize.WithLabelValues(cacheTypePostings) c.totalCurrentSize.WithLabelValues(cacheTypeSeries) - if reg != nil { - reg.MustRegister(prometheus.NewGaugeFunc(prometheus.GaugeOpts{ - Name: "thanos_store_index_cache_max_size_bytes", - Help: "Maximum number of bytes to be held in the index cache.", - }, func() float64 { - return float64(c.maxSizeBytes) - })) - reg.MustRegister(prometheus.NewGaugeFunc(prometheus.GaugeOpts{ - Name: "thanos_store_index_cache_max_item_size_bytes", - Help: "Maximum number of bytes for single entry to be held in the index cache.", - }, func() float64 { - return float64(c.maxItemSizeBytes) - })) - reg.MustRegister(c.requests, c.hits, c.added, c.evicted, c.current, c.currentSize, c.totalCurrentSize, c.overflow) - } + _ = promauto.With(reg).NewGaugeFunc(prometheus.GaugeOpts{ + Name: "thanos_store_index_cache_max_size_bytes", + Help: "Maximum number of bytes to be held in the index cache.", + }, func() float64 { + return float64(c.maxSizeBytes) + }) + _ = promauto.With(reg).NewGaugeFunc(prometheus.GaugeOpts{ + Name: "thanos_store_index_cache_max_item_size_bytes", + Help: "Maximum number of bytes for single entry to be held in the index cache.", + }, func() float64 { + return float64(c.maxItemSizeBytes) + }) // Initialize LRU cache with a high size limit since we will manage evictions ourselves // based on stored size using `RemoveOldest` method. - l, err := lru.NewLRU(math.MaxInt64, c.onEvict) + l, err := lru.NewLRU(maxInt, c.onEvict) if err != nil { return nil, err } @@ -173,7 +173,7 @@ func NewInMemoryIndexCacheWithConfig(logger log.Logger, reg prometheus.Registere "msg", "created in-memory index cache", "maxItemSizeBytes", c.maxItemSizeBytes, "maxSizeBytes", c.maxSizeBytes, - "maxItems", "math.MaxInt64", + "maxItems", "maxInt", ) return c, nil } diff --git a/vendor/github.com/thanos-io/thanos/pkg/store/cache/memcached.go b/vendor/github.com/thanos-io/thanos/pkg/store/cache/memcached.go index db7ec61c63..74ce30299e 100644 --- a/vendor/github.com/thanos-io/thanos/pkg/store/cache/memcached.go +++ b/vendor/github.com/thanos-io/thanos/pkg/store/cache/memcached.go @@ -11,6 +11,7 @@ import ( "github.com/go-kit/kit/log/level" "github.com/oklog/ulid" "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promauto" "github.com/prometheus/prometheus/pkg/labels" "github.com/thanos-io/thanos/pkg/cacheutil" ) @@ -36,24 +37,20 @@ func NewMemcachedIndexCache(logger log.Logger, memcached cacheutil.MemcachedClie memcached: memcached, } - c.requests = prometheus.NewCounterVec(prometheus.CounterOpts{ + c.requests = promauto.With(reg).NewCounterVec(prometheus.CounterOpts{ Name: "thanos_store_index_cache_requests_total", Help: "Total number of items requests to the cache.", }, []string{"item_type"}) c.requests.WithLabelValues(cacheTypePostings) c.requests.WithLabelValues(cacheTypeSeries) - c.hits = prometheus.NewCounterVec(prometheus.CounterOpts{ + c.hits = promauto.With(reg).NewCounterVec(prometheus.CounterOpts{ Name: "thanos_store_index_cache_hits_total", Help: "Total number of items requests to the cache that were a hit.", }, []string{"item_type"}) c.hits.WithLabelValues(cacheTypePostings) c.hits.WithLabelValues(cacheTypeSeries) - if reg != nil { - reg.MustRegister(c.requests, c.hits) - } - level.Info(logger).Log("msg", "created memcached index cache") return c, nil diff --git a/vendor/github.com/thanos-io/thanos/pkg/store/postings_codec.go b/vendor/github.com/thanos-io/thanos/pkg/store/postings_codec.go new file mode 100644 index 0000000000..246d8bab81 --- /dev/null +++ b/vendor/github.com/thanos-io/thanos/pkg/store/postings_codec.go @@ -0,0 +1,135 @@ +// Copyright (c) The Thanos Authors. +// Licensed under the Apache License 2.0. + +package store + +import ( + "bytes" + + "github.com/golang/snappy" + "github.com/pkg/errors" + "github.com/prometheus/prometheus/tsdb/encoding" + "github.com/prometheus/prometheus/tsdb/index" +) + +// This file implements encoding and decoding of postings using diff (or delta) + varint +// number encoding. On top of that, we apply Snappy compression. +// +// On its own, Snappy compressing raw postings doesn't really help, because there is no +// repetition in raw data. Using diff (delta) between postings entries makes values small, +// and Varint is very efficient at encoding small values (values < 128 are encoded as +// single byte, values < 16384 are encoded as two bytes). Diff + varint reduces postings size +// significantly (to about 20% of original), snappy then halves it to ~10% of the original. + +const ( + codecHeaderSnappy = "dvs" // As in "diff+varint+snappy". +) + +// isDiffVarintSnappyEncodedPostings returns true, if input looks like it has been encoded by diff+varint+snappy codec. +func isDiffVarintSnappyEncodedPostings(input []byte) bool { + return bytes.HasPrefix(input, []byte(codecHeaderSnappy)) +} + +// diffVarintSnappyEncode encodes postings into diff+varint representation, +// and applies snappy compression on the result. +// Returned byte slice starts with codecHeaderSnappy header. +func diffVarintSnappyEncode(p index.Postings) ([]byte, error) { + buf, err := diffVarintEncodeNoHeader(p) + if err != nil { + return nil, err + } + + // Make result buffer large enough to hold our header and compressed block. + result := make([]byte, len(codecHeaderSnappy)+snappy.MaxEncodedLen(len(buf))) + copy(result, codecHeaderSnappy) + + compressed := snappy.Encode(result[len(codecHeaderSnappy):], buf) + + // Slice result buffer based on compressed size. + result = result[:len(codecHeaderSnappy)+len(compressed)] + return result, nil +} + +// diffVarintEncodeNoHeader encodes postings into diff+varint representation. +// It doesn't add any header to the output bytes. +func diffVarintEncodeNoHeader(p index.Postings) ([]byte, error) { + buf := encoding.Encbuf{} + + prev := uint64(0) + for p.Next() { + v := p.At() + if v < prev { + return nil, errors.Errorf("postings entries must be in increasing order, current: %d, previous: %d", v, prev) + } + + // This is the 'diff' part -- compute difference from previous value. + buf.PutUvarint64(v - prev) + prev = v + } + if p.Err() != nil { + return nil, p.Err() + } + + return buf.B, nil +} + +func diffVarintSnappyDecode(input []byte) (index.Postings, error) { + if !isDiffVarintSnappyEncodedPostings(input) { + return nil, errors.New("header not found") + } + + raw, err := snappy.Decode(nil, input[len(codecHeaderSnappy):]) + if err != nil { + return nil, errors.Errorf("snappy decode: %w", err) + } + + return newDiffVarintPostings(raw), nil +} + +func newDiffVarintPostings(input []byte) *diffVarintPostings { + return &diffVarintPostings{buf: &encoding.Decbuf{B: input}} +} + +// diffVarintPostings is an implementation of index.Postings based on diff+varint encoded data. +type diffVarintPostings struct { + buf *encoding.Decbuf + cur uint64 +} + +func (it *diffVarintPostings) At() uint64 { + return it.cur +} + +func (it *diffVarintPostings) Next() bool { + if it.buf.Err() != nil || it.buf.Len() == 0 { + return false + } + + val := it.buf.Uvarint64() + if it.buf.Err() != nil { + return false + } + + it.cur = it.cur + val + return true +} + +func (it *diffVarintPostings) Seek(x uint64) bool { + if it.cur >= x { + return true + } + + // We cannot do any search due to how values are stored, + // so we simply advance until we find the right value. + for it.Next() { + if it.At() >= x { + return true + } + } + + return false +} + +func (it *diffVarintPostings) Err() error { + return it.buf.Err() +} diff --git a/vendor/github.com/thanos-io/thanos/pkg/store/prometheus.go b/vendor/github.com/thanos-io/thanos/pkg/store/prometheus.go index ed32b389b5..8d041dab94 100644 --- a/vendor/github.com/thanos-io/thanos/pkg/store/prometheus.go +++ b/vendor/github.com/thanos-io/thanos/pkg/store/prometheus.go @@ -29,13 +29,13 @@ import ( "github.com/prometheus/common/version" "github.com/prometheus/prometheus/pkg/labels" "github.com/prometheus/prometheus/pkg/timestamp" - "github.com/prometheus/prometheus/prompb" "github.com/prometheus/prometheus/storage/remote" "github.com/prometheus/prometheus/tsdb/chunkenc" "github.com/thanos-io/thanos/pkg/component" "github.com/thanos-io/thanos/pkg/exthttp" "github.com/thanos-io/thanos/pkg/runutil" "github.com/thanos-io/thanos/pkg/store/storepb" + "github.com/thanos-io/thanos/pkg/store/storepb/prompb" "github.com/thanos-io/thanos/pkg/tracing" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" @@ -178,12 +178,7 @@ func (p *PrometheusStore) Series(r *storepb.SeriesRequest, s storepb.Store_Serie for k, v := range lbm { lset = append(lset, storepb.Label{Name: k, Value: v}) } - for _, l := range externalLabels { - lset = append(lset, storepb.Label{ - Name: l.Name, - Value: l.Value, - }) - } + lset = append(lset, storepb.PromLabelsToLabelsUnsafe(externalLabels)...) sort.Slice(lset, func(i, j int) bool { return lset[i].Name < lset[j].Name }) @@ -366,7 +361,7 @@ func (p *PrometheusStore) handleStreamedPrometheusResponse(s storepb.Store_Serie return nil } -func (p *PrometheusStore) fetchSampledResponse(ctx context.Context, resp *http.Response) (*prompb.ReadResponse, error) { +func (p *PrometheusStore) fetchSampledResponse(ctx context.Context, resp *http.Response) (_ *prompb.ReadResponse, err error) { defer runutil.ExhaustCloseWithLogOnErr(p.logger, resp.Body, "prom series request body") b := p.getBuffer() @@ -375,21 +370,24 @@ func (p *PrometheusStore) fetchSampledResponse(ctx context.Context, resp *http.R if _, err := io.Copy(buf, resp.Body); err != nil { return nil, errors.Wrap(err, "copy response") } - spanSnappyDecode, ctx := tracing.StartSpan(ctx, "decompress_response") + sb := p.getBuffer() - decomp, err := snappy.Decode(*sb, buf.Bytes()) - spanSnappyDecode.Finish() + var decomp []byte + tracing.DoInSpan(ctx, "decompress_response", func(ctx context.Context) { + decomp, err = snappy.Decode(*sb, buf.Bytes()) + }) defer p.putBuffer(sb) if err != nil { return nil, errors.Wrap(err, "decompress response") } var data prompb.ReadResponse - spanUnmarshal, _ := tracing.StartSpan(ctx, "unmarshal_response") - if err := proto.Unmarshal(decomp, &data); err != nil { + tracing.DoInSpan(ctx, "unmarshal_response", func(ctx context.Context) { + err = proto.Unmarshal(decomp, &data) + }) + if err != nil { return nil, errors.Wrap(err, "unmarshal response") } - spanUnmarshal.Finish() if len(data.Results) != 1 { return nil, errors.Errorf("unexpected result size %d", len(data.Results)) } @@ -423,7 +421,7 @@ func (p *PrometheusStore) chunkSamples(series *prompb.TimeSeries, maxSamplesPerC return chks, nil } -func (p *PrometheusStore) startPromSeries(ctx context.Context, q *prompb.Query) (*http.Response, error) { +func (p *PrometheusStore) startPromSeries(ctx context.Context, q *prompb.Query) (presp *http.Response, err error) { reqb, err := proto.Marshal(&prompb.ReadRequest{ Queries: []*prompb.Query{q}, AcceptedResponseTypes: p.remoteReadAcceptableResponses, @@ -447,10 +445,10 @@ func (p *PrometheusStore) startPromSeries(ctx context.Context, q *prompb.Query) preq.Header.Add("Content-Encoding", "snappy") preq.Header.Set("Content-Type", "application/x-stream-protobuf") preq.Header.Set("User-Agent", userAgent) - spanReqDo, ctx := tracing.StartSpan(ctx, "query_prometheus_request", opentracing.Tag{Key: "prometheus.query", Value: string(qjson)}) - preq = preq.WithContext(ctx) - presp, err := p.client.Do(preq) - spanReqDo.Finish() + tracing.DoInSpan(ctx, "query_prometheus_request", func(ctx context.Context) { + preq = preq.WithContext(ctx) + presp, err = p.client.Do(preq) + }, opentracing.Tag{Key: "prometheus.query", Value: string(qjson)}) if err != nil { return nil, errors.Wrap(err, "send request") } @@ -515,32 +513,34 @@ func (p *PrometheusStore) encodeChunk(ss []prompb.Sample) (storepb.Chunk_Encodin // translateAndExtendLabels transforms a metrics into a protobuf label set. It additionally // attaches the given labels to it, overwriting existing ones on collision. +// Both input labels are expected to be sorted. +// +// NOTE(bwplotka): Don't use modify passed slices as we reuse underlying memory. func (p *PrometheusStore) translateAndExtendLabels(m []prompb.Label, extend labels.Labels) []storepb.Label { + pbLabels := storepb.PrompbLabelsToLabelsUnsafe(m) + pbExtend := storepb.PromLabelsToLabelsUnsafe(extend) + lset := make([]storepb.Label, 0, len(m)+len(extend)) + ei := 0 - for _, l := range m { - if extend.Get(l.Name) != "" { - continue +Outer: + for _, l := range pbLabels { + for ei < len(pbExtend) { + if l.Name < pbExtend[ei].Name { + break + } + lset = append(lset, pbExtend[ei]) + ei++ + if l.Name == pbExtend[ei-1].Name { + continue Outer + } } - lset = append(lset, storepb.Label{ - Name: l.Name, - Value: l.Value, - }) + lset = append(lset, l) } - - return extendLset(lset, extend) -} - -func extendLset(lset []storepb.Label, extend labels.Labels) []storepb.Label { - for _, l := range extend { - lset = append(lset, storepb.Label{ - Name: l.Name, - Value: l.Value, - }) + for ei < len(pbExtend) { + lset = append(lset, pbExtend[ei]) + ei++ } - sort.Slice(lset, func(i, j int) bool { - return lset[i].Name < lset[j].Name - }) return lset } diff --git a/vendor/github.com/thanos-io/thanos/pkg/store/proxy.go b/vendor/github.com/thanos-io/thanos/pkg/store/proxy.go index 974a25215d..8440de2f96 100644 --- a/vendor/github.com/thanos-io/thanos/pkg/store/proxy.go +++ b/vendor/github.com/thanos-io/thanos/pkg/store/proxy.go @@ -19,6 +19,7 @@ import ( "github.com/opentracing/opentracing-go" "github.com/pkg/errors" "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promauto" "github.com/prometheus/prometheus/pkg/labels" "github.com/thanos-io/thanos/pkg/component" "github.com/thanos-io/thanos/pkg/store/storepb" @@ -63,16 +64,11 @@ type proxyStoreMetrics struct { func newProxyStoreMetrics(reg prometheus.Registerer) *proxyStoreMetrics { var m proxyStoreMetrics - m.emptyStreamResponses = prometheus.NewCounter(prometheus.CounterOpts{ + m.emptyStreamResponses = promauto.With(reg).NewCounter(prometheus.CounterOpts{ Name: "thanos_proxy_store_empty_stream_responses_total", Help: "Total number of empty responses received.", }) - if reg != nil { - reg.MustRegister( - m.emptyStreamResponses, - ) - } return &m } @@ -113,9 +109,9 @@ func (s *ProxyStore) Info(ctx context.Context, r *storepb.InfoRequest) (*storepb maxTime := int64(0) stores := s.stores() - // Edge case: we have all of the data if there are no stores. + // Edge case: we have no data if there are no stores. if len(stores) == 0 { - res.MaxTime = math.MaxInt64 + res.MaxTime = 0 res.MinTime = 0 return res, nil @@ -249,9 +245,11 @@ func (s *ProxyStore) Series(r *storepb.SeriesRequest, srv storepb.Store_SeriesSe // We might be able to skip the store if its meta information indicates // it cannot have series matching our query. // NOTE: all matchers are validated in matchesExternalLabels method so we explicitly ignore error. - spanStoreMathes, gctx := tracing.StartSpan(gctx, "store_matches") - ok, _ := storeMatches(st, r.MinTime, r.MaxTime, r.Matchers...) - spanStoreMathes.Finish() + var ok bool + tracing.DoInSpan(gctx, "store_matches", func(ctx context.Context) { + // We can skip error, we already translated matchers once. + ok, _ = storeMatches(st, r.MinTime, r.MaxTime, r.Matchers...) + }) if !ok { storeDebugMsgs = append(storeDebugMsgs, fmt.Sprintf("store %s filtered out", st)) continue diff --git a/vendor/github.com/thanos-io/thanos/pkg/store/storepb/custom.go b/vendor/github.com/thanos-io/thanos/pkg/store/storepb/custom.go index ea13089be4..ae5a099e6e 100644 --- a/vendor/github.com/thanos-io/thanos/pkg/store/storepb/custom.go +++ b/vendor/github.com/thanos-io/thanos/pkg/store/storepb/custom.go @@ -5,8 +5,10 @@ package storepb import ( "strings" + "unsafe" "github.com/prometheus/prometheus/pkg/labels" + "github.com/thanos-io/thanos/pkg/store/storepb/prompb" ) var PartialResponseStrategyValues = func() []string { @@ -166,15 +168,57 @@ func (s *mergedSeriesSet) Next() bool { return true } +// LabelsToPromLabels converts Thanos proto labels to Prometheus labels in type safe manner. func LabelsToPromLabels(lset []Label) labels.Labels { ret := make(labels.Labels, len(lset)) for i, l := range lset { ret[i] = labels.Label{Name: l.Name, Value: l.Value} } + return ret +} + +// LabelsToPromLabelsUnsafe converts Thanos proto labels to Prometheus labels in type unsafe manner. +// It reuses the same memory. Caller should abort using passed []Labels. +// +// NOTE: This depends on order of struct fields etc, so use with extreme care. +func LabelsToPromLabelsUnsafe(lset []Label) labels.Labels { + return *(*[]labels.Label)(unsafe.Pointer(&lset)) +} +// PromLabelsToLabels converts Prometheus labels to Thanos proto labels in type safe manner. +func PromLabelsToLabels(lset labels.Labels) []Label { + ret := make([]Label, len(lset)) + for i, l := range lset { + ret[i] = Label{Name: l.Name, Value: l.Value} + } return ret } +// PromLabelsToLabelsUnsafe converts Prometheus labels to Thanos proto labels in type unsafe manner. +// It reuses the same memory. Caller should abort using passed labels.Labels. +// +// // NOTE: This depends on order of struct fields etc, so use with extreme care. +func PromLabelsToLabelsUnsafe(lset labels.Labels) []Label { + return *(*[]Label)(unsafe.Pointer(&lset)) +} + +// PrompbLabelsToLabels converts Prometheus labels to Thanos proto labels in type safe manner. +func PrompbLabelsToLabels(lset []prompb.Label) []Label { + ret := make([]Label, len(lset)) + for i, l := range lset { + ret[i] = Label{Name: l.Name, Value: l.Value} + } + return ret +} + +// PrompbLabelsToLabelsUnsafe converts Prometheus proto labels to Thanos proto labels in type unsafe manner. +// It reuses the same memory. Caller should abort using passed labels.Labels. +// +// // NOTE: This depends on order of struct fields etc, so use with extreme care. +func PrompbLabelsToLabelsUnsafe(lset []prompb.Label) []Label { + return *(*[]Label)(unsafe.Pointer(&lset)) +} + func LabelsToString(lset []Label) string { var s []string for _, l := range lset { diff --git a/vendor/github.com/thanos-io/thanos/pkg/store/storepb/prompb/README.md b/vendor/github.com/thanos-io/thanos/pkg/store/storepb/prompb/README.md new file mode 100644 index 0000000000..b68a8c8ba4 --- /dev/null +++ b/vendor/github.com/thanos-io/thanos/pkg/store/storepb/prompb/README.md @@ -0,0 +1,11 @@ +NOTE(bwplotka): This excerpt of "github.com/prometheus/prometheus/prompb" reconstructed to avoid XXX fields for unsafe conversion to safe allocs. + +The compiled protobufs are version controlled and you won't normally need to +re-compile them when building Prometheus. + +If however you have modified the defs and do need to re-compile, run +`make proto` from the parent dir. + +In order for the script to run, you'll need `protoc` (version 3.5.1) in your +PATH. + diff --git a/vendor/github.com/thanos-io/thanos/pkg/store/storepb/prompb/remote.pb.go b/vendor/github.com/thanos-io/thanos/pkg/store/storepb/prompb/remote.pb.go new file mode 100644 index 0000000000..83902b37be --- /dev/null +++ b/vendor/github.com/thanos-io/thanos/pkg/store/storepb/prompb/remote.pb.go @@ -0,0 +1,1590 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: remote.proto + +package prompb + +import ( + fmt "fmt" + io "io" + math "math" + math_bits "math/bits" + + _ "github.com/gogo/protobuf/gogoproto" + proto "github.com/gogo/protobuf/proto" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +type ReadRequest_ResponseType int32 + +const ( + // Server will return a single ReadResponse message with matched series that includes list of raw samples. + // It's recommended to use streamed response types instead. + // + // Response headers: + // Content-Type: "application/x-protobuf" + // Content-Encoding: "snappy" + ReadRequest_SAMPLES ReadRequest_ResponseType = 0 + // Server will stream a delimited ChunkedReadResponse message that contains XOR encoded chunks for a single series. + // Each message is following varint size and fixed size bigendian uint32 for CRC32 Castagnoli checksum. + // + // Response headers: + // Content-Type: "application/x-streamed-protobuf; proto=prometheus.ChunkedReadResponse" + // Content-Encoding: "" + ReadRequest_STREAMED_XOR_CHUNKS ReadRequest_ResponseType = 1 +) + +var ReadRequest_ResponseType_name = map[int32]string{ + 0: "SAMPLES", + 1: "STREAMED_XOR_CHUNKS", +} + +var ReadRequest_ResponseType_value = map[string]int32{ + "SAMPLES": 0, + "STREAMED_XOR_CHUNKS": 1, +} + +func (x ReadRequest_ResponseType) String() string { + return proto.EnumName(ReadRequest_ResponseType_name, int32(x)) +} + +func (ReadRequest_ResponseType) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_eefc82927d57d89b, []int{1, 0} +} + +type WriteRequest struct { + Timeseries []TimeSeries `protobuf:"bytes,1,rep,name=timeseries,proto3" json:"timeseries"` +} + +func (m *WriteRequest) Reset() { *m = WriteRequest{} } +func (m *WriteRequest) String() string { return proto.CompactTextString(m) } +func (*WriteRequest) ProtoMessage() {} +func (*WriteRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_eefc82927d57d89b, []int{0} +} +func (m *WriteRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *WriteRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_WriteRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *WriteRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_WriteRequest.Merge(m, src) +} +func (m *WriteRequest) XXX_Size() int { + return m.Size() +} +func (m *WriteRequest) XXX_DiscardUnknown() { + xxx_messageInfo_WriteRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_WriteRequest proto.InternalMessageInfo + +func (m *WriteRequest) GetTimeseries() []TimeSeries { + if m != nil { + return m.Timeseries + } + return nil +} + +// ReadRequest represents a remote read request. +type ReadRequest struct { + Queries []*Query `protobuf:"bytes,1,rep,name=queries,proto3" json:"queries,omitempty"` + // accepted_response_types allows negotiating the content type of the response. + // + // Response types are taken from the list in the FIFO order. If no response type in `accepted_response_types` is + // implemented by server, error is returned. + // For request that do not contain `accepted_response_types` field the SAMPLES response type will be used. + AcceptedResponseTypes []ReadRequest_ResponseType `protobuf:"varint,2,rep,packed,name=accepted_response_types,json=acceptedResponseTypes,proto3,enum=prometheus_copy.ReadRequest_ResponseType" json:"accepted_response_types,omitempty"` +} + +func (m *ReadRequest) Reset() { *m = ReadRequest{} } +func (m *ReadRequest) String() string { return proto.CompactTextString(m) } +func (*ReadRequest) ProtoMessage() {} +func (*ReadRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_eefc82927d57d89b, []int{1} +} +func (m *ReadRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ReadRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ReadRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *ReadRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_ReadRequest.Merge(m, src) +} +func (m *ReadRequest) XXX_Size() int { + return m.Size() +} +func (m *ReadRequest) XXX_DiscardUnknown() { + xxx_messageInfo_ReadRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_ReadRequest proto.InternalMessageInfo + +func (m *ReadRequest) GetQueries() []*Query { + if m != nil { + return m.Queries + } + return nil +} + +func (m *ReadRequest) GetAcceptedResponseTypes() []ReadRequest_ResponseType { + if m != nil { + return m.AcceptedResponseTypes + } + return nil +} + +// ReadResponse is a response when response_type equals SAMPLES. +type ReadResponse struct { + // In same order as the request's queries. + Results []*QueryResult `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"` +} + +func (m *ReadResponse) Reset() { *m = ReadResponse{} } +func (m *ReadResponse) String() string { return proto.CompactTextString(m) } +func (*ReadResponse) ProtoMessage() {} +func (*ReadResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_eefc82927d57d89b, []int{2} +} +func (m *ReadResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ReadResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ReadResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *ReadResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_ReadResponse.Merge(m, src) +} +func (m *ReadResponse) XXX_Size() int { + return m.Size() +} +func (m *ReadResponse) XXX_DiscardUnknown() { + xxx_messageInfo_ReadResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_ReadResponse proto.InternalMessageInfo + +func (m *ReadResponse) GetResults() []*QueryResult { + if m != nil { + return m.Results + } + return nil +} + +type Query struct { + StartTimestampMs int64 `protobuf:"varint,1,opt,name=start_timestamp_ms,json=startTimestampMs,proto3" json:"start_timestamp_ms,omitempty"` + EndTimestampMs int64 `protobuf:"varint,2,opt,name=end_timestamp_ms,json=endTimestampMs,proto3" json:"end_timestamp_ms,omitempty"` + Matchers []*LabelMatcher `protobuf:"bytes,3,rep,name=matchers,proto3" json:"matchers,omitempty"` + Hints *ReadHints `protobuf:"bytes,4,opt,name=hints,proto3" json:"hints,omitempty"` +} + +func (m *Query) Reset() { *m = Query{} } +func (m *Query) String() string { return proto.CompactTextString(m) } +func (*Query) ProtoMessage() {} +func (*Query) Descriptor() ([]byte, []int) { + return fileDescriptor_eefc82927d57d89b, []int{3} +} +func (m *Query) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Query) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Query.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *Query) XXX_Merge(src proto.Message) { + xxx_messageInfo_Query.Merge(m, src) +} +func (m *Query) XXX_Size() int { + return m.Size() +} +func (m *Query) XXX_DiscardUnknown() { + xxx_messageInfo_Query.DiscardUnknown(m) +} + +var xxx_messageInfo_Query proto.InternalMessageInfo + +func (m *Query) GetStartTimestampMs() int64 { + if m != nil { + return m.StartTimestampMs + } + return 0 +} + +func (m *Query) GetEndTimestampMs() int64 { + if m != nil { + return m.EndTimestampMs + } + return 0 +} + +func (m *Query) GetMatchers() []*LabelMatcher { + if m != nil { + return m.Matchers + } + return nil +} + +func (m *Query) GetHints() *ReadHints { + if m != nil { + return m.Hints + } + return nil +} + +type QueryResult struct { + // Samples within a time series must be ordered by time. + Timeseries []*TimeSeries `protobuf:"bytes,1,rep,name=timeseries,proto3" json:"timeseries,omitempty"` +} + +func (m *QueryResult) Reset() { *m = QueryResult{} } +func (m *QueryResult) String() string { return proto.CompactTextString(m) } +func (*QueryResult) ProtoMessage() {} +func (*QueryResult) Descriptor() ([]byte, []int) { + return fileDescriptor_eefc82927d57d89b, []int{4} +} +func (m *QueryResult) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryResult.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryResult) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryResult.Merge(m, src) +} +func (m *QueryResult) XXX_Size() int { + return m.Size() +} +func (m *QueryResult) XXX_DiscardUnknown() { + xxx_messageInfo_QueryResult.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryResult proto.InternalMessageInfo + +func (m *QueryResult) GetTimeseries() []*TimeSeries { + if m != nil { + return m.Timeseries + } + return nil +} + +// ChunkedReadResponse is a response when response_type equals STREAMED_XOR_CHUNKS. +// We strictly stream full series after series, optionally split by time. This means that a single frame can contain +// partition of the single series, but once a new series is started to be streamed it means that no more chunks will +// be sent for previous one. +type ChunkedReadResponse struct { + ChunkedSeries []*ChunkedSeries `protobuf:"bytes,1,rep,name=chunked_series,json=chunkedSeries,proto3" json:"chunked_series,omitempty"` + // query_index represents an index of the query from ReadRequest.queries these chunks relates to. + QueryIndex int64 `protobuf:"varint,2,opt,name=query_index,json=queryIndex,proto3" json:"query_index,omitempty"` +} + +func (m *ChunkedReadResponse) Reset() { *m = ChunkedReadResponse{} } +func (m *ChunkedReadResponse) String() string { return proto.CompactTextString(m) } +func (*ChunkedReadResponse) ProtoMessage() {} +func (*ChunkedReadResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_eefc82927d57d89b, []int{5} +} +func (m *ChunkedReadResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ChunkedReadResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ChunkedReadResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *ChunkedReadResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_ChunkedReadResponse.Merge(m, src) +} +func (m *ChunkedReadResponse) XXX_Size() int { + return m.Size() +} +func (m *ChunkedReadResponse) XXX_DiscardUnknown() { + xxx_messageInfo_ChunkedReadResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_ChunkedReadResponse proto.InternalMessageInfo + +func (m *ChunkedReadResponse) GetChunkedSeries() []*ChunkedSeries { + if m != nil { + return m.ChunkedSeries + } + return nil +} + +func (m *ChunkedReadResponse) GetQueryIndex() int64 { + if m != nil { + return m.QueryIndex + } + return 0 +} + +func init() { + proto.RegisterEnum("prometheus_copy.ReadRequest_ResponseType", ReadRequest_ResponseType_name, ReadRequest_ResponseType_value) + proto.RegisterType((*WriteRequest)(nil), "prometheus_copy.WriteRequest") + proto.RegisterType((*ReadRequest)(nil), "prometheus_copy.ReadRequest") + proto.RegisterType((*ReadResponse)(nil), "prometheus_copy.ReadResponse") + proto.RegisterType((*Query)(nil), "prometheus_copy.Query") + proto.RegisterType((*QueryResult)(nil), "prometheus_copy.QueryResult") + proto.RegisterType((*ChunkedReadResponse)(nil), "prometheus_copy.ChunkedReadResponse") +} + +func init() { proto.RegisterFile("remote.proto", fileDescriptor_eefc82927d57d89b) } + +var fileDescriptor_eefc82927d57d89b = []byte{ + // 486 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x93, 0xcd, 0x6e, 0xd3, 0x40, + 0x10, 0x80, 0xed, 0xa6, 0x6d, 0xd0, 0x38, 0x84, 0x68, 0x0b, 0x34, 0x0a, 0xe0, 0x46, 0x3e, 0x19, + 0x09, 0x85, 0x2a, 0x20, 0x24, 0xc4, 0x29, 0x2d, 0x41, 0x05, 0x1a, 0xa0, 0xeb, 0x20, 0x10, 0x17, + 0xcb, 0xb1, 0x47, 0x8d, 0x45, 0xfd, 0xd3, 0xdd, 0xb5, 0x84, 0x0f, 0xbc, 0x03, 0x8f, 0xd5, 0x03, + 0x87, 0x1e, 0x7b, 0x42, 0x28, 0x79, 0x11, 0xe4, 0x75, 0x1c, 0x6d, 0x08, 0x1c, 0x7a, 0xdb, 0xcc, + 0x7c, 0xf3, 0xed, 0xce, 0x64, 0x0c, 0x0d, 0x86, 0x51, 0x22, 0xb0, 0x97, 0xb2, 0x44, 0x24, 0xe4, + 0x56, 0xca, 0x92, 0x08, 0xc5, 0x14, 0x33, 0xee, 0xfa, 0x49, 0x9a, 0x77, 0x0c, 0x91, 0xa7, 0xc8, + 0xcb, 0x6c, 0xe7, 0xf6, 0x69, 0x72, 0x9a, 0xc8, 0xe3, 0xe3, 0xe2, 0x54, 0x46, 0xad, 0x13, 0x68, + 0x7c, 0x62, 0xa1, 0x40, 0x8a, 0xe7, 0x19, 0x72, 0x41, 0x06, 0x00, 0x22, 0x8c, 0x90, 0x23, 0x0b, + 0x91, 0xb7, 0xf5, 0x6e, 0xcd, 0x36, 0xfa, 0xf7, 0x7a, 0x7f, 0x89, 0x7b, 0xe3, 0x30, 0x42, 0x47, + 0x22, 0x07, 0x9b, 0x17, 0xbf, 0xf6, 0x34, 0xaa, 0x14, 0x59, 0x57, 0x3a, 0x18, 0x14, 0xbd, 0xa0, + 0x52, 0xee, 0x43, 0xfd, 0x3c, 0x53, 0x7d, 0x77, 0xd7, 0x7c, 0x27, 0x19, 0xb2, 0x9c, 0x56, 0x18, + 0xf1, 0x60, 0xd7, 0xf3, 0x7d, 0x4c, 0x05, 0x06, 0x2e, 0x43, 0x9e, 0x26, 0x31, 0x47, 0x57, 0xf6, + 0xd2, 0xde, 0xe8, 0xd6, 0xec, 0x66, 0xff, 0xe1, 0x9a, 0x41, 0xb9, 0xb0, 0x47, 0x17, 0x25, 0xe3, + 0x3c, 0x45, 0x7a, 0xa7, 0x32, 0xa9, 0x51, 0x6e, 0x3d, 0x85, 0x86, 0x1a, 0x20, 0x06, 0xd4, 0x9d, + 0xc1, 0xe8, 0xc3, 0xf1, 0xd0, 0x69, 0x69, 0x64, 0x17, 0x76, 0x9c, 0x31, 0x1d, 0x0e, 0x46, 0xc3, + 0x97, 0xee, 0xe7, 0xf7, 0xd4, 0x3d, 0x3c, 0xfa, 0xf8, 0xee, 0xad, 0xd3, 0xd2, 0xad, 0x57, 0x45, + 0x95, 0xb7, 0x54, 0x91, 0x67, 0x50, 0x67, 0xc8, 0xb3, 0x33, 0x51, 0xb5, 0x76, 0xff, 0x3f, 0xad, + 0x49, 0x88, 0x56, 0xb0, 0xf5, 0x53, 0x87, 0x2d, 0x99, 0x20, 0x8f, 0x80, 0x70, 0xe1, 0x31, 0xe1, + 0xca, 0x01, 0x0a, 0x2f, 0x4a, 0xdd, 0xa8, 0x90, 0xe9, 0x76, 0x8d, 0xb6, 0x64, 0x66, 0x5c, 0x25, + 0x46, 0x9c, 0xd8, 0xd0, 0xc2, 0x38, 0x58, 0x65, 0x37, 0x24, 0xdb, 0xc4, 0x38, 0x50, 0xc9, 0xe7, + 0x70, 0x23, 0xf2, 0x84, 0x3f, 0x45, 0xc6, 0xdb, 0x35, 0xf9, 0xb4, 0x07, 0x6b, 0x4f, 0x3b, 0xf6, + 0x26, 0x78, 0x36, 0x2a, 0x29, 0xba, 0xc4, 0xc9, 0x3e, 0x6c, 0x4d, 0xc3, 0x58, 0xf0, 0xf6, 0x66, + 0x57, 0xb7, 0x8d, 0x7e, 0xe7, 0x9f, 0xb3, 0x3e, 0x2a, 0x08, 0x5a, 0x82, 0xd6, 0x1b, 0x30, 0x94, + 0x36, 0xc9, 0x8b, 0x6b, 0xee, 0xd0, 0xca, 0xf6, 0x7c, 0x87, 0x9d, 0xc3, 0x69, 0x16, 0x7f, 0x2d, + 0xfe, 0x30, 0x65, 0xd2, 0x43, 0x68, 0xfa, 0x65, 0xd8, 0x5d, 0xf1, 0x9a, 0x6b, 0xde, 0x45, 0xf5, + 0x42, 0x7d, 0xd3, 0x57, 0x7f, 0x92, 0x3d, 0x30, 0x8a, 0x25, 0xcb, 0xdd, 0x30, 0x0e, 0xf0, 0xdb, + 0x62, 0x76, 0x20, 0x43, 0xaf, 0x8b, 0xc8, 0x41, 0xf7, 0x62, 0x66, 0xea, 0x97, 0x33, 0x53, 0xff, + 0x3d, 0x33, 0xf5, 0x1f, 0x73, 0x53, 0xbb, 0x9c, 0x9b, 0xda, 0xd5, 0xdc, 0xd4, 0xbe, 0x6c, 0x17, + 0x17, 0xa5, 0x93, 0xc9, 0xb6, 0xfc, 0x70, 0x9e, 0xfc, 0x09, 0x00, 0x00, 0xff, 0xff, 0x4b, 0x5c, + 0x76, 0xc3, 0x7c, 0x03, 0x00, 0x00, +} + +func (m *WriteRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *WriteRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *WriteRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Timeseries) > 0 { + for iNdEx := len(m.Timeseries) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Timeseries[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintRemote(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *ReadRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ReadRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ReadRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.AcceptedResponseTypes) > 0 { + dAtA2 := make([]byte, len(m.AcceptedResponseTypes)*10) + var j1 int + for _, num := range m.AcceptedResponseTypes { + for num >= 1<<7 { + dAtA2[j1] = uint8(uint64(num)&0x7f | 0x80) + num >>= 7 + j1++ + } + dAtA2[j1] = uint8(num) + j1++ + } + i -= j1 + copy(dAtA[i:], dAtA2[:j1]) + i = encodeVarintRemote(dAtA, i, uint64(j1)) + i-- + dAtA[i] = 0x12 + } + if len(m.Queries) > 0 { + for iNdEx := len(m.Queries) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Queries[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintRemote(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *ReadResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ReadResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ReadResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Results) > 0 { + for iNdEx := len(m.Results) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Results[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintRemote(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *Query) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Query) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Query) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Hints != nil { + { + size, err := m.Hints.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintRemote(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } + if len(m.Matchers) > 0 { + for iNdEx := len(m.Matchers) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Matchers[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintRemote(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + } + if m.EndTimestampMs != 0 { + i = encodeVarintRemote(dAtA, i, uint64(m.EndTimestampMs)) + i-- + dAtA[i] = 0x10 + } + if m.StartTimestampMs != 0 { + i = encodeVarintRemote(dAtA, i, uint64(m.StartTimestampMs)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *QueryResult) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryResult) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryResult) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Timeseries) > 0 { + for iNdEx := len(m.Timeseries) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Timeseries[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintRemote(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *ChunkedReadResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ChunkedReadResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ChunkedReadResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.QueryIndex != 0 { + i = encodeVarintRemote(dAtA, i, uint64(m.QueryIndex)) + i-- + dAtA[i] = 0x10 + } + if len(m.ChunkedSeries) > 0 { + for iNdEx := len(m.ChunkedSeries) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.ChunkedSeries[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintRemote(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func encodeVarintRemote(dAtA []byte, offset int, v uint64) int { + offset -= sovRemote(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *WriteRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Timeseries) > 0 { + for _, e := range m.Timeseries { + l = e.Size() + n += 1 + l + sovRemote(uint64(l)) + } + } + return n +} + +func (m *ReadRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Queries) > 0 { + for _, e := range m.Queries { + l = e.Size() + n += 1 + l + sovRemote(uint64(l)) + } + } + if len(m.AcceptedResponseTypes) > 0 { + l = 0 + for _, e := range m.AcceptedResponseTypes { + l += sovRemote(uint64(e)) + } + n += 1 + sovRemote(uint64(l)) + l + } + return n +} + +func (m *ReadResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Results) > 0 { + for _, e := range m.Results { + l = e.Size() + n += 1 + l + sovRemote(uint64(l)) + } + } + return n +} + +func (m *Query) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.StartTimestampMs != 0 { + n += 1 + sovRemote(uint64(m.StartTimestampMs)) + } + if m.EndTimestampMs != 0 { + n += 1 + sovRemote(uint64(m.EndTimestampMs)) + } + if len(m.Matchers) > 0 { + for _, e := range m.Matchers { + l = e.Size() + n += 1 + l + sovRemote(uint64(l)) + } + } + if m.Hints != nil { + l = m.Hints.Size() + n += 1 + l + sovRemote(uint64(l)) + } + return n +} + +func (m *QueryResult) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Timeseries) > 0 { + for _, e := range m.Timeseries { + l = e.Size() + n += 1 + l + sovRemote(uint64(l)) + } + } + return n +} + +func (m *ChunkedReadResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.ChunkedSeries) > 0 { + for _, e := range m.ChunkedSeries { + l = e.Size() + n += 1 + l + sovRemote(uint64(l)) + } + } + if m.QueryIndex != 0 { + n += 1 + sovRemote(uint64(m.QueryIndex)) + } + return n +} + +func sovRemote(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozRemote(x uint64) (n int) { + return sovRemote(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *WriteRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRemote + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: WriteRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: WriteRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Timeseries", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRemote + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRemote + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthRemote + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Timeseries = append(m.Timeseries, TimeSeries{}) + if err := m.Timeseries[len(m.Timeseries)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRemote(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRemote + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthRemote + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ReadRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRemote + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ReadRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ReadRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Queries", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRemote + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRemote + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthRemote + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Queries = append(m.Queries, &Query{}) + if err := m.Queries[len(m.Queries)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType == 0 { + var v ReadRequest_ResponseType + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRemote + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= ReadRequest_ResponseType(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.AcceptedResponseTypes = append(m.AcceptedResponseTypes, v) + } else if wireType == 2 { + var packedLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRemote + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + packedLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if packedLen < 0 { + return ErrInvalidLengthRemote + } + postIndex := iNdEx + packedLen + if postIndex < 0 { + return ErrInvalidLengthRemote + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + var elementCount int + if elementCount != 0 && len(m.AcceptedResponseTypes) == 0 { + m.AcceptedResponseTypes = make([]ReadRequest_ResponseType, 0, elementCount) + } + for iNdEx < postIndex { + var v ReadRequest_ResponseType + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRemote + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= ReadRequest_ResponseType(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.AcceptedResponseTypes = append(m.AcceptedResponseTypes, v) + } + } else { + return fmt.Errorf("proto: wrong wireType = %d for field AcceptedResponseTypes", wireType) + } + default: + iNdEx = preIndex + skippy, err := skipRemote(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRemote + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthRemote + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ReadResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRemote + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ReadResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ReadResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Results", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRemote + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRemote + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthRemote + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Results = append(m.Results, &QueryResult{}) + if err := m.Results[len(m.Results)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRemote(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRemote + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthRemote + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Query) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRemote + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Query: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Query: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field StartTimestampMs", wireType) + } + m.StartTimestampMs = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRemote + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.StartTimestampMs |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field EndTimestampMs", wireType) + } + m.EndTimestampMs = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRemote + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.EndTimestampMs |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Matchers", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRemote + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRemote + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthRemote + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Matchers = append(m.Matchers, &LabelMatcher{}) + if err := m.Matchers[len(m.Matchers)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Hints", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRemote + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRemote + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthRemote + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Hints == nil { + m.Hints = &ReadHints{} + } + if err := m.Hints.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRemote(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRemote + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthRemote + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryResult) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRemote + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QueryResult: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryResult: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Timeseries", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRemote + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRemote + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthRemote + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Timeseries = append(m.Timeseries, &TimeSeries{}) + if err := m.Timeseries[len(m.Timeseries)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRemote(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRemote + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthRemote + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ChunkedReadResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRemote + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ChunkedReadResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ChunkedReadResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ChunkedSeries", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRemote + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRemote + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthRemote + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ChunkedSeries = append(m.ChunkedSeries, &ChunkedSeries{}) + if err := m.ChunkedSeries[len(m.ChunkedSeries)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field QueryIndex", wireType) + } + m.QueryIndex = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRemote + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.QueryIndex |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipRemote(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRemote + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthRemote + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipRemote(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowRemote + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowRemote + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowRemote + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthRemote + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupRemote + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthRemote + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthRemote = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowRemote = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupRemote = fmt.Errorf("proto: unexpected end of group") +) diff --git a/vendor/github.com/thanos-io/thanos/pkg/store/storepb/prompb/remote.proto b/vendor/github.com/thanos-io/thanos/pkg/store/storepb/prompb/remote.proto new file mode 100644 index 0000000000..e72d94bb01 --- /dev/null +++ b/vendor/github.com/thanos-io/thanos/pkg/store/storepb/prompb/remote.proto @@ -0,0 +1,91 @@ +// Copyright (c) The Thanos Authors. +// Licensed under the Apache License 2.0. + +// Copyright 2016 Prometheus Team +// 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. + +syntax = "proto3"; +package prometheus_copy; + +option go_package = "prompb"; + +import "types.proto"; +import "gogoproto/gogo.proto"; + +// Do not generate XXX fields to reduce memory footprint and opening a door +// for zero-copy casts to/from prometheus data types. +option (gogoproto.goproto_unkeyed_all) = false; +option (gogoproto.goproto_unrecognized_all) = false; +option (gogoproto.goproto_sizecache_all) = false; + +message WriteRequest { + repeated TimeSeries timeseries = 1 [(gogoproto.nullable) = false]; +} + +// ReadRequest represents a remote read request. +message ReadRequest { + repeated Query queries = 1; + + enum ResponseType { + // Server will return a single ReadResponse message with matched series that includes list of raw samples. + // It's recommended to use streamed response types instead. + // + // Response headers: + // Content-Type: "application/x-protobuf" + // Content-Encoding: "snappy" + SAMPLES = 0; + // Server will stream a delimited ChunkedReadResponse message that contains XOR encoded chunks for a single series. + // Each message is following varint size and fixed size bigendian uint32 for CRC32 Castagnoli checksum. + // + // Response headers: + // Content-Type: "application/x-streamed-protobuf; proto=prometheus.ChunkedReadResponse" + // Content-Encoding: "" + STREAMED_XOR_CHUNKS = 1; + } + + // accepted_response_types allows negotiating the content type of the response. + // + // Response types are taken from the list in the FIFO order. If no response type in `accepted_response_types` is + // implemented by server, error is returned. + // For request that do not contain `accepted_response_types` field the SAMPLES response type will be used. + repeated ResponseType accepted_response_types = 2; +} + +// ReadResponse is a response when response_type equals SAMPLES. +message ReadResponse { + // In same order as the request's queries. + repeated QueryResult results = 1; +} + +message Query { + int64 start_timestamp_ms = 1; + int64 end_timestamp_ms = 2; + repeated LabelMatcher matchers = 3; + ReadHints hints = 4; +} + +message QueryResult { + // Samples within a time series must be ordered by time. + repeated TimeSeries timeseries = 1; +} + +// ChunkedReadResponse is a response when response_type equals STREAMED_XOR_CHUNKS. +// We strictly stream full series after series, optionally split by time. This means that a single frame can contain +// partition of the single series, but once a new series is started to be streamed it means that no more chunks will +// be sent for previous one. +message ChunkedReadResponse { + repeated ChunkedSeries chunked_series = 1; + + // query_index represents an index of the query from ReadRequest.queries these chunks relates to. + int64 query_index = 2; +} diff --git a/vendor/github.com/thanos-io/thanos/pkg/store/storepb/prompb/types.pb.go b/vendor/github.com/thanos-io/thanos/pkg/store/storepb/prompb/types.pb.go new file mode 100644 index 0000000000..c9a0775b63 --- /dev/null +++ b/vendor/github.com/thanos-io/thanos/pkg/store/storepb/prompb/types.pb.go @@ -0,0 +1,2272 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: types.proto + +package prompb + +import ( + encoding_binary "encoding/binary" + fmt "fmt" + io "io" + math "math" + math_bits "math/bits" + + _ "github.com/gogo/protobuf/gogoproto" + proto "github.com/gogo/protobuf/proto" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +type LabelMatcher_Type int32 + +const ( + LabelMatcher_EQ LabelMatcher_Type = 0 + LabelMatcher_NEQ LabelMatcher_Type = 1 + LabelMatcher_RE LabelMatcher_Type = 2 + LabelMatcher_NRE LabelMatcher_Type = 3 +) + +var LabelMatcher_Type_name = map[int32]string{ + 0: "EQ", + 1: "NEQ", + 2: "RE", + 3: "NRE", +} + +var LabelMatcher_Type_value = map[string]int32{ + "EQ": 0, + "NEQ": 1, + "RE": 2, + "NRE": 3, +} + +func (x LabelMatcher_Type) String() string { + return proto.EnumName(LabelMatcher_Type_name, int32(x)) +} + +func (LabelMatcher_Type) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_d938547f84707355, []int{4, 0} +} + +// We require this to match chunkenc.Encoding. +type Chunk_Encoding int32 + +const ( + Chunk_UNKNOWN Chunk_Encoding = 0 + Chunk_XOR Chunk_Encoding = 1 +) + +var Chunk_Encoding_name = map[int32]string{ + 0: "UNKNOWN", + 1: "XOR", +} + +var Chunk_Encoding_value = map[string]int32{ + "UNKNOWN": 0, + "XOR": 1, +} + +func (x Chunk_Encoding) String() string { + return proto.EnumName(Chunk_Encoding_name, int32(x)) +} + +func (Chunk_Encoding) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_d938547f84707355, []int{6, 0} +} + +type Sample struct { + Value float64 `protobuf:"fixed64,1,opt,name=value,proto3" json:"value,omitempty"` + Timestamp int64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` +} + +func (m *Sample) Reset() { *m = Sample{} } +func (m *Sample) String() string { return proto.CompactTextString(m) } +func (*Sample) ProtoMessage() {} +func (*Sample) Descriptor() ([]byte, []int) { + return fileDescriptor_d938547f84707355, []int{0} +} +func (m *Sample) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Sample) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Sample.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *Sample) XXX_Merge(src proto.Message) { + xxx_messageInfo_Sample.Merge(m, src) +} +func (m *Sample) XXX_Size() int { + return m.Size() +} +func (m *Sample) XXX_DiscardUnknown() { + xxx_messageInfo_Sample.DiscardUnknown(m) +} + +var xxx_messageInfo_Sample proto.InternalMessageInfo + +func (m *Sample) GetValue() float64 { + if m != nil { + return m.Value + } + return 0 +} + +func (m *Sample) GetTimestamp() int64 { + if m != nil { + return m.Timestamp + } + return 0 +} + +// TimeSeries represents samples and labels for a single time series. +type TimeSeries struct { + Labels []Label `protobuf:"bytes,1,rep,name=labels,proto3" json:"labels"` + Samples []Sample `protobuf:"bytes,2,rep,name=samples,proto3" json:"samples"` +} + +func (m *TimeSeries) Reset() { *m = TimeSeries{} } +func (m *TimeSeries) String() string { return proto.CompactTextString(m) } +func (*TimeSeries) ProtoMessage() {} +func (*TimeSeries) Descriptor() ([]byte, []int) { + return fileDescriptor_d938547f84707355, []int{1} +} +func (m *TimeSeries) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *TimeSeries) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_TimeSeries.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *TimeSeries) XXX_Merge(src proto.Message) { + xxx_messageInfo_TimeSeries.Merge(m, src) +} +func (m *TimeSeries) XXX_Size() int { + return m.Size() +} +func (m *TimeSeries) XXX_DiscardUnknown() { + xxx_messageInfo_TimeSeries.DiscardUnknown(m) +} + +var xxx_messageInfo_TimeSeries proto.InternalMessageInfo + +func (m *TimeSeries) GetLabels() []Label { + if m != nil { + return m.Labels + } + return nil +} + +func (m *TimeSeries) GetSamples() []Sample { + if m != nil { + return m.Samples + } + return nil +} + +type Label struct { + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` +} + +func (m *Label) Reset() { *m = Label{} } +func (m *Label) String() string { return proto.CompactTextString(m) } +func (*Label) ProtoMessage() {} +func (*Label) Descriptor() ([]byte, []int) { + return fileDescriptor_d938547f84707355, []int{2} +} +func (m *Label) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Label) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Label.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *Label) XXX_Merge(src proto.Message) { + xxx_messageInfo_Label.Merge(m, src) +} +func (m *Label) XXX_Size() int { + return m.Size() +} +func (m *Label) XXX_DiscardUnknown() { + xxx_messageInfo_Label.DiscardUnknown(m) +} + +var xxx_messageInfo_Label proto.InternalMessageInfo + +func (m *Label) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *Label) GetValue() string { + if m != nil { + return m.Value + } + return "" +} + +type Labels struct { + Labels []Label `protobuf:"bytes,1,rep,name=labels,proto3" json:"labels"` +} + +func (m *Labels) Reset() { *m = Labels{} } +func (m *Labels) String() string { return proto.CompactTextString(m) } +func (*Labels) ProtoMessage() {} +func (*Labels) Descriptor() ([]byte, []int) { + return fileDescriptor_d938547f84707355, []int{3} +} +func (m *Labels) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Labels) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Labels.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *Labels) XXX_Merge(src proto.Message) { + xxx_messageInfo_Labels.Merge(m, src) +} +func (m *Labels) XXX_Size() int { + return m.Size() +} +func (m *Labels) XXX_DiscardUnknown() { + xxx_messageInfo_Labels.DiscardUnknown(m) +} + +var xxx_messageInfo_Labels proto.InternalMessageInfo + +func (m *Labels) GetLabels() []Label { + if m != nil { + return m.Labels + } + return nil +} + +// Matcher specifies a rule, which can match or set of labels or not. +type LabelMatcher struct { + Type LabelMatcher_Type `protobuf:"varint,1,opt,name=type,proto3,enum=prometheus_copy.LabelMatcher_Type" json:"type,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + Value string `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"` +} + +func (m *LabelMatcher) Reset() { *m = LabelMatcher{} } +func (m *LabelMatcher) String() string { return proto.CompactTextString(m) } +func (*LabelMatcher) ProtoMessage() {} +func (*LabelMatcher) Descriptor() ([]byte, []int) { + return fileDescriptor_d938547f84707355, []int{4} +} +func (m *LabelMatcher) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *LabelMatcher) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_LabelMatcher.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *LabelMatcher) XXX_Merge(src proto.Message) { + xxx_messageInfo_LabelMatcher.Merge(m, src) +} +func (m *LabelMatcher) XXX_Size() int { + return m.Size() +} +func (m *LabelMatcher) XXX_DiscardUnknown() { + xxx_messageInfo_LabelMatcher.DiscardUnknown(m) +} + +var xxx_messageInfo_LabelMatcher proto.InternalMessageInfo + +func (m *LabelMatcher) GetType() LabelMatcher_Type { + if m != nil { + return m.Type + } + return LabelMatcher_EQ +} + +func (m *LabelMatcher) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *LabelMatcher) GetValue() string { + if m != nil { + return m.Value + } + return "" +} + +type ReadHints struct { + StepMs int64 `protobuf:"varint,1,opt,name=step_ms,json=stepMs,proto3" json:"step_ms,omitempty"` + Func string `protobuf:"bytes,2,opt,name=func,proto3" json:"func,omitempty"` + StartMs int64 `protobuf:"varint,3,opt,name=start_ms,json=startMs,proto3" json:"start_ms,omitempty"` + EndMs int64 `protobuf:"varint,4,opt,name=end_ms,json=endMs,proto3" json:"end_ms,omitempty"` + Grouping []string `protobuf:"bytes,5,rep,name=grouping,proto3" json:"grouping,omitempty"` + By bool `protobuf:"varint,6,opt,name=by,proto3" json:"by,omitempty"` + RangeMs int64 `protobuf:"varint,7,opt,name=range_ms,json=rangeMs,proto3" json:"range_ms,omitempty"` +} + +func (m *ReadHints) Reset() { *m = ReadHints{} } +func (m *ReadHints) String() string { return proto.CompactTextString(m) } +func (*ReadHints) ProtoMessage() {} +func (*ReadHints) Descriptor() ([]byte, []int) { + return fileDescriptor_d938547f84707355, []int{5} +} +func (m *ReadHints) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ReadHints) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ReadHints.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *ReadHints) XXX_Merge(src proto.Message) { + xxx_messageInfo_ReadHints.Merge(m, src) +} +func (m *ReadHints) XXX_Size() int { + return m.Size() +} +func (m *ReadHints) XXX_DiscardUnknown() { + xxx_messageInfo_ReadHints.DiscardUnknown(m) +} + +var xxx_messageInfo_ReadHints proto.InternalMessageInfo + +func (m *ReadHints) GetStepMs() int64 { + if m != nil { + return m.StepMs + } + return 0 +} + +func (m *ReadHints) GetFunc() string { + if m != nil { + return m.Func + } + return "" +} + +func (m *ReadHints) GetStartMs() int64 { + if m != nil { + return m.StartMs + } + return 0 +} + +func (m *ReadHints) GetEndMs() int64 { + if m != nil { + return m.EndMs + } + return 0 +} + +func (m *ReadHints) GetGrouping() []string { + if m != nil { + return m.Grouping + } + return nil +} + +func (m *ReadHints) GetBy() bool { + if m != nil { + return m.By + } + return false +} + +func (m *ReadHints) GetRangeMs() int64 { + if m != nil { + return m.RangeMs + } + return 0 +} + +// Chunk represents a TSDB chunk. +// Time range [min, max] is inclusive. +type Chunk struct { + MinTimeMs int64 `protobuf:"varint,1,opt,name=min_time_ms,json=minTimeMs,proto3" json:"min_time_ms,omitempty"` + MaxTimeMs int64 `protobuf:"varint,2,opt,name=max_time_ms,json=maxTimeMs,proto3" json:"max_time_ms,omitempty"` + Type Chunk_Encoding `protobuf:"varint,3,opt,name=type,proto3,enum=prometheus_copy.Chunk_Encoding" json:"type,omitempty"` + Data []byte `protobuf:"bytes,4,opt,name=data,proto3" json:"data,omitempty"` +} + +func (m *Chunk) Reset() { *m = Chunk{} } +func (m *Chunk) String() string { return proto.CompactTextString(m) } +func (*Chunk) ProtoMessage() {} +func (*Chunk) Descriptor() ([]byte, []int) { + return fileDescriptor_d938547f84707355, []int{6} +} +func (m *Chunk) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Chunk) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Chunk.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *Chunk) XXX_Merge(src proto.Message) { + xxx_messageInfo_Chunk.Merge(m, src) +} +func (m *Chunk) XXX_Size() int { + return m.Size() +} +func (m *Chunk) XXX_DiscardUnknown() { + xxx_messageInfo_Chunk.DiscardUnknown(m) +} + +var xxx_messageInfo_Chunk proto.InternalMessageInfo + +func (m *Chunk) GetMinTimeMs() int64 { + if m != nil { + return m.MinTimeMs + } + return 0 +} + +func (m *Chunk) GetMaxTimeMs() int64 { + if m != nil { + return m.MaxTimeMs + } + return 0 +} + +func (m *Chunk) GetType() Chunk_Encoding { + if m != nil { + return m.Type + } + return Chunk_UNKNOWN +} + +func (m *Chunk) GetData() []byte { + if m != nil { + return m.Data + } + return nil +} + +// ChunkedSeries represents single, encoded time series. +type ChunkedSeries struct { + // Labels should be sorted. + Labels []Label `protobuf:"bytes,1,rep,name=labels,proto3" json:"labels"` + // Chunks will be in start time order and may overlap. + Chunks []Chunk `protobuf:"bytes,2,rep,name=chunks,proto3" json:"chunks"` +} + +func (m *ChunkedSeries) Reset() { *m = ChunkedSeries{} } +func (m *ChunkedSeries) String() string { return proto.CompactTextString(m) } +func (*ChunkedSeries) ProtoMessage() {} +func (*ChunkedSeries) Descriptor() ([]byte, []int) { + return fileDescriptor_d938547f84707355, []int{7} +} +func (m *ChunkedSeries) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ChunkedSeries) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ChunkedSeries.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *ChunkedSeries) XXX_Merge(src proto.Message) { + xxx_messageInfo_ChunkedSeries.Merge(m, src) +} +func (m *ChunkedSeries) XXX_Size() int { + return m.Size() +} +func (m *ChunkedSeries) XXX_DiscardUnknown() { + xxx_messageInfo_ChunkedSeries.DiscardUnknown(m) +} + +var xxx_messageInfo_ChunkedSeries proto.InternalMessageInfo + +func (m *ChunkedSeries) GetLabels() []Label { + if m != nil { + return m.Labels + } + return nil +} + +func (m *ChunkedSeries) GetChunks() []Chunk { + if m != nil { + return m.Chunks + } + return nil +} + +func init() { + proto.RegisterEnum("prometheus_copy.LabelMatcher_Type", LabelMatcher_Type_name, LabelMatcher_Type_value) + proto.RegisterEnum("prometheus_copy.Chunk_Encoding", Chunk_Encoding_name, Chunk_Encoding_value) + proto.RegisterType((*Sample)(nil), "prometheus_copy.Sample") + proto.RegisterType((*TimeSeries)(nil), "prometheus_copy.TimeSeries") + proto.RegisterType((*Label)(nil), "prometheus_copy.Label") + proto.RegisterType((*Labels)(nil), "prometheus_copy.Labels") + proto.RegisterType((*LabelMatcher)(nil), "prometheus_copy.LabelMatcher") + proto.RegisterType((*ReadHints)(nil), "prometheus_copy.ReadHints") + proto.RegisterType((*Chunk)(nil), "prometheus_copy.Chunk") + proto.RegisterType((*ChunkedSeries)(nil), "prometheus_copy.ChunkedSeries") +} + +func init() { proto.RegisterFile("types.proto", fileDescriptor_d938547f84707355) } + +var fileDescriptor_d938547f84707355 = []byte{ + // 561 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x53, 0xc1, 0x6e, 0xd3, 0x40, + 0x10, 0xcd, 0xda, 0x89, 0x9d, 0x4c, 0x4a, 0x89, 0x56, 0xa5, 0x35, 0x15, 0x72, 0x2d, 0x9f, 0x7c, + 0x0a, 0xa2, 0xad, 0xe0, 0x82, 0x38, 0x14, 0x45, 0x42, 0xa2, 0x4e, 0xd5, 0x6d, 0x11, 0x88, 0x4b, + 0xb4, 0x89, 0x17, 0xc7, 0x22, 0x5e, 0x5b, 0xde, 0x0d, 0x6a, 0xd4, 0x9f, 0xe0, 0xcc, 0x5f, 0xc0, + 0x57, 0xf4, 0xd8, 0x23, 0x27, 0x84, 0x92, 0x1f, 0x41, 0xbb, 0x76, 0x12, 0x44, 0x73, 0xa2, 0xb7, + 0x99, 0x79, 0x6f, 0xde, 0x3c, 0xef, 0x8c, 0xa1, 0x2d, 0x67, 0x39, 0x13, 0xdd, 0xbc, 0xc8, 0x64, + 0x86, 0x1f, 0xe6, 0x45, 0x96, 0x32, 0x39, 0x66, 0x53, 0x31, 0x18, 0x65, 0xf9, 0x6c, 0x7f, 0x27, + 0xce, 0xe2, 0x4c, 0x63, 0x4f, 0x55, 0x54, 0xd2, 0xfc, 0x97, 0x60, 0x5d, 0xd0, 0x34, 0x9f, 0x30, + 0xbc, 0x03, 0x8d, 0x2f, 0x74, 0x32, 0x65, 0x0e, 0xf2, 0x50, 0x80, 0x48, 0x99, 0xe0, 0x27, 0xd0, + 0x92, 0x49, 0xca, 0x84, 0xa4, 0x69, 0xee, 0x18, 0x1e, 0x0a, 0x4c, 0xb2, 0x2e, 0xf8, 0xd7, 0x00, + 0x97, 0x49, 0xca, 0x2e, 0x58, 0x91, 0x30, 0x81, 0x8f, 0xc1, 0x9a, 0xd0, 0x21, 0x9b, 0x08, 0x07, + 0x79, 0x66, 0xd0, 0x3e, 0xdc, 0xed, 0xfe, 0xe3, 0xa1, 0x7b, 0xaa, 0xe0, 0x93, 0xfa, 0xcd, 0xaf, + 0x83, 0x1a, 0xa9, 0xb8, 0xf8, 0x05, 0xd8, 0x42, 0x3b, 0x10, 0x8e, 0xa1, 0xdb, 0xf6, 0xee, 0xb4, + 0x95, 0x0e, 0xab, 0xbe, 0x25, 0xdb, 0x7f, 0x06, 0x0d, 0xad, 0x87, 0x31, 0xd4, 0x39, 0x4d, 0x4b, + 0xe3, 0x2d, 0xa2, 0xe3, 0xf5, 0xd7, 0x18, 0xba, 0x58, 0x26, 0xfe, 0x2b, 0xb0, 0x4e, 0xcb, 0xa9, + 0xff, 0xe5, 0xd5, 0xff, 0x86, 0x60, 0x4b, 0xd7, 0x43, 0x2a, 0x47, 0x63, 0x56, 0xe0, 0xe7, 0x50, + 0x57, 0x8f, 0xae, 0x47, 0x6f, 0x1f, 0xfa, 0x9b, 0x45, 0x2a, 0x72, 0xf7, 0x72, 0x96, 0x33, 0xa2, + 0xf9, 0x2b, 0xcb, 0xc6, 0x26, 0xcb, 0xe6, 0xdf, 0x96, 0x03, 0xa8, 0xab, 0x3e, 0x6c, 0x81, 0xd1, + 0x3b, 0xef, 0xd4, 0xb0, 0x0d, 0x66, 0xbf, 0x77, 0xde, 0x41, 0xaa, 0x40, 0x7a, 0x1d, 0x43, 0x17, + 0x48, 0xaf, 0x63, 0xfa, 0xdf, 0x11, 0xb4, 0x08, 0xa3, 0xd1, 0x9b, 0x84, 0x4b, 0x81, 0xf7, 0xc0, + 0x16, 0x92, 0xe5, 0x83, 0x54, 0x68, 0x73, 0x26, 0xb1, 0x54, 0x1a, 0x0a, 0x35, 0xfa, 0xd3, 0x94, + 0x8f, 0x96, 0xa3, 0x55, 0x8c, 0x1f, 0x43, 0x53, 0x48, 0x5a, 0x48, 0xc5, 0x36, 0x35, 0xdb, 0xd6, + 0x79, 0x28, 0xf0, 0x23, 0xb0, 0x18, 0x8f, 0x14, 0x50, 0xd7, 0x40, 0x83, 0xf1, 0x28, 0x14, 0x78, + 0x1f, 0x9a, 0x71, 0x91, 0x4d, 0xf3, 0x84, 0xc7, 0x4e, 0xc3, 0x33, 0x83, 0x16, 0x59, 0xe5, 0x78, + 0x1b, 0x8c, 0xe1, 0xcc, 0xb1, 0x3c, 0x14, 0x34, 0x89, 0x31, 0x9c, 0x29, 0xf5, 0x82, 0xf2, 0x98, + 0x29, 0x11, 0xbb, 0x54, 0xd7, 0x79, 0x28, 0xfc, 0x1f, 0x08, 0x1a, 0xaf, 0xc7, 0x53, 0xfe, 0x19, + 0xbb, 0xd0, 0x4e, 0x13, 0x3e, 0x50, 0xb7, 0xb5, 0xf6, 0xdc, 0x4a, 0x13, 0xae, 0x0e, 0x2c, 0x14, + 0x1a, 0xa7, 0x57, 0x2b, 0xbc, 0x3a, 0xc5, 0x94, 0x5e, 0x55, 0xf8, 0x51, 0xb5, 0x09, 0x53, 0x6f, + 0xe2, 0xe0, 0xce, 0x26, 0xf4, 0x94, 0x6e, 0x8f, 0x8f, 0xb2, 0x28, 0xe1, 0xf1, 0x7a, 0x0d, 0x11, + 0x95, 0x54, 0x7f, 0xda, 0x16, 0xd1, 0xb1, 0xef, 0x41, 0x73, 0xc9, 0xc2, 0x6d, 0xb0, 0xdf, 0xf5, + 0xdf, 0xf6, 0xcf, 0xde, 0xf7, 0xcb, 0x97, 0xff, 0x70, 0x46, 0x3a, 0xc8, 0xbf, 0x86, 0x07, 0x5a, + 0x8d, 0x45, 0xf7, 0x3a, 0xfc, 0x63, 0xb0, 0x46, 0x4a, 0x66, 0x79, 0xf7, 0xbb, 0x9b, 0x3d, 0x2f, + 0xbb, 0x4a, 0xee, 0x89, 0x77, 0x33, 0x77, 0xd1, 0xed, 0xdc, 0x45, 0xbf, 0xe7, 0x2e, 0xfa, 0xba, + 0x70, 0x6b, 0xb7, 0x0b, 0xb7, 0xf6, 0x73, 0xe1, 0xd6, 0x3e, 0x5a, 0xaa, 0x3d, 0x1f, 0x0e, 0x2d, + 0xfd, 0x67, 0x1f, 0xfd, 0x09, 0x00, 0x00, 0xff, 0xff, 0x73, 0xda, 0x4a, 0x37, 0x0f, 0x04, 0x00, + 0x00, +} + +func (m *Sample) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Sample) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Sample) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Timestamp != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.Timestamp)) + i-- + dAtA[i] = 0x10 + } + if m.Value != 0 { + i -= 8 + encoding_binary.LittleEndian.PutUint64(dAtA[i:], uint64(math.Float64bits(float64(m.Value)))) + i-- + dAtA[i] = 0x9 + } + return len(dAtA) - i, nil +} + +func (m *TimeSeries) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *TimeSeries) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TimeSeries) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Samples) > 0 { + for iNdEx := len(m.Samples) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Samples[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + if len(m.Labels) > 0 { + for iNdEx := len(m.Labels) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Labels[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *Label) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Label) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Label) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Value) > 0 { + i -= len(m.Value) + copy(dAtA[i:], m.Value) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Value))) + i-- + dAtA[i] = 0x12 + } + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *Labels) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Labels) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Labels) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Labels) > 0 { + for iNdEx := len(m.Labels) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Labels[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *LabelMatcher) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *LabelMatcher) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *LabelMatcher) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Value) > 0 { + i -= len(m.Value) + copy(dAtA[i:], m.Value) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Value))) + i-- + dAtA[i] = 0x1a + } + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0x12 + } + if m.Type != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.Type)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *ReadHints) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ReadHints) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ReadHints) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.RangeMs != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.RangeMs)) + i-- + dAtA[i] = 0x38 + } + if m.By { + i-- + if m.By { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x30 + } + if len(m.Grouping) > 0 { + for iNdEx := len(m.Grouping) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Grouping[iNdEx]) + copy(dAtA[i:], m.Grouping[iNdEx]) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Grouping[iNdEx]))) + i-- + dAtA[i] = 0x2a + } + } + if m.EndMs != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.EndMs)) + i-- + dAtA[i] = 0x20 + } + if m.StartMs != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.StartMs)) + i-- + dAtA[i] = 0x18 + } + if len(m.Func) > 0 { + i -= len(m.Func) + copy(dAtA[i:], m.Func) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Func))) + i-- + dAtA[i] = 0x12 + } + if m.StepMs != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.StepMs)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *Chunk) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Chunk) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Chunk) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Data) > 0 { + i -= len(m.Data) + copy(dAtA[i:], m.Data) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Data))) + i-- + dAtA[i] = 0x22 + } + if m.Type != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.Type)) + i-- + dAtA[i] = 0x18 + } + if m.MaxTimeMs != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.MaxTimeMs)) + i-- + dAtA[i] = 0x10 + } + if m.MinTimeMs != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.MinTimeMs)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *ChunkedSeries) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ChunkedSeries) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ChunkedSeries) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Chunks) > 0 { + for iNdEx := len(m.Chunks) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Chunks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + if len(m.Labels) > 0 { + for iNdEx := len(m.Labels) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Labels[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func encodeVarintTypes(dAtA []byte, offset int, v uint64) int { + offset -= sovTypes(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *Sample) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Value != 0 { + n += 9 + } + if m.Timestamp != 0 { + n += 1 + sovTypes(uint64(m.Timestamp)) + } + return n +} + +func (m *TimeSeries) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Labels) > 0 { + for _, e := range m.Labels { + l = e.Size() + n += 1 + l + sovTypes(uint64(l)) + } + } + if len(m.Samples) > 0 { + for _, e := range m.Samples { + l = e.Size() + n += 1 + l + sovTypes(uint64(l)) + } + } + return n +} + +func (m *Label) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Name) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + l = len(m.Value) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + return n +} + +func (m *Labels) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Labels) > 0 { + for _, e := range m.Labels { + l = e.Size() + n += 1 + l + sovTypes(uint64(l)) + } + } + return n +} + +func (m *LabelMatcher) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Type != 0 { + n += 1 + sovTypes(uint64(m.Type)) + } + l = len(m.Name) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + l = len(m.Value) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + return n +} + +func (m *ReadHints) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.StepMs != 0 { + n += 1 + sovTypes(uint64(m.StepMs)) + } + l = len(m.Func) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + if m.StartMs != 0 { + n += 1 + sovTypes(uint64(m.StartMs)) + } + if m.EndMs != 0 { + n += 1 + sovTypes(uint64(m.EndMs)) + } + if len(m.Grouping) > 0 { + for _, s := range m.Grouping { + l = len(s) + n += 1 + l + sovTypes(uint64(l)) + } + } + if m.By { + n += 2 + } + if m.RangeMs != 0 { + n += 1 + sovTypes(uint64(m.RangeMs)) + } + return n +} + +func (m *Chunk) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.MinTimeMs != 0 { + n += 1 + sovTypes(uint64(m.MinTimeMs)) + } + if m.MaxTimeMs != 0 { + n += 1 + sovTypes(uint64(m.MaxTimeMs)) + } + if m.Type != 0 { + n += 1 + sovTypes(uint64(m.Type)) + } + l = len(m.Data) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + return n +} + +func (m *ChunkedSeries) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Labels) > 0 { + for _, e := range m.Labels { + l = e.Size() + n += 1 + l + sovTypes(uint64(l)) + } + } + if len(m.Chunks) > 0 { + for _, e := range m.Chunks { + l = e.Size() + n += 1 + l + sovTypes(uint64(l)) + } + } + return n +} + +func sovTypes(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozTypes(x uint64) (n int) { + return sovTypes(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *Sample) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Sample: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Sample: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 1 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + } + var v uint64 + if (iNdEx + 8) > l { + return io.ErrUnexpectedEOF + } + v = uint64(encoding_binary.LittleEndian.Uint64(dAtA[iNdEx:])) + iNdEx += 8 + m.Value = float64(math.Float64frombits(v)) + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Timestamp", wireType) + } + m.Timestamp = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Timestamp |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *TimeSeries) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: TimeSeries: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TimeSeries: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Labels", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Labels = append(m.Labels, Label{}) + if err := m.Labels[len(m.Labels)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Samples", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Samples = append(m.Samples, Sample{}) + if err := m.Samples[len(m.Samples)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Label) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Label: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Label: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Value = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Labels) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Labels: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Labels: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Labels", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Labels = append(m.Labels, Label{}) + if err := m.Labels[len(m.Labels)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *LabelMatcher) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: LabelMatcher: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: LabelMatcher: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + } + m.Type = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Type |= LabelMatcher_Type(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Value = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ReadHints) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ReadHints: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ReadHints: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field StepMs", wireType) + } + m.StepMs = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.StepMs |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Func", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Func = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field StartMs", wireType) + } + m.StartMs = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.StartMs |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field EndMs", wireType) + } + m.EndMs = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.EndMs |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Grouping", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Grouping = append(m.Grouping, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field By", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.By = bool(v != 0) + case 7: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field RangeMs", wireType) + } + m.RangeMs = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.RangeMs |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Chunk) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Chunk: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Chunk: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field MinTimeMs", wireType) + } + m.MinTimeMs = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.MinTimeMs |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field MaxTimeMs", wireType) + } + m.MaxTimeMs = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.MaxTimeMs |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + } + m.Type = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Type |= Chunk_Encoding(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Data = append(m.Data[:0], dAtA[iNdEx:postIndex]...) + if m.Data == nil { + m.Data = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ChunkedSeries) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ChunkedSeries: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ChunkedSeries: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Labels", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Labels = append(m.Labels, Label{}) + if err := m.Labels[len(m.Labels)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Chunks", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Chunks = append(m.Chunks, Chunk{}) + if err := m.Chunks[len(m.Chunks)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipTypes(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowTypes + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowTypes + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowTypes + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthTypes + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupTypes + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthTypes + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthTypes = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowTypes = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupTypes = fmt.Errorf("proto: unexpected end of group") +) diff --git a/vendor/github.com/thanos-io/thanos/pkg/store/storepb/prompb/types.proto b/vendor/github.com/thanos-io/thanos/pkg/store/storepb/prompb/types.proto new file mode 100644 index 0000000000..698a19a48a --- /dev/null +++ b/vendor/github.com/thanos-io/thanos/pkg/store/storepb/prompb/types.proto @@ -0,0 +1,94 @@ +// Copyright (c) The Thanos Authors. +// Licensed under the Apache License 2.0. + +// Copyright 2017 Prometheus Team +// 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. + +syntax = "proto3"; +package prometheus_copy; + +option go_package = "prompb"; + +import "gogoproto/gogo.proto"; + +// Do not generate XXX fields to reduce memory footprint and opening a door +// for zero-copy casts to/from prometheus data types. +option (gogoproto.goproto_unkeyed_all) = false; +option (gogoproto.goproto_unrecognized_all) = false; +option (gogoproto.goproto_sizecache_all) = false; + +message Sample { + double value = 1; + int64 timestamp = 2; +} + +// TimeSeries represents samples and labels for a single time series. +message TimeSeries { + repeated Label labels = 1 [(gogoproto.nullable) = false]; + repeated Sample samples = 2 [(gogoproto.nullable) = false]; +} + +message Label { + string name = 1; + string value = 2; +} + +message Labels { + repeated Label labels = 1 [(gogoproto.nullable) = false]; +} + +// Matcher specifies a rule, which can match or set of labels or not. +message LabelMatcher { + enum Type { + EQ = 0; + NEQ = 1; + RE = 2; + NRE = 3; + } + Type type = 1; + string name = 2; + string value = 3; +} + +message ReadHints { + int64 step_ms = 1; // Query step size in milliseconds. + string func = 2; // String representation of surrounding function or aggregation. + int64 start_ms = 3; // Start time in milliseconds. + int64 end_ms = 4; // End time in milliseconds. + repeated string grouping = 5; // List of label names used in aggregation. + bool by = 6; // Indicate whether it is without or by. + int64 range_ms = 7; // Range vector selector range in milliseconds. +} + +// Chunk represents a TSDB chunk. +// Time range [min, max] is inclusive. +message Chunk { + int64 min_time_ms = 1; + int64 max_time_ms = 2; + + // We require this to match chunkenc.Encoding. + enum Encoding { + UNKNOWN = 0; + XOR = 1; + } + Encoding type = 3; + bytes data = 4; +} + +// ChunkedSeries represents single, encoded time series. +message ChunkedSeries { + // Labels should be sorted. + repeated Label labels = 1 [(gogoproto.nullable) = false]; + // Chunks will be in start time order and may overlap. + repeated Chunk chunks = 2 [(gogoproto.nullable) = false]; +} diff --git a/vendor/github.com/thanos-io/thanos/pkg/store/storepb/rpc.pb.go b/vendor/github.com/thanos-io/thanos/pkg/store/storepb/rpc.pb.go index 63f1ab4974..dc6d835753 100644 --- a/vendor/github.com/thanos-io/thanos/pkg/store/storepb/rpc.pb.go +++ b/vendor/github.com/thanos-io/thanos/pkg/store/storepb/rpc.pb.go @@ -12,7 +12,7 @@ import ( _ "github.com/gogo/protobuf/gogoproto" proto "github.com/gogo/protobuf/proto" - prompb "github.com/prometheus/prometheus/prompb" + prompb "github.com/thanos-io/thanos/pkg/store/storepb/prompb" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" @@ -635,66 +635,65 @@ func init() { func init() { proto.RegisterFile("rpc.proto", fileDescriptor_77a6da22d6a3feb1) } var fileDescriptor_77a6da22d6a3feb1 = []byte{ - // 934 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x56, 0xcb, 0x6e, 0x23, 0x45, - 0x14, 0x75, 0xbb, 0xfd, 0xbc, 0x4e, 0x4c, 0x4f, 0xc5, 0xc9, 0x74, 0x8c, 0xe4, 0x58, 0x2d, 0x21, - 0x59, 0x01, 0x39, 0xe0, 0x11, 0x20, 0xd0, 0x6c, 0x6c, 0x8f, 0x47, 0x63, 0x31, 0x71, 0xa0, 0x6c, - 0x8f, 0x79, 0x2c, 0x4c, 0xdb, 0x29, 0xda, 0xad, 0x71, 0x3f, 0xe8, 0x2a, 0x93, 0x64, 0xc3, 0x82, - 0x2f, 0x60, 0xcb, 0x3f, 0xf0, 0x17, 0x6c, 0xb2, 0x9c, 0x25, 0x6c, 0x10, 0x24, 0x3f, 0x82, 0xaa, - 0xba, 0xda, 0xee, 0x0e, 0x49, 0xa4, 0x51, 0x76, 0x75, 0xcf, 0xb9, 0xbe, 0x8f, 0x53, 0xf7, 0x76, - 0x19, 0x8a, 0x81, 0x3f, 0x6f, 0xfa, 0x81, 0xc7, 0x3c, 0x94, 0x63, 0x0b, 0xd3, 0xf5, 0x68, 0xb5, - 0xc4, 0x2e, 0x7c, 0x42, 0x43, 0xb0, 0x5a, 0xb1, 0x3c, 0xcb, 0x13, 0xc7, 0x23, 0x7e, 0x92, 0xe8, - 0x13, 0xcb, 0x66, 0x8b, 0xd5, 0xac, 0x39, 0xf7, 0x9c, 0x23, 0x3f, 0xf0, 0x1c, 0xc2, 0x16, 0x64, - 0x45, 0x6f, 0x1e, 0xfd, 0xd9, 0x51, 0x2c, 0x94, 0xf1, 0x0e, 0x6c, 0x4f, 0x02, 0x9b, 0x11, 0x4c, - 0xa8, 0xef, 0xb9, 0x94, 0x18, 0x3f, 0xc3, 0x96, 0x04, 0x7e, 0x5c, 0x11, 0xca, 0xd0, 0x53, 0x00, - 0x66, 0x3b, 0x84, 0x92, 0xc0, 0x26, 0x54, 0x57, 0xea, 0x6a, 0xa3, 0xd4, 0xda, 0x6b, 0x6e, 0x82, - 0x36, 0x47, 0xb6, 0x43, 0x86, 0x82, 0xed, 0x64, 0x2e, 0xff, 0x3e, 0x48, 0xe1, 0x98, 0x3f, 0xda, - 0x83, 0x1c, 0x23, 0xae, 0xe9, 0x32, 0x3d, 0x5d, 0x57, 0x1a, 0x45, 0x2c, 0x2d, 0xa4, 0x43, 0x3e, - 0x20, 0xfe, 0xd2, 0x9e, 0x9b, 0xba, 0x5a, 0x57, 0x1a, 0x2a, 0x8e, 0x4c, 0x63, 0x1b, 0x4a, 0x7d, - 0xf7, 0x07, 0x4f, 0xa6, 0x37, 0xfe, 0x52, 0x60, 0x2b, 0xb4, 0xc3, 0xfa, 0xd0, 0xfb, 0x90, 0x5b, - 0x9a, 0x33, 0xb2, 0x8c, 0x6a, 0xd9, 0x6e, 0x86, 0x0a, 0x35, 0x5f, 0x72, 0x54, 0x96, 0x20, 0x5d, - 0xd0, 0x3e, 0x14, 0x1c, 0xdb, 0x9d, 0xf2, 0x82, 0x44, 0x01, 0x2a, 0xce, 0x3b, 0xb6, 0xcb, 0x2b, - 0x16, 0x94, 0x79, 0x1e, 0x52, 0xb2, 0x04, 0xc7, 0x3c, 0x17, 0xd4, 0x11, 0x14, 0x29, 0xf3, 0x02, - 0x32, 0xba, 0xf0, 0x89, 0x9e, 0xa9, 0x2b, 0x8d, 0x72, 0xeb, 0x51, 0x94, 0x65, 0x18, 0x11, 0x78, - 0xe3, 0x83, 0x3e, 0x06, 0x10, 0x09, 0xa7, 0x94, 0x30, 0xaa, 0x67, 0x45, 0x5d, 0x5a, 0xa2, 0xae, - 0x21, 0x61, 0xb2, 0xb4, 0xe2, 0x52, 0xda, 0xd4, 0xf8, 0x14, 0x0a, 0x11, 0xf9, 0x56, 0x6d, 0x19, - 0xbf, 0xa9, 0xb0, 0x1d, 0x4a, 0x1e, 0xdd, 0x52, 0xbc, 0x51, 0xe5, 0xee, 0x46, 0xd3, 0xc9, 0x46, - 0x3f, 0xe1, 0x14, 0x9b, 0x2f, 0x48, 0x40, 0x75, 0x55, 0xa4, 0xad, 0x24, 0xd2, 0x1e, 0x87, 0xa4, - 0xcc, 0xbe, 0xf6, 0x45, 0x2d, 0xd8, 0xe5, 0x21, 0x03, 0x42, 0xbd, 0xe5, 0x8a, 0xd9, 0x9e, 0x3b, - 0x3d, 0xb3, 0xdd, 0x53, 0xef, 0x4c, 0x88, 0xa5, 0xe2, 0x1d, 0xc7, 0x3c, 0xc7, 0x6b, 0x6e, 0x22, - 0x28, 0xf4, 0x01, 0x80, 0x69, 0x59, 0x01, 0xb1, 0x4c, 0x46, 0x42, 0x8d, 0xca, 0xad, 0xad, 0x28, - 0x5b, 0xdb, 0xb2, 0x02, 0x1c, 0xe3, 0xd1, 0xe7, 0xb0, 0xef, 0x9b, 0x01, 0xb3, 0xcd, 0x25, 0xcf, - 0x22, 0x6e, 0x7e, 0x7a, 0x6a, 0x53, 0x73, 0xb6, 0x24, 0xa7, 0x7a, 0xae, 0xae, 0x34, 0x0a, 0xf8, - 0xb1, 0x74, 0x88, 0x26, 0xe3, 0x99, 0xa4, 0xd1, 0x77, 0xb7, 0xfc, 0x96, 0xb2, 0xc0, 0x64, 0xc4, - 0xba, 0xd0, 0xf3, 0xe2, 0x3a, 0x0f, 0xa2, 0xc4, 0x5f, 0x26, 0x63, 0x0c, 0xa5, 0xdb, 0xff, 0x82, - 0x47, 0x04, 0x3a, 0x80, 0x12, 0x7d, 0x6d, 0xfb, 0xd3, 0xf9, 0x62, 0xe5, 0xbe, 0xa6, 0x7a, 0x41, - 0x94, 0x02, 0x1c, 0xea, 0x0a, 0xc4, 0xf8, 0x1e, 0xca, 0xd1, 0xd5, 0xc8, 0x89, 0x6d, 0x40, 0x6e, - 0xbd, 0x3d, 0x4a, 0xa3, 0xd4, 0x2a, 0xaf, 0x67, 0x49, 0xa0, 0x2f, 0x52, 0x58, 0xf2, 0xa8, 0x0a, - 0xf9, 0x33, 0x33, 0x70, 0x6d, 0xd7, 0x0a, 0xd7, 0xe5, 0x45, 0x0a, 0x47, 0x40, 0xa7, 0x00, 0xb9, - 0x80, 0xd0, 0xd5, 0x92, 0x19, 0xbf, 0x2b, 0xf0, 0x48, 0x5c, 0xcf, 0xc0, 0x74, 0x36, 0x13, 0x70, - 0xaf, 0x62, 0xca, 0x03, 0x14, 0x4b, 0x3f, 0x4c, 0x31, 0xe3, 0x39, 0xa0, 0x78, 0xb5, 0x52, 0x94, - 0x0a, 0x64, 0x5d, 0x0e, 0x88, 0x71, 0x2f, 0xe2, 0xd0, 0x40, 0x55, 0x28, 0xc8, 0x7e, 0xa9, 0x9e, - 0x16, 0xc4, 0xda, 0x36, 0xfe, 0x50, 0x64, 0xa0, 0x57, 0xe6, 0x72, 0xb5, 0xe9, 0xbb, 0x02, 0x59, - 0xb1, 0x15, 0xa2, 0xc7, 0x22, 0x0e, 0x8d, 0xfb, 0xd5, 0x48, 0x3f, 0x40, 0x0d, 0xf5, 0x81, 0x6a, - 0xf4, 0x61, 0x27, 0xd1, 0x84, 0x94, 0x63, 0x0f, 0x72, 0x3f, 0x09, 0x44, 0xea, 0x21, 0xad, 0xfb, - 0x04, 0x39, 0xc4, 0x50, 0x5c, 0x7f, 0x8d, 0x50, 0x09, 0xf2, 0xe3, 0xc1, 0x17, 0x83, 0x93, 0xc9, - 0x40, 0x4b, 0xa1, 0x22, 0x64, 0xbf, 0x1a, 0xf7, 0xf0, 0x37, 0x9a, 0x82, 0x0a, 0x90, 0xc1, 0xe3, - 0x97, 0x3d, 0x2d, 0xcd, 0x3d, 0x86, 0xfd, 0x67, 0xbd, 0x6e, 0x1b, 0x6b, 0x2a, 0xf7, 0x18, 0x8e, - 0x4e, 0x70, 0x4f, 0xcb, 0x70, 0x1c, 0xf7, 0xba, 0xbd, 0xfe, 0xab, 0x9e, 0x96, 0x3d, 0x6c, 0xc2, - 0xe3, 0x3b, 0x5a, 0xe2, 0x91, 0x26, 0x6d, 0x2c, 0xc3, 0xb7, 0x3b, 0x27, 0x78, 0xa4, 0x29, 0x87, - 0x1d, 0xc8, 0xf0, 0xdd, 0x45, 0x79, 0x50, 0x71, 0x7b, 0x12, 0x72, 0xdd, 0x93, 0xf1, 0x60, 0xa4, - 0x29, 0x1c, 0x1b, 0x8e, 0x8f, 0xb5, 0x34, 0x3f, 0x1c, 0xf7, 0x07, 0x9a, 0x2a, 0x0e, 0xed, 0xaf, - 0xc3, 0x9c, 0xc2, 0xab, 0x87, 0xb5, 0x6c, 0xeb, 0x97, 0x34, 0x64, 0x45, 0x23, 0xe8, 0x23, 0xc8, - 0xf0, 0x6f, 0x3d, 0xda, 0x89, 0xe4, 0x8d, 0xbd, 0x04, 0xd5, 0x4a, 0x12, 0x94, 0xc2, 0x7d, 0x06, - 0xb9, 0x70, 0x8d, 0xd0, 0x6e, 0x72, 0xad, 0xa2, 0x9f, 0xed, 0xdd, 0x84, 0xc3, 0x1f, 0x7e, 0xa8, - 0xa0, 0x2e, 0xc0, 0x66, 0x30, 0xd1, 0x7e, 0xe2, 0xcb, 0x17, 0x5f, 0xad, 0x6a, 0xf5, 0x36, 0x4a, - 0xe6, 0x7f, 0x0e, 0xa5, 0xd8, 0x7d, 0xa2, 0xa4, 0x6b, 0x62, 0x52, 0xab, 0xef, 0xde, 0xca, 0x85, - 0x71, 0x5a, 0x03, 0x28, 0x8b, 0x67, 0x97, 0x8f, 0x60, 0x28, 0xc6, 0x53, 0x28, 0x61, 0xe2, 0x78, - 0x8c, 0x08, 0x1c, 0xad, 0xdb, 0x8f, 0xbf, 0xce, 0xd5, 0xdd, 0x1b, 0xa8, 0x7c, 0xc4, 0x53, 0x9d, - 0xf7, 0x2e, 0xff, 0xad, 0xa5, 0x2e, 0xaf, 0x6a, 0xca, 0x9b, 0xab, 0x9a, 0xf2, 0xcf, 0x55, 0x4d, - 0xf9, 0xf5, 0xba, 0x96, 0x7a, 0x73, 0x5d, 0x4b, 0xfd, 0x79, 0x5d, 0x4b, 0x7d, 0x9b, 0x17, 0x6f, - 0x97, 0x3f, 0x9b, 0xe5, 0xc4, 0xbf, 0x80, 0x27, 0xff, 0x05, 0x00, 0x00, 0xff, 0xff, 0x67, 0x56, - 0x73, 0x8e, 0x72, 0x08, 0x00, 0x00, + // 927 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x56, 0xcd, 0x6e, 0x23, 0x45, + 0x10, 0x76, 0x7b, 0xfc, 0x5b, 0xde, 0x98, 0xd9, 0x8e, 0x93, 0x9d, 0x78, 0x25, 0xc7, 0x1a, 0x09, + 0xc9, 0x0a, 0xc8, 0x01, 0x23, 0x40, 0x20, 0x2e, 0xb6, 0xd7, 0xab, 0xb5, 0xd8, 0x38, 0xd0, 0xb6, + 0xd7, 0xfc, 0x1c, 0xcc, 0xd8, 0x69, 0x9c, 0xd1, 0xce, 0x1f, 0xd3, 0x6d, 0x92, 0x5c, 0xe1, 0x05, + 0xb8, 0xf2, 0x0e, 0xbc, 0x05, 0x97, 0x1c, 0xf7, 0x08, 0x17, 0x04, 0xc9, 0x8b, 0xa0, 0xee, 0xe9, + 0x71, 0x66, 0x96, 0x6c, 0x24, 0x94, 0x5b, 0xd7, 0xf7, 0x55, 0x77, 0x55, 0x7d, 0x5d, 0x35, 0x3d, + 0x50, 0x0e, 0x83, 0x65, 0x3b, 0x08, 0x7d, 0xee, 0xe3, 0x02, 0x3f, 0xb5, 0x3c, 0x9f, 0xd5, 0x2b, + 0xfc, 0x22, 0xa0, 0x2c, 0x02, 0xeb, 0xb5, 0x95, 0xbf, 0xf2, 0xe5, 0xf2, 0x50, 0xac, 0x14, 0x8a, + 0x83, 0xd0, 0x77, 0x83, 0xc5, 0x61, 0xc2, 0xd3, 0x7c, 0x0b, 0xb6, 0x66, 0xa1, 0xcd, 0x29, 0xa1, + 0x2c, 0xf0, 0x3d, 0x46, 0xcd, 0x9f, 0x11, 0x3c, 0x50, 0xc8, 0x0f, 0x6b, 0xca, 0x38, 0xee, 0x02, + 0x70, 0xdb, 0xa5, 0x8c, 0x86, 0x36, 0x65, 0x06, 0x6a, 0x6a, 0xad, 0x4a, 0xe7, 0xb1, 0xd8, 0xed, + 0x52, 0x7e, 0x4a, 0xd7, 0x6c, 0xbe, 0xf4, 0x83, 0x8b, 0xf6, 0xc4, 0x76, 0xe9, 0x58, 0xba, 0xf4, + 0x72, 0x97, 0x7f, 0xed, 0x67, 0x48, 0x62, 0x13, 0xde, 0x85, 0x02, 0xa7, 0x9e, 0xe5, 0x71, 0x23, + 0xdb, 0x44, 0xad, 0x32, 0x51, 0x16, 0x36, 0xa0, 0x18, 0xd2, 0xc0, 0xb1, 0x97, 0x96, 0xa1, 0x35, + 0x51, 0x4b, 0x23, 0xb1, 0x69, 0x6e, 0x41, 0x65, 0xe8, 0x7d, 0xef, 0xab, 0x1c, 0xcc, 0x3f, 0x11, + 0x3c, 0x88, 0xec, 0x28, 0x4b, 0xfc, 0x0e, 0x14, 0x1c, 0x6b, 0x41, 0x9d, 0x38, 0xa1, 0xad, 0x76, + 0x24, 0x43, 0xfb, 0xb9, 0x40, 0x55, 0x0a, 0xca, 0x05, 0xef, 0x41, 0xc9, 0xb5, 0xbd, 0xb9, 0x48, + 0x48, 0x26, 0xa0, 0x91, 0xa2, 0x6b, 0x7b, 0x22, 0x63, 0x49, 0x59, 0xe7, 0x11, 0xa5, 0x52, 0x70, + 0xad, 0x73, 0x49, 0x1d, 0x42, 0x99, 0x71, 0x3f, 0xa4, 0x93, 0x8b, 0x80, 0x1a, 0xb9, 0x26, 0x6a, + 0x55, 0x3b, 0x0f, 0xe3, 0x28, 0xe3, 0x98, 0x20, 0x37, 0x3e, 0xf8, 0x43, 0x00, 0x19, 0x70, 0xce, + 0x28, 0x67, 0x46, 0x5e, 0xe6, 0xa5, 0xa7, 0xf2, 0x1a, 0x53, 0xae, 0x52, 0x2b, 0x3b, 0xca, 0x66, + 0xe6, 0xc7, 0x50, 0x8a, 0xc9, 0xff, 0x55, 0x96, 0xf9, 0xab, 0x06, 0x5b, 0x91, 0xe4, 0xf1, 0x55, + 0x25, 0x0b, 0x45, 0x6f, 0x2e, 0x34, 0x9b, 0x2e, 0xf4, 0x23, 0x41, 0xf1, 0xe5, 0x29, 0x0d, 0x99, + 0xa1, 0xc9, 0xb0, 0xb5, 0x54, 0xd8, 0xa3, 0x88, 0x54, 0xd1, 0x37, 0xbe, 0xb8, 0x03, 0x3b, 0xe2, + 0xc8, 0x90, 0x32, 0xdf, 0x59, 0x73, 0xdb, 0xf7, 0xe6, 0x67, 0xb6, 0x77, 0xe2, 0x9f, 0x49, 0xb1, + 0x34, 0xb2, 0xed, 0x5a, 0xe7, 0x64, 0xc3, 0xcd, 0x24, 0x85, 0xdf, 0x05, 0xb0, 0x56, 0xab, 0x90, + 0xae, 0x2c, 0x4e, 0x23, 0x8d, 0xaa, 0x9d, 0x07, 0x71, 0xb4, 0xee, 0x6a, 0x15, 0x92, 0x04, 0x8f, + 0x3f, 0x85, 0xbd, 0xc0, 0x0a, 0xb9, 0x6d, 0x39, 0x22, 0x8a, 0xbc, 0xf9, 0xf9, 0x89, 0xcd, 0xac, + 0x85, 0x43, 0x4f, 0x8c, 0x42, 0x13, 0xb5, 0x4a, 0xe4, 0x91, 0x72, 0x88, 0x3b, 0xe3, 0x89, 0xa2, + 0xf1, 0xb7, 0xb7, 0xec, 0x65, 0x3c, 0xb4, 0x38, 0x5d, 0x5d, 0x18, 0x45, 0x79, 0x9d, 0xfb, 0x71, + 0xe0, 0x2f, 0xd2, 0x67, 0x8c, 0x95, 0xdb, 0x7f, 0x0e, 0x8f, 0x09, 0xbc, 0x0f, 0x15, 0xf6, 0xd2, + 0x0e, 0xe6, 0xcb, 0xd3, 0xb5, 0xf7, 0x92, 0x19, 0x25, 0x99, 0x0a, 0x08, 0xa8, 0x2f, 0x11, 0xf3, + 0x3b, 0xa8, 0xc6, 0x57, 0xa3, 0x3a, 0xb6, 0x05, 0x85, 0xcd, 0x08, 0xa1, 0x56, 0xa5, 0x53, 0xdd, + 0xf4, 0x92, 0x44, 0x9f, 0x65, 0x88, 0xe2, 0x71, 0x1d, 0x8a, 0x67, 0x56, 0xe8, 0xd9, 0xde, 0x2a, + 0x1a, 0x97, 0x67, 0x19, 0x12, 0x03, 0xbd, 0x12, 0x14, 0x42, 0xca, 0xd6, 0x0e, 0x37, 0x7f, 0x43, + 0xf0, 0x50, 0x5e, 0xcf, 0xc8, 0x72, 0x6f, 0x3a, 0xe0, 0x4e, 0xc5, 0xd0, 0x3d, 0x14, 0xcb, 0xde, + 0x4f, 0x31, 0xf3, 0x29, 0xe0, 0x64, 0xb6, 0x4a, 0x94, 0x1a, 0xe4, 0x3d, 0x01, 0xc8, 0x76, 0x2f, + 0x93, 0xc8, 0xc0, 0x75, 0x28, 0xa9, 0x7a, 0x99, 0x91, 0x95, 0xc4, 0xc6, 0x36, 0x7f, 0x47, 0xea, + 0xa0, 0x17, 0x96, 0xb3, 0xbe, 0xa9, 0xbb, 0x06, 0x79, 0x39, 0x15, 0xb2, 0xc6, 0x32, 0x89, 0x8c, + 0xbb, 0xd5, 0xc8, 0xde, 0x43, 0x0d, 0xed, 0x9e, 0x6a, 0x0c, 0x61, 0x3b, 0x55, 0x84, 0x92, 0x63, + 0x17, 0x0a, 0x3f, 0x4a, 0x44, 0xe9, 0xa1, 0xac, 0xbb, 0x04, 0x39, 0x20, 0x50, 0xde, 0x7c, 0x8d, + 0x70, 0x05, 0x8a, 0xd3, 0xd1, 0xe7, 0xa3, 0xe3, 0xd9, 0x48, 0xcf, 0xe0, 0x32, 0xe4, 0xbf, 0x9c, + 0x0e, 0xc8, 0xd7, 0x3a, 0xc2, 0x25, 0xc8, 0x91, 0xe9, 0xf3, 0x81, 0x9e, 0x15, 0x1e, 0xe3, 0xe1, + 0x93, 0x41, 0xbf, 0x4b, 0x74, 0x4d, 0x78, 0x8c, 0x27, 0xc7, 0x64, 0xa0, 0xe7, 0x04, 0x4e, 0x06, + 0xfd, 0xc1, 0xf0, 0xc5, 0x40, 0xcf, 0x1f, 0xb4, 0xe1, 0xd1, 0x1b, 0x4a, 0x12, 0x27, 0xcd, 0xba, + 0x44, 0x1d, 0xdf, 0xed, 0x1d, 0x93, 0x89, 0x8e, 0x0e, 0x7a, 0x90, 0x13, 0xb3, 0x8b, 0x8b, 0xa0, + 0x91, 0xee, 0x2c, 0xe2, 0xfa, 0xc7, 0xd3, 0xd1, 0x44, 0x47, 0x02, 0x1b, 0x4f, 0x8f, 0xf4, 0xac, + 0x58, 0x1c, 0x0d, 0x47, 0xba, 0x26, 0x17, 0xdd, 0xaf, 0xa2, 0x98, 0xd2, 0x6b, 0x40, 0xf4, 0x7c, + 0xe7, 0xa7, 0x2c, 0xe4, 0x65, 0x21, 0xf8, 0x7d, 0xc8, 0x89, 0x6f, 0x3d, 0xde, 0x8e, 0xe5, 0x4d, + 0xbc, 0x04, 0xf5, 0x5a, 0x1a, 0x54, 0xc2, 0x7d, 0x02, 0x85, 0x68, 0x8c, 0xf0, 0x4e, 0x7a, 0xac, + 0xe2, 0x6d, 0xbb, 0xaf, 0xc3, 0xd1, 0xc6, 0xf7, 0x10, 0xee, 0x03, 0xdc, 0x34, 0x26, 0xde, 0x4b, + 0x7d, 0xf9, 0x92, 0xa3, 0x55, 0xaf, 0xdf, 0x46, 0xa9, 0xf8, 0x4f, 0xa1, 0x92, 0xb8, 0x4f, 0x9c, + 0x76, 0x4d, 0x75, 0x6a, 0xfd, 0xf1, 0xad, 0x5c, 0x74, 0x4e, 0x67, 0x04, 0x55, 0xf9, 0xf6, 0x8a, + 0x16, 0x8c, 0xc4, 0xf8, 0x0c, 0x2a, 0x84, 0xba, 0x3e, 0xa7, 0x12, 0xc7, 0x9b, 0xf2, 0x93, 0x4f, + 0x74, 0x7d, 0xe7, 0x35, 0x54, 0x3d, 0xe5, 0x99, 0xde, 0xdb, 0x97, 0xff, 0x34, 0x32, 0x97, 0x57, + 0x0d, 0xf4, 0xea, 0xaa, 0x81, 0xfe, 0xbe, 0x6a, 0xa0, 0x5f, 0xae, 0x1b, 0x99, 0x57, 0xd7, 0x8d, + 0xcc, 0x1f, 0xd7, 0x8d, 0xcc, 0x37, 0x45, 0xf9, 0x76, 0x05, 0x8b, 0x45, 0x41, 0xfe, 0x0b, 0x7c, + 0xf0, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xe7, 0x85, 0xb9, 0xc1, 0x57, 0x08, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/vendor/github.com/thanos-io/thanos/pkg/store/storepb/rpc.proto b/vendor/github.com/thanos-io/thanos/pkg/store/storepb/rpc.proto index c314c40f08..3cd02e17e2 100644 --- a/vendor/github.com/thanos-io/thanos/pkg/store/storepb/rpc.proto +++ b/vendor/github.com/thanos-io/thanos/pkg/store/storepb/rpc.proto @@ -6,7 +6,7 @@ package thanos; import "types.proto"; import "gogoproto/gogo.proto"; -import "github.com/prometheus/prometheus/prompb/types.proto"; +import "prompb/types.proto"; option go_package = "storepb"; @@ -53,7 +53,7 @@ message WriteResponse { } message WriteRequest { - repeated prometheus.TimeSeries timeseries = 1 [(gogoproto.nullable) = false]; + repeated prometheus_copy.TimeSeries timeseries = 1 [(gogoproto.nullable) = false]; string tenant = 2; int64 replica = 3; } diff --git a/vendor/github.com/thanos-io/thanos/pkg/testutil/testorbench.go b/vendor/github.com/thanos-io/thanos/pkg/testutil/testorbench.go index dcfbff11ed..5f7dc15ea7 100644 --- a/vendor/github.com/thanos-io/thanos/pkg/testutil/testorbench.go +++ b/vendor/github.com/thanos-io/thanos/pkg/testutil/testorbench.go @@ -27,6 +27,8 @@ type TB interface { testing.TB IsBenchmark() bool Run(name string, f func(t TB)) bool + + SetBytes(n int64) N() int ResetTimer() } @@ -61,6 +63,14 @@ func (t *tb) N() int { return 1 } +// SetBytes records the number of bytes processed in a single operation for benchmark, noop otherwise. +// If this is called, the benchmark will report ns/op and MB/s. +func (t *tb) SetBytes(n int64) { + if b, ok := t.TB.(*testing.B); ok { + b.SetBytes(n) + } +} + // ResetTimer resets a timer, if it's a benchmark, noop otherwise. func (t *tb) ResetTimer() { if b, ok := t.TB.(*testing.B); ok { diff --git a/vendor/github.com/thanos-io/thanos/pkg/testutil/testutil.go b/vendor/github.com/thanos-io/thanos/pkg/testutil/testutil.go index f4a3933fb4..e1ba298d7e 100644 --- a/vendor/github.com/thanos-io/thanos/pkg/testutil/testutil.go +++ b/vendor/github.com/thanos-io/thanos/pkg/testutil/testutil.go @@ -1,24 +1,5 @@ -// The MIT License (MIT) - -// Copyright (c) 2014 Ben Johnson - -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: - -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. - -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. +// Copyright (c) The Thanos Authors. +// Licensed under the Apache License 2.0. package testutil @@ -29,50 +10,121 @@ import ( "runtime" "testing" + "github.com/davecgh/go-spew/spew" + "github.com/pmezard/go-difflib/difflib" "github.com/prometheus/client_golang/prometheus" dto "github.com/prometheus/client_model/go" ) // Assert fails the test if the condition is false. -func Assert(tb testing.TB, condition bool, msg string, v ...interface{}) { - if !condition { - _, file, line, _ := runtime.Caller(1) - fmt.Printf("\033[31m%s:%d: "+msg+"\033[39m\n\n", append([]interface{}{filepath.Base(file), line}, v...)...) - tb.FailNow() +func Assert(tb testing.TB, condition bool, v ...interface{}) { + if condition { + return } + _, file, line, _ := runtime.Caller(1) + + var msg string + if len(v) > 0 { + msg = fmt.Sprintf(v[0].(string), v[1:]...) + } + tb.Fatalf("\033[31m%s:%d: "+msg+"\033[39m\n\n", append([]interface{}{filepath.Base(file), line}, v...)...) } // Ok fails the test if an err is not nil. -func Ok(tb testing.TB, err error) { - if err != nil { - _, file, line, _ := runtime.Caller(1) - fmt.Printf("\033[31m%s:%d: unexpected error: %s\033[39m\n\n", filepath.Base(file), line, err.Error()) - tb.FailNow() +func Ok(tb testing.TB, err error, v ...interface{}) { + if err == nil { + return } + _, file, line, _ := runtime.Caller(1) + + var msg string + if len(v) > 0 { + msg = fmt.Sprintf(v[0].(string), v[1:]...) + } + tb.Fatalf("\033[31m%s:%d:"+msg+"\n\n unexpected error: %s\033[39m\n\n", filepath.Base(file), line, err.Error()) } // NotOk fails the test if an err is nil. -func NotOk(tb testing.TB, err error) { - if err == nil { - _, file, line, _ := runtime.Caller(1) - fmt.Printf("\033[31m%s:%d: expected error, got nothing \033[39m\n\n", filepath.Base(file), line) - tb.FailNow() +func NotOk(tb testing.TB, err error, v ...interface{}) { + if err != nil { + return } + _, file, line, _ := runtime.Caller(1) + + var msg string + if len(v) > 0 { + msg = fmt.Sprintf(v[0].(string), v[1:]...) + } + tb.Fatalf("\033[31m%s:%d:"+msg+"\n\n expected error, got nothing \033[39m\n\n", filepath.Base(file), line) } // Equals fails the test if exp is not equal to act. func Equals(tb testing.TB, exp, act interface{}, v ...interface{}) { - if !reflect.DeepEqual(exp, act) { - _, file, line, _ := runtime.Caller(1) + if reflect.DeepEqual(exp, act) { + return + } + _, file, line, _ := runtime.Caller(1) - var msg string - if len(v) > 0 { - msg = fmt.Sprintf(v[0].(string), v[1:]...) - } + var msg string + if len(v) > 0 { + msg = fmt.Sprintf(v[0].(string), v[1:]...) + } + tb.Fatalf("\033[31m%s:%d:"+msg+"\n\n\texp: %#v\n\n\tgot: %#v%s\033[39m\n\n", filepath.Base(file), line, exp, act, diff(exp, act)) +} + +func typeAndKind(v interface{}) (reflect.Type, reflect.Kind) { + t := reflect.TypeOf(v) + k := t.Kind() - fmt.Printf("\033[31m%s:%d:"+msg+"\n\n\texp: %#v\n\n\tgot: %#v\033[39m\n\n", filepath.Base(file), line, exp, act) - tb.FailNow() + if k == reflect.Ptr { + t = t.Elem() + k = t.Kind() } + return t, k +} + +// diff returns a diff of both values as long as both are of the same type and +// are a struct, map, slice, array or string. Otherwise it returns an empty string. +func diff(expected interface{}, actual interface{}) string { + if expected == nil || actual == nil { + return "" + } + + et, ek := typeAndKind(expected) + at, _ := typeAndKind(actual) + if et != at { + return "" + } + + if ek != reflect.Struct && ek != reflect.Map && ek != reflect.Slice && ek != reflect.Array && ek != reflect.String { + return "" + } + + var e, a string + c := spew.ConfigState{ + Indent: " ", + DisablePointerAddresses: true, + DisableCapacities: true, + SortKeys: true, + } + if et != reflect.TypeOf("") { + e = c.Sdump(expected) + a = c.Sdump(actual) + } else { + e = reflect.ValueOf(expected).String() + a = reflect.ValueOf(actual).String() + } + + diff, _ := difflib.GetUnifiedDiffString(difflib.UnifiedDiff{ + A: difflib.SplitLines(e), + B: difflib.SplitLines(a), + FromFile: "Expected", + FromDate: "", + ToFile: "Actual", + ToDate: "", + Context: 1, + }) + return "\n\nDiff:\n" + diff } // GatherAndCompare compares the metrics of a Gatherers pair. diff --git a/vendor/github.com/thanos-io/thanos/pkg/tracing/tracing.go b/vendor/github.com/thanos-io/thanos/pkg/tracing/tracing.go index 9664cbc068..929f03c7f2 100644 --- a/vendor/github.com/thanos-io/thanos/pkg/tracing/tracing.go +++ b/vendor/github.com/thanos-io/thanos/pkg/tracing/tracing.go @@ -37,8 +37,8 @@ func tracerFromContext(ctx context.Context) opentracing.Tracer { return nil } -// StartSpan starts and returns span with `operationName` using any Span found within given context. -// It uses traces propagated in context. +// StartSpan starts and returns span with `operationName` and hooking as child to a span found within given context if any. +// It uses opentracing.Tracer propagated in context. If no found, it uses noop tracer without notification. func StartSpan(ctx context.Context, operationName string, opts ...opentracing.StartSpanOption) (opentracing.Span, context.Context) { tracer := tracerFromContext(ctx) if tracer == nil { @@ -53,3 +53,11 @@ func StartSpan(ctx context.Context, operationName string, opts ...opentracing.St span = tracer.StartSpan(operationName, opts...) return span, opentracing.ContextWithSpan(ctx, span) } + +// DoInSpan executes function doFn inside new span with `operationName` name and hooking as child to a span found within given context if any. +// It uses opentracing.Tracer propagated in context. If no found, it uses noop tracer notification. +func DoInSpan(ctx context.Context, operationName string, doFn func(context.Context), opts ...opentracing.StartSpanOption) { + span, newCtx := StartSpan(ctx, operationName, opts...) + defer doFn(newCtx) + defer span.Finish() +} diff --git a/vendor/golang.org/x/mod/LICENSE b/vendor/golang.org/x/mod/LICENSE new file mode 100644 index 0000000000..6a66aea5ea --- /dev/null +++ b/vendor/golang.org/x/mod/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) 2009 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/golang.org/x/mod/PATENTS b/vendor/golang.org/x/mod/PATENTS new file mode 100644 index 0000000000..733099041f --- /dev/null +++ b/vendor/golang.org/x/mod/PATENTS @@ -0,0 +1,22 @@ +Additional IP Rights Grant (Patents) + +"This implementation" means the copyrightable works distributed by +Google as part of the Go project. + +Google hereby grants to You a perpetual, worldwide, non-exclusive, +no-charge, royalty-free, irrevocable (except as stated in this section) +patent license to make, have made, use, offer to sell, sell, import, +transfer and otherwise run, modify and propagate the contents of this +implementation of Go, where such license applies only to those patent +claims, both currently owned or controlled by Google and acquired in +the future, licensable by Google that are necessarily infringed by this +implementation of Go. This grant does not include claims that would be +infringed only as a consequence of further modification of this +implementation. If you or your agent or exclusive licensee institute or +order or agree to the institution of patent litigation against any +entity (including a cross-claim or counterclaim in a lawsuit) alleging +that this implementation of Go or any code incorporated within this +implementation of Go constitutes direct or contributory patent +infringement, or inducement of patent infringement, then any patent +rights granted to you under this License for this implementation of Go +shall terminate as of the date such litigation is filed. diff --git a/vendor/golang.org/x/tools/internal/module/module.go b/vendor/golang.org/x/mod/module/module.go similarity index 57% rename from vendor/golang.org/x/tools/internal/module/module.go rename to vendor/golang.org/x/mod/module/module.go index 9a4edb9dec..6cd37280a8 100644 --- a/vendor/golang.org/x/tools/internal/module/module.go +++ b/vendor/golang.org/x/mod/module/module.go @@ -2,8 +2,86 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// Package module defines the module.Version type -// along with support code. +// Package module defines the module.Version type along with support code. +// +// The module.Version type is a simple Path, Version pair: +// +// type Version struct { +// Path string +// Version string +// } +// +// There are no restrictions imposed directly by use of this structure, +// but additional checking functions, most notably Check, verify that +// a particular path, version pair is valid. +// +// Escaped Paths +// +// Module paths appear as substrings of file system paths +// (in the download cache) and of web server URLs in the proxy protocol. +// In general we cannot rely on file systems to be case-sensitive, +// nor can we rely on web servers, since they read from file systems. +// That is, we cannot rely on the file system to keep rsc.io/QUOTE +// and rsc.io/quote separate. Windows and macOS don't. +// Instead, we must never require two different casings of a file path. +// Because we want the download cache to match the proxy protocol, +// and because we want the proxy protocol to be possible to serve +// from a tree of static files (which might be stored on a case-insensitive +// file system), the proxy protocol must never require two different casings +// of a URL path either. +// +// One possibility would be to make the escaped form be the lowercase +// hexadecimal encoding of the actual path bytes. This would avoid ever +// needing different casings of a file path, but it would be fairly illegible +// to most programmers when those paths appeared in the file system +// (including in file paths in compiler errors and stack traces) +// in web server logs, and so on. Instead, we want a safe escaped form that +// leaves most paths unaltered. +// +// The safe escaped form is to replace every uppercase letter +// with an exclamation mark followed by the letter's lowercase equivalent. +// +// For example, +// +// github.com/Azure/azure-sdk-for-go -> github.com/!azure/azure-sdk-for-go. +// github.com/GoogleCloudPlatform/cloudsql-proxy -> github.com/!google!cloud!platform/cloudsql-proxy +// github.com/Sirupsen/logrus -> github.com/!sirupsen/logrus. +// +// Import paths that avoid upper-case letters are left unchanged. +// Note that because import paths are ASCII-only and avoid various +// problematic punctuation (like : < and >), the escaped form is also ASCII-only +// and avoids the same problematic punctuation. +// +// Import paths have never allowed exclamation marks, so there is no +// need to define how to escape a literal !. +// +// Unicode Restrictions +// +// Today, paths are disallowed from using Unicode. +// +// Although paths are currently disallowed from using Unicode, +// we would like at some point to allow Unicode letters as well, to assume that +// file systems and URLs are Unicode-safe (storing UTF-8), and apply +// the !-for-uppercase convention for escaping them in the file system. +// But there are at least two subtle considerations. +// +// First, note that not all case-fold equivalent distinct runes +// form an upper/lower pair. +// For example, U+004B ('K'), U+006B ('k'), and U+212A ('K' for Kelvin) +// are three distinct runes that case-fold to each other. +// When we do add Unicode letters, we must not assume that upper/lower +// are the only case-equivalent pairs. +// Perhaps the Kelvin symbol would be disallowed entirely, for example. +// Or perhaps it would escape as "!!k", or perhaps as "(212A)". +// +// Second, it would be nice to allow Unicode marks as well as letters, +// but marks include combining marks, and then we must deal not +// only with case folding but also normalization: both U+00E9 ('é') +// and U+0065 U+0301 ('e' followed by combining acute accent) +// look the same on the page and are treated by some file systems +// as the same path. If we do allow Unicode marks in paths, there +// must be some kind of normalization to allow only one canonical +// encoding of any character used in an import path. package module // IMPORTANT NOTE @@ -24,22 +102,95 @@ import ( "unicode" "unicode/utf8" - "golang.org/x/tools/internal/semver" + "golang.org/x/mod/semver" + errors "golang.org/x/xerrors" ) -// A Version is defined by a module path and version pair. +// A Version (for clients, a module.Version) is defined by a module path and version pair. +// These are stored in their plain (unescaped) form. type Version struct { + // Path is a module path, like "golang.org/x/text" or "rsc.io/quote/v2". Path string // Version is usually a semantic version in canonical form. - // There are two exceptions to this general rule. + // There are three exceptions to this general rule. // First, the top-level target of a build has no specific version // and uses Version = "". // Second, during MVS calculations the version "none" is used // to represent the decision to take no version of a given module. + // Third, filesystem paths found in "replace" directives are + // represented by a path with an empty version. Version string `json:",omitempty"` } +// String returns a representation of the Version suitable for logging +// (Path@Version, or just Path if Version is empty). +func (m Version) String() string { + if m.Version == "" { + return m.Path + } + return m.Path + "@" + m.Version +} + +// A ModuleError indicates an error specific to a module. +type ModuleError struct { + Path string + Version string + Err error +} + +// VersionError returns a ModuleError derived from a Version and error, +// or err itself if it is already such an error. +func VersionError(v Version, err error) error { + var mErr *ModuleError + if errors.As(err, &mErr) && mErr.Path == v.Path && mErr.Version == v.Version { + return err + } + return &ModuleError{ + Path: v.Path, + Version: v.Version, + Err: err, + } +} + +func (e *ModuleError) Error() string { + if v, ok := e.Err.(*InvalidVersionError); ok { + return fmt.Sprintf("%s@%s: invalid %s: %v", e.Path, v.Version, v.noun(), v.Err) + } + if e.Version != "" { + return fmt.Sprintf("%s@%s: %v", e.Path, e.Version, e.Err) + } + return fmt.Sprintf("module %s: %v", e.Path, e.Err) +} + +func (e *ModuleError) Unwrap() error { return e.Err } + +// An InvalidVersionError indicates an error specific to a version, with the +// module path unknown or specified externally. +// +// A ModuleError may wrap an InvalidVersionError, but an InvalidVersionError +// must not wrap a ModuleError. +type InvalidVersionError struct { + Version string + Pseudo bool + Err error +} + +// noun returns either "version" or "pseudo-version", depending on whether +// e.Version is a pseudo-version. +func (e *InvalidVersionError) noun() string { + if e.Pseudo { + return "pseudo-version" + } + return "version" +} + +func (e *InvalidVersionError) Error() string { + return fmt.Sprintf("%s %q invalid: %s", e.noun(), e.Version, e.Err) +} + +func (e *InvalidVersionError) Unwrap() error { return e.Err } + // Check checks that a given module path, version pair is valid. // In addition to the path being a valid module path // and the version being a valid semantic version, @@ -51,17 +202,14 @@ func Check(path, version string) error { return err } if !semver.IsValid(version) { - return fmt.Errorf("malformed semantic version %v", version) + return &ModuleError{ + Path: path, + Err: &InvalidVersionError{Version: version, Err: errors.New("not a semantic version")}, + } } _, pathMajor, _ := SplitPathVersion(path) - if !MatchPathMajor(version, pathMajor) { - if pathMajor == "" { - pathMajor = "v0 or v1" - } - if pathMajor[0] == '.' { // .v1 - pathMajor = pathMajor[1:] - } - return fmt.Errorf("mismatched module path %v and version %v (want %v)", path, version, pathMajor) + if err := CheckPathMajor(version, pathMajor); err != nil { + return &ModuleError{Path: path, Err: err} } return nil } @@ -79,7 +227,7 @@ func firstPathOK(r rune) bool { // Paths can be ASCII letters, ASCII digits, and limited ASCII punctuation: + - . _ and ~. // This matches what "go get" has historically recognized in import paths. // TODO(rsc): We would like to allow Unicode letters, but that requires additional -// care in the safe encoding (see note below). +// care in the safe encoding (see "escaped paths" above). func pathOK(r rune) bool { if r < utf8.RuneSelf { return r == '+' || r == '-' || r == '.' || r == '_' || r == '~' || @@ -94,7 +242,7 @@ func pathOK(r rune) bool { // For now we allow all Unicode letters but otherwise limit to pathOK plus a few more punctuation characters. // If we expand the set of allowed characters here, we have to // work harder at detecting potential case-folding and normalization collisions. -// See note about "safe encoding" below. +// See note about "escaped paths" above. func fileNameOK(r rune) bool { if r < utf8.RuneSelf { // Entire set of ASCII punctuation, from which we remove characters: @@ -120,6 +268,17 @@ func fileNameOK(r rune) bool { } // CheckPath checks that a module path is valid. +// A valid module path is a valid import path, as checked by CheckImportPath, +// with two additional constraints. +// First, the leading path element (up to the first slash, if any), +// by convention a domain name, must contain only lower-case ASCII letters, +// ASCII digits, dots (U+002E), and dashes (U+002D); +// it must contain at least one dot and cannot start with a dash. +// Second, for a final path element of the form /vN, where N looks numeric +// (ASCII digits and dots) must not begin with a leading zero, must not be /v1, +// and must not contain any dots. For paths beginning with "gopkg.in/", +// this second requirement is replaced by a requirement that the path +// follow the gopkg.in server's conventions. func CheckPath(path string) error { if err := checkPath(path, false); err != nil { return fmt.Errorf("malformed module path %q: %v", path, err) @@ -149,6 +308,20 @@ func CheckPath(path string) error { } // CheckImportPath checks that an import path is valid. +// +// A valid import path consists of one or more valid path elements +// separated by slashes (U+002F). (It must not begin with nor end in a slash.) +// +// A valid path element is a non-empty string made up of +// ASCII letters, ASCII digits, and limited ASCII punctuation: + - . _ and ~. +// It must not begin or end with a dot (U+002E), nor contain two dots in a row. +// +// The element prefix up to the first dot must not be a reserved file name +// on Windows, regardless of case (CON, com1, NuL, and so on). +// +// CheckImportPath may be less restrictive in the future, but see the +// top-level package documentation for additional information about +// subtleties of Unicode. func CheckImportPath(path string) error { if err := checkPath(path, false); err != nil { return fmt.Errorf("malformed import path %q: %v", path, err) @@ -169,8 +342,8 @@ func checkPath(path string, fileName bool) error { if path == "" { return fmt.Errorf("empty string") } - if strings.Contains(path, "..") { - return fmt.Errorf("double dot") + if path[0] == '-' { + return fmt.Errorf("leading dash") } if strings.Contains(path, "//") { return fmt.Errorf("double slash") @@ -226,13 +399,24 @@ func checkElem(elem string, fileName bool) error { } for _, bad := range badWindowsNames { if strings.EqualFold(bad, short) { - return fmt.Errorf("disallowed path element %q", elem) + return fmt.Errorf("%q disallowed as path element component on Windows", short) } } return nil } -// CheckFilePath checks whether a slash-separated file path is valid. +// CheckFilePath checks that a slash-separated file path is valid. +// The definition of a valid file path is the same as the definition +// of a valid import path except that the set of allowed characters is larger: +// all Unicode letters, ASCII digits, the ASCII space character (U+0020), +// and the ASCII punctuation characters +// “!#$%&()+,-.=@[]^_{}~”. +// (The excluded punctuation characters, " * < > ? ` ' | / \ and :, +// have special meanings in certain shells or operating systems.) +// +// CheckFilePath may be less restrictive in the future, but see the +// top-level package documentation for additional information about +// subtleties of Unicode. func CheckFilePath(path string) error { if err := checkPath(path, true); err != nil { return fmt.Errorf("malformed file path %q: %v", path, err) @@ -271,6 +455,9 @@ var badWindowsNames = []string{ // and version is either empty or "/vN" for N >= 2. // As a special case, gopkg.in paths are recognized directly; // they require ".vN" instead of "/vN", and for all N, not just N >= 2. +// SplitPathVersion returns with ok = false when presented with +// a path whose last path element does not satisfy the constraints +// applied by CheckPath, such as "example.com/pkg/v1" or "example.com/pkg/v1.2". func SplitPathVersion(path string) (prefix, pathMajor string, ok bool) { if strings.HasPrefix(path, "gopkg.in/") { return splitGopkgIn(path) @@ -319,20 +506,65 @@ func splitGopkgIn(path string) (prefix, pathMajor string, ok bool) { // MatchPathMajor reports whether the semantic version v // matches the path major version pathMajor. +// +// MatchPathMajor returns true if and only if CheckPathMajor returns nil. func MatchPathMajor(v, pathMajor string) bool { + return CheckPathMajor(v, pathMajor) == nil +} + +// CheckPathMajor returns a non-nil error if the semantic version v +// does not match the path major version pathMajor. +func CheckPathMajor(v, pathMajor string) error { + // TODO(jayconrod): return errors or panic for invalid inputs. This function + // (and others) was covered by integration tests for cmd/go, and surrounding + // code protected against invalid inputs like non-canonical versions. if strings.HasPrefix(pathMajor, ".v") && strings.HasSuffix(pathMajor, "-unstable") { pathMajor = strings.TrimSuffix(pathMajor, "-unstable") } if strings.HasPrefix(v, "v0.0.0-") && pathMajor == ".v1" { // Allow old bug in pseudo-versions that generated v0.0.0- pseudoversion for gopkg .v1. // For example, gopkg.in/yaml.v2@v2.2.1's go.mod requires gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405. - return true + return nil } m := semver.Major(v) if pathMajor == "" { - return m == "v0" || m == "v1" || semver.Build(v) == "+incompatible" + if m == "v0" || m == "v1" || semver.Build(v) == "+incompatible" { + return nil + } + pathMajor = "v0 or v1" + } else if pathMajor[0] == '/' || pathMajor[0] == '.' { + if m == pathMajor[1:] { + return nil + } + pathMajor = pathMajor[1:] + } + return &InvalidVersionError{ + Version: v, + Err: fmt.Errorf("should be %s, not %s", pathMajor, semver.Major(v)), } - return (pathMajor[0] == '/' || pathMajor[0] == '.') && m == pathMajor[1:] +} + +// PathMajorPrefix returns the major-version tag prefix implied by pathMajor. +// An empty PathMajorPrefix allows either v0 or v1. +// +// Note that MatchPathMajor may accept some versions that do not actually begin +// with this prefix: namely, it accepts a 'v0.0.0-' prefix for a '.v1' +// pathMajor, even though that pathMajor implies 'v1' tagging. +func PathMajorPrefix(pathMajor string) string { + if pathMajor == "" { + return "" + } + if pathMajor[0] != '/' && pathMajor[0] != '.' { + panic("pathMajor suffix " + pathMajor + " passed to PathMajorPrefix lacks separator") + } + if strings.HasPrefix(pathMajor, ".v") && strings.HasSuffix(pathMajor, "-unstable") { + pathMajor = strings.TrimSuffix(pathMajor, "-unstable") + } + m := pathMajor[1:] + if m != semver.Major(m) { + panic("pathMajor suffix " + pathMajor + "passed to PathMajorPrefix is not a valid major version") + } + return m } // CanonicalVersion returns the canonical form of the version string v. @@ -345,7 +577,10 @@ func CanonicalVersion(v string) string { return cv } -// Sort sorts the list by Path, breaking ties by comparing Versions. +// Sort sorts the list by Path, breaking ties by comparing Version fields. +// The Version fields are interpreted as semantic versions (using semver.Compare) +// optionally followed by a tie-breaking suffix introduced by a slash character, +// like in "v0.0.1/go.mod". func Sort(list []Version) { sort.Slice(list, func(i, j int) bool { mi := list[i] @@ -372,93 +607,36 @@ func Sort(list []Version) { }) } -// Safe encodings -// -// Module paths appear as substrings of file system paths -// (in the download cache) and of web server URLs in the proxy protocol. -// In general we cannot rely on file systems to be case-sensitive, -// nor can we rely on web servers, since they read from file systems. -// That is, we cannot rely on the file system to keep rsc.io/QUOTE -// and rsc.io/quote separate. Windows and macOS don't. -// Instead, we must never require two different casings of a file path. -// Because we want the download cache to match the proxy protocol, -// and because we want the proxy protocol to be possible to serve -// from a tree of static files (which might be stored on a case-insensitive -// file system), the proxy protocol must never require two different casings -// of a URL path either. -// -// One possibility would be to make the safe encoding be the lowercase -// hexadecimal encoding of the actual path bytes. This would avoid ever -// needing different casings of a file path, but it would be fairly illegible -// to most programmers when those paths appeared in the file system -// (including in file paths in compiler errors and stack traces) -// in web server logs, and so on. Instead, we want a safe encoding that -// leaves most paths unaltered. -// -// The safe encoding is this: -// replace every uppercase letter with an exclamation mark -// followed by the letter's lowercase equivalent. -// -// For example, -// github.com/Azure/azure-sdk-for-go -> github.com/!azure/azure-sdk-for-go. -// github.com/GoogleCloudPlatform/cloudsql-proxy -> github.com/!google!cloud!platform/cloudsql-proxy -// github.com/Sirupsen/logrus -> github.com/!sirupsen/logrus. -// -// Import paths that avoid upper-case letters are left unchanged. -// Note that because import paths are ASCII-only and avoid various -// problematic punctuation (like : < and >), the safe encoding is also ASCII-only -// and avoids the same problematic punctuation. -// -// Import paths have never allowed exclamation marks, so there is no -// need to define how to encode a literal !. -// -// Although paths are disallowed from using Unicode (see pathOK above), -// the eventual plan is to allow Unicode letters as well, to assume that -// file systems and URLs are Unicode-safe (storing UTF-8), and apply -// the !-for-uppercase convention. Note however that not all runes that -// are different but case-fold equivalent are an upper/lower pair. -// For example, U+004B ('K'), U+006B ('k'), and U+212A ('K' for Kelvin) -// are considered to case-fold to each other. When we do add Unicode -// letters, we must not assume that upper/lower are the only case-equivalent pairs. -// Perhaps the Kelvin symbol would be disallowed entirely, for example. -// Or perhaps it would encode as "!!k", or perhaps as "(212A)". -// -// Also, it would be nice to allow Unicode marks as well as letters, -// but marks include combining marks, and then we must deal not -// only with case folding but also normalization: both U+00E9 ('é') -// and U+0065 U+0301 ('e' followed by combining acute accent) -// look the same on the page and are treated by some file systems -// as the same path. If we do allow Unicode marks in paths, there -// must be some kind of normalization to allow only one canonical -// encoding of any character used in an import path. - -// EncodePath returns the safe encoding of the given module path. +// EscapePath returns the escaped form of the given module path. // It fails if the module path is invalid. -func EncodePath(path string) (encoding string, err error) { +func EscapePath(path string) (escaped string, err error) { if err := CheckPath(path); err != nil { return "", err } - return encodeString(path) + return escapeString(path) } -// EncodeVersion returns the safe encoding of the given module version. +// EscapeVersion returns the escaped form of the given module version. // Versions are allowed to be in non-semver form but must be valid file names // and not contain exclamation marks. -func EncodeVersion(v string) (encoding string, err error) { +func EscapeVersion(v string) (escaped string, err error) { if err := checkElem(v, true); err != nil || strings.Contains(v, "!") { - return "", fmt.Errorf("disallowed version string %q", v) + return "", &InvalidVersionError{ + Version: v, + Err: fmt.Errorf("disallowed version string"), + } } - return encodeString(v) + return escapeString(v) } -func encodeString(s string) (encoding string, err error) { +func escapeString(s string) (escaped string, err error) { haveUpper := false for _, r := range s { if r == '!' || r >= utf8.RuneSelf { // This should be disallowed by CheckPath, but diagnose anyway. - // The correctness of the encoding loop below depends on it. - return "", fmt.Errorf("internal error: inconsistency in EncodePath") + // The correctness of the escaping loop below depends on it. + return "", fmt.Errorf("internal error: inconsistency in EscapePath") } if 'A' <= r && r <= 'Z' { haveUpper = true @@ -480,39 +658,39 @@ func encodeString(s string) (encoding string, err error) { return string(buf), nil } -// DecodePath returns the module path of the given safe encoding. -// It fails if the encoding is invalid or encodes an invalid path. -func DecodePath(encoding string) (path string, err error) { - path, ok := decodeString(encoding) +// UnescapePath returns the module path for the given escaped path. +// It fails if the escaped path is invalid or describes an invalid path. +func UnescapePath(escaped string) (path string, err error) { + path, ok := unescapeString(escaped) if !ok { - return "", fmt.Errorf("invalid module path encoding %q", encoding) + return "", fmt.Errorf("invalid escaped module path %q", escaped) } if err := CheckPath(path); err != nil { - return "", fmt.Errorf("invalid module path encoding %q: %v", encoding, err) + return "", fmt.Errorf("invalid escaped module path %q: %v", escaped, err) } return path, nil } -// DecodeVersion returns the version string for the given safe encoding. -// It fails if the encoding is invalid or encodes an invalid version. +// UnescapeVersion returns the version string for the given escaped version. +// It fails if the escaped form is invalid or describes an invalid version. // Versions are allowed to be in non-semver form but must be valid file names // and not contain exclamation marks. -func DecodeVersion(encoding string) (v string, err error) { - v, ok := decodeString(encoding) +func UnescapeVersion(escaped string) (v string, err error) { + v, ok := unescapeString(escaped) if !ok { - return "", fmt.Errorf("invalid version encoding %q", encoding) + return "", fmt.Errorf("invalid escaped version %q", escaped) } if err := checkElem(v, true); err != nil { - return "", fmt.Errorf("disallowed version string %q", v) + return "", fmt.Errorf("invalid escaped version %q: %v", v, err) } return v, nil } -func decodeString(encoding string) (string, bool) { +func unescapeString(escaped string) (string, bool) { var buf []byte bang := false - for _, r := range encoding { + for _, r := range escaped { if r >= utf8.RuneSelf { return "", false } diff --git a/vendor/golang.org/x/tools/internal/semver/semver.go b/vendor/golang.org/x/mod/semver/semver.go similarity index 99% rename from vendor/golang.org/x/tools/internal/semver/semver.go rename to vendor/golang.org/x/mod/semver/semver.go index 4af7118e55..2988e3cf9c 100644 --- a/vendor/golang.org/x/tools/internal/semver/semver.go +++ b/vendor/golang.org/x/mod/semver/semver.go @@ -107,7 +107,7 @@ func Build(v string) string { } // Compare returns an integer comparing two versions according to -// according to semantic version precedence. +// semantic version precedence. // The result will be 0 if v == w, -1 if v < w, or +1 if v > w. // // An invalid semantic version string is considered less than a valid one. @@ -263,7 +263,7 @@ func parseBuild(v string) (t, rest string, ok bool) { i := 1 start := 1 for i < len(v) { - if !isIdentChar(v[i]) { + if !isIdentChar(v[i]) && v[i] != '.' { return } if v[i] == '.' { diff --git a/vendor/golang.org/x/net/http2/http2.go b/vendor/golang.org/x/net/http2/http2.go index bdaba1d46b..27cc893cc0 100644 --- a/vendor/golang.org/x/net/http2/http2.go +++ b/vendor/golang.org/x/net/http2/http2.go @@ -19,7 +19,6 @@ package http2 // import "golang.org/x/net/http2" import ( "bufio" "crypto/tls" - "errors" "fmt" "io" "net/http" @@ -173,11 +172,6 @@ func (s SettingID) String() string { return fmt.Sprintf("UNKNOWN_SETTING_%d", uint16(s)) } -var ( - errInvalidHeaderFieldName = errors.New("http2: invalid header field name") - errInvalidHeaderFieldValue = errors.New("http2: invalid header field value") -) - // validWireHeaderFieldName reports whether v is a valid header field // name (key). See httpguts.ValidHeaderName for the base rules. // diff --git a/vendor/golang.org/x/net/http2/server.go b/vendor/golang.org/x/net/http2/server.go index de31d72b2c..bc9e41a1b7 100644 --- a/vendor/golang.org/x/net/http2/server.go +++ b/vendor/golang.org/x/net/http2/server.go @@ -581,13 +581,10 @@ type stream struct { cancelCtx func() // owned by serverConn's serve loop: - bodyBytes int64 // body bytes seen so far - declBodyBytes int64 // or -1 if undeclared - flow flow // limits writing from Handler to client - inflow flow // what the client is allowed to POST/etc to us - parent *stream // or nil - numTrailerValues int64 - weight uint8 + bodyBytes int64 // body bytes seen so far + declBodyBytes int64 // or -1 if undeclared + flow flow // limits writing from Handler to client + inflow flow // what the client is allowed to POST/etc to us state streamState resetQueued bool // RST_STREAM queued for write; set by sc.resetStream gotTrailerHeader bool // HEADER frame for trailers was seen diff --git a/vendor/golang.org/x/net/http2/transport.go b/vendor/golang.org/x/net/http2/transport.go index 42ad181448..81778bec61 100644 --- a/vendor/golang.org/x/net/http2/transport.go +++ b/vendor/golang.org/x/net/http2/transport.go @@ -93,7 +93,7 @@ type Transport struct { // send in the initial settings frame. It is how many bytes // of response headers are allowed. Unlike the http2 spec, zero here // means to use a default limit (currently 10MB). If you actually - // want to advertise an ulimited value to the peer, Transport + // want to advertise an unlimited value to the peer, Transport // interprets the highest possible value here (0xffffffff or 1<<32-1) // to mean no limit. MaxHeaderListSize uint32 @@ -227,6 +227,7 @@ type ClientConn struct { br *bufio.Reader fr *Framer lastActive time.Time + lastIdle time.Time // time last idle // Settings from peer: (also guarded by mu) maxFrameSize uint32 maxConcurrentStreams uint32 @@ -736,7 +737,8 @@ func (cc *ClientConn) idleStateLocked() (st clientConnIdleState) { } st.canTakeNewRequest = cc.goAway == nil && !cc.closed && !cc.closing && maxConcurrentOkay && - int64(cc.nextStreamID)+2*int64(cc.pendingRequests) < math.MaxInt32 + int64(cc.nextStreamID)+2*int64(cc.pendingRequests) < math.MaxInt32 && + !cc.tooIdleLocked() st.freshConn = cc.nextStreamID == 1 && st.canTakeNewRequest return } @@ -746,6 +748,16 @@ func (cc *ClientConn) canTakeNewRequestLocked() bool { return st.canTakeNewRequest } +// tooIdleLocked reports whether this connection has been been sitting idle +// for too much wall time. +func (cc *ClientConn) tooIdleLocked() bool { + // The Round(0) strips the monontonic clock reading so the + // times are compared based on their wall time. We don't want + // to reuse a connection that's been sitting idle during + // VM/laptop suspend if monotonic time was also frozen. + return cc.idleTimeout != 0 && !cc.lastIdle.IsZero() && time.Since(cc.lastIdle.Round(0)) > cc.idleTimeout +} + // onIdleTimeout is called from a time.AfterFunc goroutine. It will // only be called when we're idle, but because we're coming from a new // goroutine, there could be a new request coming in at the same time, @@ -1150,6 +1162,7 @@ func (cc *ClientConn) awaitOpenSlotForRequest(req *http.Request) error { } return errClientConnUnusable } + cc.lastIdle = time.Time{} if int64(len(cc.streams))+1 <= int64(cc.maxConcurrentStreams) { if waitingForConn != nil { close(waitingForConn) @@ -1638,6 +1651,7 @@ func (cc *ClientConn) streamByID(id uint32, andRemove bool) *clientStream { delete(cc.streams, id) if len(cc.streams) == 0 && cc.idleTimer != nil { cc.idleTimer.Reset(cc.idleTimeout) + cc.lastIdle = time.Now() } close(cs.done) // Wake up checkResetOrDone via clientStream.awaitFlowControl and @@ -2184,8 +2198,6 @@ func (rl *clientConnReadLoop) processData(f *DataFrame) error { return nil } -var errInvalidTrailers = errors.New("http2: invalid trailers") - func (rl *clientConnReadLoop) endStream(cs *clientStream) { // TODO: check that any declared content-length matches, like // server.go's (*stream).endStream method. @@ -2416,7 +2428,6 @@ func (cc *ClientConn) writeStreamReset(streamID uint32, code ErrCode, err error) var ( errResponseHeaderListSize = errors.New("http2: response header list larger than advertised limit") errRequestHeaderListSize = errors.New("http2: request header list larger than peer's advertised limit") - errPseudoTrailers = errors.New("http2: invalid pseudo header in trailers") ) func (cc *ClientConn) logf(format string, args ...interface{}) { diff --git a/vendor/golang.org/x/net/ipv4/helper.go b/vendor/golang.org/x/net/ipv4/helper.go index b494a2cde4..e845a7376e 100644 --- a/vendor/golang.org/x/net/ipv4/helper.go +++ b/vendor/golang.org/x/net/ipv4/helper.go @@ -13,16 +13,13 @@ import ( ) var ( - errInvalidConn = errors.New("invalid connection") - errMissingAddress = errors.New("missing address") - errMissingHeader = errors.New("missing header") - errNilHeader = errors.New("nil header") - errHeaderTooShort = errors.New("header too short") - errExtHeaderTooShort = errors.New("extension header too short") - errInvalidConnType = errors.New("invalid conn type") - errNoSuchInterface = errors.New("no such interface") - errNoSuchMulticastInterface = errors.New("no such multicast interface") - errNotImplemented = errors.New("not implemented on " + runtime.GOOS + "/" + runtime.GOARCH) + errInvalidConn = errors.New("invalid connection") + errMissingAddress = errors.New("missing address") + errNilHeader = errors.New("nil header") + errHeaderTooShort = errors.New("header too short") + errExtHeaderTooShort = errors.New("extension header too short") + errInvalidConnType = errors.New("invalid conn type") + errNotImplemented = errors.New("not implemented on " + runtime.GOOS + "/" + runtime.GOARCH) // See https://www.freebsd.org/doc/en/books/porters-handbook/versions.html. freebsdVersion uint32 diff --git a/vendor/golang.org/x/net/ipv4/sys_asmreq.go b/vendor/golang.org/x/net/ipv4/sys_asmreq.go index c5eaafe96b..76d670acaa 100644 --- a/vendor/golang.org/x/net/ipv4/sys_asmreq.go +++ b/vendor/golang.org/x/net/ipv4/sys_asmreq.go @@ -7,12 +7,15 @@ package ipv4 import ( + "errors" "net" "unsafe" "golang.org/x/net/internal/socket" ) +var errNoSuchInterface = errors.New("no such interface") + func (so *sockOpt) setIPMreq(c *socket.Conn, ifi *net.Interface, grp net.IP) error { mreq := ipMreq{Multiaddr: [4]byte{grp[0], grp[1], grp[2], grp[3]}} if err := setIPMreqInterface(&mreq, ifi); err != nil { diff --git a/vendor/golang.org/x/net/ipv4/sys_bpf.go b/vendor/golang.org/x/net/ipv4/sys_bpf.go index 9f30b7308e..5c03dce3b7 100644 --- a/vendor/golang.org/x/net/ipv4/sys_bpf.go +++ b/vendor/golang.org/x/net/ipv4/sys_bpf.go @@ -11,13 +11,14 @@ import ( "golang.org/x/net/bpf" "golang.org/x/net/internal/socket" + "golang.org/x/sys/unix" ) func (so *sockOpt) setAttachFilter(c *socket.Conn, f []bpf.RawInstruction) error { - prog := sockFProg{ + prog := unix.SockFprog{ Len: uint16(len(f)), - Filter: (*sockFilter)(unsafe.Pointer(&f[0])), + Filter: (*unix.SockFilter)(unsafe.Pointer(&f[0])), } - b := (*[sizeofSockFprog]byte)(unsafe.Pointer(&prog))[:sizeofSockFprog] + b := (*[unix.SizeofSockFprog]byte)(unsafe.Pointer(&prog))[:unix.SizeofSockFprog] return so.Set(c, b) } diff --git a/vendor/golang.org/x/net/ipv4/sys_linux.go b/vendor/golang.org/x/net/ipv4/sys_linux.go index 60defe1326..cf755c7fba 100644 --- a/vendor/golang.org/x/net/ipv4/sys_linux.go +++ b/vendor/golang.org/x/net/ipv4/sys_linux.go @@ -11,6 +11,7 @@ import ( "golang.org/x/net/internal/iana" "golang.org/x/net/internal/socket" + "golang.org/x/sys/unix" ) var ( @@ -35,7 +36,7 @@ var ( ssoLeaveSourceGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_LEAVE_SOURCE_GROUP, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, ssoBlockSourceGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_BLOCK_SOURCE, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, ssoUnblockSourceGroup: {Option: socket.Option{Level: iana.ProtocolIP, Name: sysMCAST_UNBLOCK_SOURCE, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, - ssoAttachFilter: {Option: socket.Option{Level: sysSOL_SOCKET, Name: sysSO_ATTACH_FILTER, Len: sizeofSockFprog}}, + ssoAttachFilter: {Option: socket.Option{Level: unix.SOL_SOCKET, Name: unix.SO_ATTACH_FILTER, Len: unix.SizeofSockFprog}}, } ) diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_386.go b/vendor/golang.org/x/net/ipv4/zsys_linux_386.go index 43ef8e5922..1c7fdfa13a 100644 --- a/vendor/golang.org/x/net/ipv4/zsys_linux_386.go +++ b/vendor/golang.org/x/net/ipv4/zsys_linux_386.go @@ -55,9 +55,6 @@ const ( sysSO_EE_ORIGIN_TXSTATUS = 0x4 sysSO_EE_ORIGIN_TIMESTAMPING = 0x4 - sysSOL_SOCKET = 0x1 - sysSO_ATTACH_FILTER = 0x1a - sizeofKernelSockaddrStorage = 0x80 sizeofSockaddrInet = 0x10 sizeofInetPktinfo = 0xc @@ -70,8 +67,6 @@ const ( sizeofGroupSourceReq = 0x104 sizeofICMPFilter = 0x4 - - sizeofSockFprog = 0x8 ) type kernelSockaddrStorage struct { @@ -133,16 +128,3 @@ type groupSourceReq struct { type icmpFilter struct { Data uint32 } - -type sockFProg struct { - Len uint16 - Pad_cgo_0 [2]byte - Filter *sockFilter -} - -type sockFilter struct { - Code uint16 - Jt uint8 - Jf uint8 - K uint32 -} diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_amd64.go b/vendor/golang.org/x/net/ipv4/zsys_linux_amd64.go index ee8204da46..a04e785187 100644 --- a/vendor/golang.org/x/net/ipv4/zsys_linux_amd64.go +++ b/vendor/golang.org/x/net/ipv4/zsys_linux_amd64.go @@ -55,9 +55,6 @@ const ( sysSO_EE_ORIGIN_TXSTATUS = 0x4 sysSO_EE_ORIGIN_TIMESTAMPING = 0x4 - sysSOL_SOCKET = 0x1 - sysSO_ATTACH_FILTER = 0x1a - sizeofKernelSockaddrStorage = 0x80 sizeofSockaddrInet = 0x10 sizeofInetPktinfo = 0xc @@ -70,8 +67,6 @@ const ( sizeofGroupSourceReq = 0x108 sizeofICMPFilter = 0x4 - - sizeofSockFprog = 0x10 ) type kernelSockaddrStorage struct { @@ -135,16 +130,3 @@ type groupSourceReq struct { type icmpFilter struct { Data uint32 } - -type sockFProg struct { - Len uint16 - Pad_cgo_0 [6]byte - Filter *sockFilter -} - -type sockFilter struct { - Code uint16 - Jt uint8 - Jf uint8 - K uint32 -} diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_arm.go b/vendor/golang.org/x/net/ipv4/zsys_linux_arm.go index 43ef8e5922..1c7fdfa13a 100644 --- a/vendor/golang.org/x/net/ipv4/zsys_linux_arm.go +++ b/vendor/golang.org/x/net/ipv4/zsys_linux_arm.go @@ -55,9 +55,6 @@ const ( sysSO_EE_ORIGIN_TXSTATUS = 0x4 sysSO_EE_ORIGIN_TIMESTAMPING = 0x4 - sysSOL_SOCKET = 0x1 - sysSO_ATTACH_FILTER = 0x1a - sizeofKernelSockaddrStorage = 0x80 sizeofSockaddrInet = 0x10 sizeofInetPktinfo = 0xc @@ -70,8 +67,6 @@ const ( sizeofGroupSourceReq = 0x104 sizeofICMPFilter = 0x4 - - sizeofSockFprog = 0x8 ) type kernelSockaddrStorage struct { @@ -133,16 +128,3 @@ type groupSourceReq struct { type icmpFilter struct { Data uint32 } - -type sockFProg struct { - Len uint16 - Pad_cgo_0 [2]byte - Filter *sockFilter -} - -type sockFilter struct { - Code uint16 - Jt uint8 - Jf uint8 - K uint32 -} diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_arm64.go b/vendor/golang.org/x/net/ipv4/zsys_linux_arm64.go index ee8204da46..a04e785187 100644 --- a/vendor/golang.org/x/net/ipv4/zsys_linux_arm64.go +++ b/vendor/golang.org/x/net/ipv4/zsys_linux_arm64.go @@ -55,9 +55,6 @@ const ( sysSO_EE_ORIGIN_TXSTATUS = 0x4 sysSO_EE_ORIGIN_TIMESTAMPING = 0x4 - sysSOL_SOCKET = 0x1 - sysSO_ATTACH_FILTER = 0x1a - sizeofKernelSockaddrStorage = 0x80 sizeofSockaddrInet = 0x10 sizeofInetPktinfo = 0xc @@ -70,8 +67,6 @@ const ( sizeofGroupSourceReq = 0x108 sizeofICMPFilter = 0x4 - - sizeofSockFprog = 0x10 ) type kernelSockaddrStorage struct { @@ -135,16 +130,3 @@ type groupSourceReq struct { type icmpFilter struct { Data uint32 } - -type sockFProg struct { - Len uint16 - Pad_cgo_0 [6]byte - Filter *sockFilter -} - -type sockFilter struct { - Code uint16 - Jt uint8 - Jf uint8 - K uint32 -} diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_mips.go b/vendor/golang.org/x/net/ipv4/zsys_linux_mips.go index 43ef8e5922..1c7fdfa13a 100644 --- a/vendor/golang.org/x/net/ipv4/zsys_linux_mips.go +++ b/vendor/golang.org/x/net/ipv4/zsys_linux_mips.go @@ -55,9 +55,6 @@ const ( sysSO_EE_ORIGIN_TXSTATUS = 0x4 sysSO_EE_ORIGIN_TIMESTAMPING = 0x4 - sysSOL_SOCKET = 0x1 - sysSO_ATTACH_FILTER = 0x1a - sizeofKernelSockaddrStorage = 0x80 sizeofSockaddrInet = 0x10 sizeofInetPktinfo = 0xc @@ -70,8 +67,6 @@ const ( sizeofGroupSourceReq = 0x104 sizeofICMPFilter = 0x4 - - sizeofSockFprog = 0x8 ) type kernelSockaddrStorage struct { @@ -133,16 +128,3 @@ type groupSourceReq struct { type icmpFilter struct { Data uint32 } - -type sockFProg struct { - Len uint16 - Pad_cgo_0 [2]byte - Filter *sockFilter -} - -type sockFilter struct { - Code uint16 - Jt uint8 - Jf uint8 - K uint32 -} diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_mips64.go b/vendor/golang.org/x/net/ipv4/zsys_linux_mips64.go index ee8204da46..a04e785187 100644 --- a/vendor/golang.org/x/net/ipv4/zsys_linux_mips64.go +++ b/vendor/golang.org/x/net/ipv4/zsys_linux_mips64.go @@ -55,9 +55,6 @@ const ( sysSO_EE_ORIGIN_TXSTATUS = 0x4 sysSO_EE_ORIGIN_TIMESTAMPING = 0x4 - sysSOL_SOCKET = 0x1 - sysSO_ATTACH_FILTER = 0x1a - sizeofKernelSockaddrStorage = 0x80 sizeofSockaddrInet = 0x10 sizeofInetPktinfo = 0xc @@ -70,8 +67,6 @@ const ( sizeofGroupSourceReq = 0x108 sizeofICMPFilter = 0x4 - - sizeofSockFprog = 0x10 ) type kernelSockaddrStorage struct { @@ -135,16 +130,3 @@ type groupSourceReq struct { type icmpFilter struct { Data uint32 } - -type sockFProg struct { - Len uint16 - Pad_cgo_0 [6]byte - Filter *sockFilter -} - -type sockFilter struct { - Code uint16 - Jt uint8 - Jf uint8 - K uint32 -} diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_mips64le.go b/vendor/golang.org/x/net/ipv4/zsys_linux_mips64le.go index ee8204da46..a04e785187 100644 --- a/vendor/golang.org/x/net/ipv4/zsys_linux_mips64le.go +++ b/vendor/golang.org/x/net/ipv4/zsys_linux_mips64le.go @@ -55,9 +55,6 @@ const ( sysSO_EE_ORIGIN_TXSTATUS = 0x4 sysSO_EE_ORIGIN_TIMESTAMPING = 0x4 - sysSOL_SOCKET = 0x1 - sysSO_ATTACH_FILTER = 0x1a - sizeofKernelSockaddrStorage = 0x80 sizeofSockaddrInet = 0x10 sizeofInetPktinfo = 0xc @@ -70,8 +67,6 @@ const ( sizeofGroupSourceReq = 0x108 sizeofICMPFilter = 0x4 - - sizeofSockFprog = 0x10 ) type kernelSockaddrStorage struct { @@ -135,16 +130,3 @@ type groupSourceReq struct { type icmpFilter struct { Data uint32 } - -type sockFProg struct { - Len uint16 - Pad_cgo_0 [6]byte - Filter *sockFilter -} - -type sockFilter struct { - Code uint16 - Jt uint8 - Jf uint8 - K uint32 -} diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_mipsle.go b/vendor/golang.org/x/net/ipv4/zsys_linux_mipsle.go index 43ef8e5922..1c7fdfa13a 100644 --- a/vendor/golang.org/x/net/ipv4/zsys_linux_mipsle.go +++ b/vendor/golang.org/x/net/ipv4/zsys_linux_mipsle.go @@ -55,9 +55,6 @@ const ( sysSO_EE_ORIGIN_TXSTATUS = 0x4 sysSO_EE_ORIGIN_TIMESTAMPING = 0x4 - sysSOL_SOCKET = 0x1 - sysSO_ATTACH_FILTER = 0x1a - sizeofKernelSockaddrStorage = 0x80 sizeofSockaddrInet = 0x10 sizeofInetPktinfo = 0xc @@ -70,8 +67,6 @@ const ( sizeofGroupSourceReq = 0x104 sizeofICMPFilter = 0x4 - - sizeofSockFprog = 0x8 ) type kernelSockaddrStorage struct { @@ -133,16 +128,3 @@ type groupSourceReq struct { type icmpFilter struct { Data uint32 } - -type sockFProg struct { - Len uint16 - Pad_cgo_0 [2]byte - Filter *sockFilter -} - -type sockFilter struct { - Code uint16 - Jt uint8 - Jf uint8 - K uint32 -} diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_ppc.go b/vendor/golang.org/x/net/ipv4/zsys_linux_ppc.go index fa1b6bc61d..3c5ea54731 100644 --- a/vendor/golang.org/x/net/ipv4/zsys_linux_ppc.go +++ b/vendor/golang.org/x/net/ipv4/zsys_linux_ppc.go @@ -55,9 +55,6 @@ const ( sysSO_EE_ORIGIN_TXSTATUS = 0x4 sysSO_EE_ORIGIN_TIMESTAMPING = 0x4 - sysSOL_SOCKET = 0x1 - sysSO_ATTACH_FILTER = 0x1a - sizeofKernelSockaddrStorage = 0x80 sizeofSockaddrInet = 0x10 sizeofInetPktinfo = 0xc @@ -70,8 +67,6 @@ const ( sizeofGroupSourceReq = 0x104 sizeofICMPFilter = 0x4 - - sizeofSockFprog = 0x8 ) type kernelSockaddrStorage struct { @@ -133,16 +128,3 @@ type groupSourceReq struct { type icmpFilter struct { Data uint32 } - -type sockFProg struct { - Len uint16 - Pad_cgo_0 [2]byte - Filter *sockFilter -} - -type sockFilter struct { - Code uint16 - Jt uint8 - Jf uint8 - K uint32 -} diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_ppc64.go b/vendor/golang.org/x/net/ipv4/zsys_linux_ppc64.go index ee8204da46..a04e785187 100644 --- a/vendor/golang.org/x/net/ipv4/zsys_linux_ppc64.go +++ b/vendor/golang.org/x/net/ipv4/zsys_linux_ppc64.go @@ -55,9 +55,6 @@ const ( sysSO_EE_ORIGIN_TXSTATUS = 0x4 sysSO_EE_ORIGIN_TIMESTAMPING = 0x4 - sysSOL_SOCKET = 0x1 - sysSO_ATTACH_FILTER = 0x1a - sizeofKernelSockaddrStorage = 0x80 sizeofSockaddrInet = 0x10 sizeofInetPktinfo = 0xc @@ -70,8 +67,6 @@ const ( sizeofGroupSourceReq = 0x108 sizeofICMPFilter = 0x4 - - sizeofSockFprog = 0x10 ) type kernelSockaddrStorage struct { @@ -135,16 +130,3 @@ type groupSourceReq struct { type icmpFilter struct { Data uint32 } - -type sockFProg struct { - Len uint16 - Pad_cgo_0 [6]byte - Filter *sockFilter -} - -type sockFilter struct { - Code uint16 - Jt uint8 - Jf uint8 - K uint32 -} diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_ppc64le.go b/vendor/golang.org/x/net/ipv4/zsys_linux_ppc64le.go index ee8204da46..a04e785187 100644 --- a/vendor/golang.org/x/net/ipv4/zsys_linux_ppc64le.go +++ b/vendor/golang.org/x/net/ipv4/zsys_linux_ppc64le.go @@ -55,9 +55,6 @@ const ( sysSO_EE_ORIGIN_TXSTATUS = 0x4 sysSO_EE_ORIGIN_TIMESTAMPING = 0x4 - sysSOL_SOCKET = 0x1 - sysSO_ATTACH_FILTER = 0x1a - sizeofKernelSockaddrStorage = 0x80 sizeofSockaddrInet = 0x10 sizeofInetPktinfo = 0xc @@ -70,8 +67,6 @@ const ( sizeofGroupSourceReq = 0x108 sizeofICMPFilter = 0x4 - - sizeofSockFprog = 0x10 ) type kernelSockaddrStorage struct { @@ -135,16 +130,3 @@ type groupSourceReq struct { type icmpFilter struct { Data uint32 } - -type sockFProg struct { - Len uint16 - Pad_cgo_0 [6]byte - Filter *sockFilter -} - -type sockFilter struct { - Code uint16 - Jt uint8 - Jf uint8 - K uint32 -} diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_riscv64.go b/vendor/golang.org/x/net/ipv4/zsys_linux_riscv64.go index 0c0d48012f..e626134a8b 100644 --- a/vendor/golang.org/x/net/ipv4/zsys_linux_riscv64.go +++ b/vendor/golang.org/x/net/ipv4/zsys_linux_riscv64.go @@ -57,9 +57,6 @@ const ( sysSO_EE_ORIGIN_TXSTATUS = 0x4 sysSO_EE_ORIGIN_TIMESTAMPING = 0x4 - sysSOL_SOCKET = 0x1 - sysSO_ATTACH_FILTER = 0x1a - sizeofKernelSockaddrStorage = 0x80 sizeofSockaddrInet = 0x10 sizeofInetPktinfo = 0xc @@ -72,8 +69,6 @@ const ( sizeofGroupSourceReq = 0x108 sizeofICMPFilter = 0x4 - - sizeofSockFprog = 0x10 ) type kernelSockaddrStorage struct { @@ -137,15 +132,3 @@ type groupSourceReq struct { type icmpFilter struct { Data uint32 } - -type sockFProg struct { - Len uint16 - Filter *sockFilter -} - -type sockFilter struct { - Code uint16 - Jt uint8 - Jf uint8 - K uint32 -} diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_s390x.go b/vendor/golang.org/x/net/ipv4/zsys_linux_s390x.go index ee8204da46..a04e785187 100644 --- a/vendor/golang.org/x/net/ipv4/zsys_linux_s390x.go +++ b/vendor/golang.org/x/net/ipv4/zsys_linux_s390x.go @@ -55,9 +55,6 @@ const ( sysSO_EE_ORIGIN_TXSTATUS = 0x4 sysSO_EE_ORIGIN_TIMESTAMPING = 0x4 - sysSOL_SOCKET = 0x1 - sysSO_ATTACH_FILTER = 0x1a - sizeofKernelSockaddrStorage = 0x80 sizeofSockaddrInet = 0x10 sizeofInetPktinfo = 0xc @@ -70,8 +67,6 @@ const ( sizeofGroupSourceReq = 0x108 sizeofICMPFilter = 0x4 - - sizeofSockFprog = 0x10 ) type kernelSockaddrStorage struct { @@ -135,16 +130,3 @@ type groupSourceReq struct { type icmpFilter struct { Data uint32 } - -type sockFProg struct { - Len uint16 - Pad_cgo_0 [6]byte - Filter *sockFilter -} - -type sockFilter struct { - Code uint16 - Jt uint8 - Jf uint8 - K uint32 -} diff --git a/vendor/golang.org/x/net/ipv6/helper.go b/vendor/golang.org/x/net/ipv6/helper.go index f767b1f5dd..c2d508f9c3 100644 --- a/vendor/golang.org/x/net/ipv6/helper.go +++ b/vendor/golang.org/x/net/ipv6/helper.go @@ -15,7 +15,6 @@ var ( errMissingAddress = errors.New("missing address") errHeaderTooShort = errors.New("header too short") errInvalidConnType = errors.New("invalid conn type") - errNoSuchInterface = errors.New("no such interface") errNotImplemented = errors.New("not implemented on " + runtime.GOOS + "/" + runtime.GOARCH) ) diff --git a/vendor/golang.org/x/net/ipv6/sys_bpf.go b/vendor/golang.org/x/net/ipv6/sys_bpf.go index b2dbcb2f28..90ef4dfaf4 100644 --- a/vendor/golang.org/x/net/ipv6/sys_bpf.go +++ b/vendor/golang.org/x/net/ipv6/sys_bpf.go @@ -11,13 +11,14 @@ import ( "golang.org/x/net/bpf" "golang.org/x/net/internal/socket" + "golang.org/x/sys/unix" ) func (so *sockOpt) setAttachFilter(c *socket.Conn, f []bpf.RawInstruction) error { - prog := sockFProg{ + prog := unix.SockFprog{ Len: uint16(len(f)), - Filter: (*sockFilter)(unsafe.Pointer(&f[0])), + Filter: (*unix.SockFilter)(unsafe.Pointer(&f[0])), } - b := (*[sizeofSockFprog]byte)(unsafe.Pointer(&prog))[:sizeofSockFprog] + b := (*[unix.SizeofSockFprog]byte)(unsafe.Pointer(&prog))[:unix.SizeofSockFprog] return so.Set(c, b) } diff --git a/vendor/golang.org/x/net/ipv6/sys_linux.go b/vendor/golang.org/x/net/ipv6/sys_linux.go index bc218103c1..96e8093a30 100644 --- a/vendor/golang.org/x/net/ipv6/sys_linux.go +++ b/vendor/golang.org/x/net/ipv6/sys_linux.go @@ -11,6 +11,7 @@ import ( "golang.org/x/net/internal/iana" "golang.org/x/net/internal/socket" + "golang.org/x/sys/unix" ) var ( @@ -40,7 +41,7 @@ var ( ssoLeaveSourceGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_LEAVE_SOURCE_GROUP, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, ssoBlockSourceGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_BLOCK_SOURCE, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, ssoUnblockSourceGroup: {Option: socket.Option{Level: iana.ProtocolIPv6, Name: sysMCAST_UNBLOCK_SOURCE, Len: sizeofGroupSourceReq}, typ: ssoTypeGroupSourceReq}, - ssoAttachFilter: {Option: socket.Option{Level: sysSOL_SOCKET, Name: sysSO_ATTACH_FILTER, Len: sizeofSockFprog}}, + ssoAttachFilter: {Option: socket.Option{Level: unix.SOL_SOCKET, Name: unix.SO_ATTACH_FILTER, Len: unix.SizeofSockFprog}}, } ) diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_386.go b/vendor/golang.org/x/net/ipv6/zsys_linux_386.go index 14155dec21..bde4a8f8f5 100644 --- a/vendor/golang.org/x/net/ipv6/zsys_linux_386.go +++ b/vendor/golang.org/x/net/ipv6/zsys_linux_386.go @@ -84,9 +84,6 @@ const ( sysICMPV6_FILTER_BLOCKOTHERS = 0x3 sysICMPV6_FILTER_PASSONLY = 0x4 - sysSOL_SOCKET = 0x1 - sysSO_ATTACH_FILTER = 0x1a - sizeofKernelSockaddrStorage = 0x80 sizeofSockaddrInet6 = 0x1c sizeofInet6Pktinfo = 0x14 @@ -98,8 +95,6 @@ const ( sizeofGroupSourceReq = 0x104 sizeofICMPv6Filter = 0x20 - - sizeofSockFprog = 0x8 ) type kernelSockaddrStorage struct { @@ -155,16 +150,3 @@ type groupSourceReq struct { type icmpv6Filter struct { Data [8]uint32 } - -type sockFProg struct { - Len uint16 - Pad_cgo_0 [2]byte - Filter *sockFilter -} - -type sockFilter struct { - Code uint16 - Jt uint8 - Jf uint8 - K uint32 -} diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_amd64.go b/vendor/golang.org/x/net/ipv6/zsys_linux_amd64.go index 9566d76468..992ac9ec5f 100644 --- a/vendor/golang.org/x/net/ipv6/zsys_linux_amd64.go +++ b/vendor/golang.org/x/net/ipv6/zsys_linux_amd64.go @@ -84,9 +84,6 @@ const ( sysICMPV6_FILTER_BLOCKOTHERS = 0x3 sysICMPV6_FILTER_PASSONLY = 0x4 - sysSOL_SOCKET = 0x1 - sysSO_ATTACH_FILTER = 0x1a - sizeofKernelSockaddrStorage = 0x80 sizeofSockaddrInet6 = 0x1c sizeofInet6Pktinfo = 0x14 @@ -98,8 +95,6 @@ const ( sizeofGroupSourceReq = 0x108 sizeofICMPv6Filter = 0x20 - - sizeofSockFprog = 0x10 ) type kernelSockaddrStorage struct { @@ -157,16 +152,3 @@ type groupSourceReq struct { type icmpv6Filter struct { Data [8]uint32 } - -type sockFProg struct { - Len uint16 - Pad_cgo_0 [6]byte - Filter *sockFilter -} - -type sockFilter struct { - Code uint16 - Jt uint8 - Jf uint8 - K uint32 -} diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_arm.go b/vendor/golang.org/x/net/ipv6/zsys_linux_arm.go index 14155dec21..bde4a8f8f5 100644 --- a/vendor/golang.org/x/net/ipv6/zsys_linux_arm.go +++ b/vendor/golang.org/x/net/ipv6/zsys_linux_arm.go @@ -84,9 +84,6 @@ const ( sysICMPV6_FILTER_BLOCKOTHERS = 0x3 sysICMPV6_FILTER_PASSONLY = 0x4 - sysSOL_SOCKET = 0x1 - sysSO_ATTACH_FILTER = 0x1a - sizeofKernelSockaddrStorage = 0x80 sizeofSockaddrInet6 = 0x1c sizeofInet6Pktinfo = 0x14 @@ -98,8 +95,6 @@ const ( sizeofGroupSourceReq = 0x104 sizeofICMPv6Filter = 0x20 - - sizeofSockFprog = 0x8 ) type kernelSockaddrStorage struct { @@ -155,16 +150,3 @@ type groupSourceReq struct { type icmpv6Filter struct { Data [8]uint32 } - -type sockFProg struct { - Len uint16 - Pad_cgo_0 [2]byte - Filter *sockFilter -} - -type sockFilter struct { - Code uint16 - Jt uint8 - Jf uint8 - K uint32 -} diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_arm64.go b/vendor/golang.org/x/net/ipv6/zsys_linux_arm64.go index 9566d76468..992ac9ec5f 100644 --- a/vendor/golang.org/x/net/ipv6/zsys_linux_arm64.go +++ b/vendor/golang.org/x/net/ipv6/zsys_linux_arm64.go @@ -84,9 +84,6 @@ const ( sysICMPV6_FILTER_BLOCKOTHERS = 0x3 sysICMPV6_FILTER_PASSONLY = 0x4 - sysSOL_SOCKET = 0x1 - sysSO_ATTACH_FILTER = 0x1a - sizeofKernelSockaddrStorage = 0x80 sizeofSockaddrInet6 = 0x1c sizeofInet6Pktinfo = 0x14 @@ -98,8 +95,6 @@ const ( sizeofGroupSourceReq = 0x108 sizeofICMPv6Filter = 0x20 - - sizeofSockFprog = 0x10 ) type kernelSockaddrStorage struct { @@ -157,16 +152,3 @@ type groupSourceReq struct { type icmpv6Filter struct { Data [8]uint32 } - -type sockFProg struct { - Len uint16 - Pad_cgo_0 [6]byte - Filter *sockFilter -} - -type sockFilter struct { - Code uint16 - Jt uint8 - Jf uint8 - K uint32 -} diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_mips.go b/vendor/golang.org/x/net/ipv6/zsys_linux_mips.go index 14155dec21..bde4a8f8f5 100644 --- a/vendor/golang.org/x/net/ipv6/zsys_linux_mips.go +++ b/vendor/golang.org/x/net/ipv6/zsys_linux_mips.go @@ -84,9 +84,6 @@ const ( sysICMPV6_FILTER_BLOCKOTHERS = 0x3 sysICMPV6_FILTER_PASSONLY = 0x4 - sysSOL_SOCKET = 0x1 - sysSO_ATTACH_FILTER = 0x1a - sizeofKernelSockaddrStorage = 0x80 sizeofSockaddrInet6 = 0x1c sizeofInet6Pktinfo = 0x14 @@ -98,8 +95,6 @@ const ( sizeofGroupSourceReq = 0x104 sizeofICMPv6Filter = 0x20 - - sizeofSockFprog = 0x8 ) type kernelSockaddrStorage struct { @@ -155,16 +150,3 @@ type groupSourceReq struct { type icmpv6Filter struct { Data [8]uint32 } - -type sockFProg struct { - Len uint16 - Pad_cgo_0 [2]byte - Filter *sockFilter -} - -type sockFilter struct { - Code uint16 - Jt uint8 - Jf uint8 - K uint32 -} diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_mips64.go b/vendor/golang.org/x/net/ipv6/zsys_linux_mips64.go index 9566d76468..992ac9ec5f 100644 --- a/vendor/golang.org/x/net/ipv6/zsys_linux_mips64.go +++ b/vendor/golang.org/x/net/ipv6/zsys_linux_mips64.go @@ -84,9 +84,6 @@ const ( sysICMPV6_FILTER_BLOCKOTHERS = 0x3 sysICMPV6_FILTER_PASSONLY = 0x4 - sysSOL_SOCKET = 0x1 - sysSO_ATTACH_FILTER = 0x1a - sizeofKernelSockaddrStorage = 0x80 sizeofSockaddrInet6 = 0x1c sizeofInet6Pktinfo = 0x14 @@ -98,8 +95,6 @@ const ( sizeofGroupSourceReq = 0x108 sizeofICMPv6Filter = 0x20 - - sizeofSockFprog = 0x10 ) type kernelSockaddrStorage struct { @@ -157,16 +152,3 @@ type groupSourceReq struct { type icmpv6Filter struct { Data [8]uint32 } - -type sockFProg struct { - Len uint16 - Pad_cgo_0 [6]byte - Filter *sockFilter -} - -type sockFilter struct { - Code uint16 - Jt uint8 - Jf uint8 - K uint32 -} diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_mips64le.go b/vendor/golang.org/x/net/ipv6/zsys_linux_mips64le.go index 9566d76468..992ac9ec5f 100644 --- a/vendor/golang.org/x/net/ipv6/zsys_linux_mips64le.go +++ b/vendor/golang.org/x/net/ipv6/zsys_linux_mips64le.go @@ -84,9 +84,6 @@ const ( sysICMPV6_FILTER_BLOCKOTHERS = 0x3 sysICMPV6_FILTER_PASSONLY = 0x4 - sysSOL_SOCKET = 0x1 - sysSO_ATTACH_FILTER = 0x1a - sizeofKernelSockaddrStorage = 0x80 sizeofSockaddrInet6 = 0x1c sizeofInet6Pktinfo = 0x14 @@ -98,8 +95,6 @@ const ( sizeofGroupSourceReq = 0x108 sizeofICMPv6Filter = 0x20 - - sizeofSockFprog = 0x10 ) type kernelSockaddrStorage struct { @@ -157,16 +152,3 @@ type groupSourceReq struct { type icmpv6Filter struct { Data [8]uint32 } - -type sockFProg struct { - Len uint16 - Pad_cgo_0 [6]byte - Filter *sockFilter -} - -type sockFilter struct { - Code uint16 - Jt uint8 - Jf uint8 - K uint32 -} diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_mipsle.go b/vendor/golang.org/x/net/ipv6/zsys_linux_mipsle.go index 14155dec21..bde4a8f8f5 100644 --- a/vendor/golang.org/x/net/ipv6/zsys_linux_mipsle.go +++ b/vendor/golang.org/x/net/ipv6/zsys_linux_mipsle.go @@ -84,9 +84,6 @@ const ( sysICMPV6_FILTER_BLOCKOTHERS = 0x3 sysICMPV6_FILTER_PASSONLY = 0x4 - sysSOL_SOCKET = 0x1 - sysSO_ATTACH_FILTER = 0x1a - sizeofKernelSockaddrStorage = 0x80 sizeofSockaddrInet6 = 0x1c sizeofInet6Pktinfo = 0x14 @@ -98,8 +95,6 @@ const ( sizeofGroupSourceReq = 0x104 sizeofICMPv6Filter = 0x20 - - sizeofSockFprog = 0x8 ) type kernelSockaddrStorage struct { @@ -155,16 +150,3 @@ type groupSourceReq struct { type icmpv6Filter struct { Data [8]uint32 } - -type sockFProg struct { - Len uint16 - Pad_cgo_0 [2]byte - Filter *sockFilter -} - -type sockFilter struct { - Code uint16 - Jt uint8 - Jf uint8 - K uint32 -} diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_ppc.go b/vendor/golang.org/x/net/ipv6/zsys_linux_ppc.go index a51e142b42..66fd236121 100644 --- a/vendor/golang.org/x/net/ipv6/zsys_linux_ppc.go +++ b/vendor/golang.org/x/net/ipv6/zsys_linux_ppc.go @@ -84,9 +84,6 @@ const ( sysICMPV6_FILTER_BLOCKOTHERS = 0x3 sysICMPV6_FILTER_PASSONLY = 0x4 - sysSOL_SOCKET = 0x1 - sysSO_ATTACH_FILTER = 0x1a - sizeofKernelSockaddrStorage = 0x80 sizeofSockaddrInet6 = 0x1c sizeofInet6Pktinfo = 0x14 @@ -98,8 +95,6 @@ const ( sizeofGroupSourceReq = 0x104 sizeofICMPv6Filter = 0x20 - - sizeofSockFprog = 0x8 ) type kernelSockaddrStorage struct { @@ -155,16 +150,3 @@ type groupSourceReq struct { type icmpv6Filter struct { Data [8]uint32 } - -type sockFProg struct { - Len uint16 - Pad_cgo_0 [2]byte - Filter *sockFilter -} - -type sockFilter struct { - Code uint16 - Jt uint8 - Jf uint8 - K uint32 -} diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_ppc64.go b/vendor/golang.org/x/net/ipv6/zsys_linux_ppc64.go index 9566d76468..992ac9ec5f 100644 --- a/vendor/golang.org/x/net/ipv6/zsys_linux_ppc64.go +++ b/vendor/golang.org/x/net/ipv6/zsys_linux_ppc64.go @@ -84,9 +84,6 @@ const ( sysICMPV6_FILTER_BLOCKOTHERS = 0x3 sysICMPV6_FILTER_PASSONLY = 0x4 - sysSOL_SOCKET = 0x1 - sysSO_ATTACH_FILTER = 0x1a - sizeofKernelSockaddrStorage = 0x80 sizeofSockaddrInet6 = 0x1c sizeofInet6Pktinfo = 0x14 @@ -98,8 +95,6 @@ const ( sizeofGroupSourceReq = 0x108 sizeofICMPv6Filter = 0x20 - - sizeofSockFprog = 0x10 ) type kernelSockaddrStorage struct { @@ -157,16 +152,3 @@ type groupSourceReq struct { type icmpv6Filter struct { Data [8]uint32 } - -type sockFProg struct { - Len uint16 - Pad_cgo_0 [6]byte - Filter *sockFilter -} - -type sockFilter struct { - Code uint16 - Jt uint8 - Jf uint8 - K uint32 -} diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_ppc64le.go b/vendor/golang.org/x/net/ipv6/zsys_linux_ppc64le.go index 9566d76468..992ac9ec5f 100644 --- a/vendor/golang.org/x/net/ipv6/zsys_linux_ppc64le.go +++ b/vendor/golang.org/x/net/ipv6/zsys_linux_ppc64le.go @@ -84,9 +84,6 @@ const ( sysICMPV6_FILTER_BLOCKOTHERS = 0x3 sysICMPV6_FILTER_PASSONLY = 0x4 - sysSOL_SOCKET = 0x1 - sysSO_ATTACH_FILTER = 0x1a - sizeofKernelSockaddrStorage = 0x80 sizeofSockaddrInet6 = 0x1c sizeofInet6Pktinfo = 0x14 @@ -98,8 +95,6 @@ const ( sizeofGroupSourceReq = 0x108 sizeofICMPv6Filter = 0x20 - - sizeofSockFprog = 0x10 ) type kernelSockaddrStorage struct { @@ -157,16 +152,3 @@ type groupSourceReq struct { type icmpv6Filter struct { Data [8]uint32 } - -type sockFProg struct { - Len uint16 - Pad_cgo_0 [6]byte - Filter *sockFilter -} - -type sockFilter struct { - Code uint16 - Jt uint8 - Jf uint8 - K uint32 -} diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_riscv64.go b/vendor/golang.org/x/net/ipv6/zsys_linux_riscv64.go index 1ee237b2b7..6083ddcedc 100644 --- a/vendor/golang.org/x/net/ipv6/zsys_linux_riscv64.go +++ b/vendor/golang.org/x/net/ipv6/zsys_linux_riscv64.go @@ -86,9 +86,6 @@ const ( sysICMPV6_FILTER_BLOCKOTHERS = 0x3 sysICMPV6_FILTER_PASSONLY = 0x4 - sysSOL_SOCKET = 0x1 - sysSO_ATTACH_FILTER = 0x1a - sizeofKernelSockaddrStorage = 0x80 sizeofSockaddrInet6 = 0x1c sizeofInet6Pktinfo = 0x14 @@ -100,8 +97,6 @@ const ( sizeofGroupSourceReq = 0x108 sizeofICMPv6Filter = 0x20 - - sizeofSockFprog = 0x10 ) type kernelSockaddrStorage struct { @@ -159,15 +154,3 @@ type groupSourceReq struct { type icmpv6Filter struct { Data [8]uint32 } - -type sockFProg struct { - Len uint16 - Filter *sockFilter -} - -type sockFilter struct { - Code uint16 - Jt uint8 - Jf uint8 - K uint32 -} diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_s390x.go b/vendor/golang.org/x/net/ipv6/zsys_linux_s390x.go index 9566d76468..992ac9ec5f 100644 --- a/vendor/golang.org/x/net/ipv6/zsys_linux_s390x.go +++ b/vendor/golang.org/x/net/ipv6/zsys_linux_s390x.go @@ -84,9 +84,6 @@ const ( sysICMPV6_FILTER_BLOCKOTHERS = 0x3 sysICMPV6_FILTER_PASSONLY = 0x4 - sysSOL_SOCKET = 0x1 - sysSO_ATTACH_FILTER = 0x1a - sizeofKernelSockaddrStorage = 0x80 sizeofSockaddrInet6 = 0x1c sizeofInet6Pktinfo = 0x14 @@ -98,8 +95,6 @@ const ( sizeofGroupSourceReq = 0x108 sizeofICMPv6Filter = 0x20 - - sizeofSockFprog = 0x10 ) type kernelSockaddrStorage struct { @@ -157,16 +152,3 @@ type groupSourceReq struct { type icmpv6Filter struct { Data [8]uint32 } - -type sockFProg struct { - Len uint16 - Pad_cgo_0 [6]byte - Filter *sockFilter -} - -type sockFilter struct { - Code uint16 - Jt uint8 - Jf uint8 - K uint32 -} diff --git a/vendor/golang.org/x/net/publicsuffix/table.go b/vendor/golang.org/x/net/publicsuffix/table.go index c1347ced4d..369e44656a 100644 --- a/vendor/golang.org/x/net/publicsuffix/table.go +++ b/vendor/golang.org/x/net/publicsuffix/table.go @@ -2,7 +2,7 @@ package publicsuffix -const version = "publicsuffix.org's public_suffix_list.dat, git revision 6f03f42a65d006c8ae657f125f14fb8f9d3337f4 (2019-05-31T16:38:49Z)" +const version = "publicsuffix.org's public_suffix_list.dat, git revision 7922d7c20e246552be418e8f72e577899fd30d99 (2020-02-18T23:18:19Z)" const ( nodesBitsChildren = 10 @@ -23,486 +23,488 @@ const ( ) // numTLD is the number of top level domains. -const numTLD = 1539 +const numTLD = 1528 // Text is the combined text of all labels. -const text = "9guacuiababia-goracleaningroks-theatree164-baltimore-og-romsdali" + - "payboltateshinanomachimkentateyamagrocerybnikeisenbahnatuurweten" + - "schappenaumburggfarmerseineastcoastaldefenceatonsbergjemnes3-ap-" + - "southeast-2ix4432-balsfjordd-dnsiskinkyotobetsulikes-piedmontice" + - "llodingenaturhistorisches3-ap-south-16-b-datainaioirasebastopolo" + - "gyeongnamegawakembuchikumagayagawakkanaibetsubamericanfamilydscl" + - "oudeitychyattorneyagawakayamadridvagsoyereplanetariumemsettsuppo" + - "rtashkentatamotors3-ap-northeast-2038bloxcms3-website-us-east-1b" + - "luedancebmoattachments3-website-us-west-1bms3-website-us-west-2b" + - "mwegroweibolognagasakimobetsuitaipeiheijindianmarketinglitchasel" + - "jeepsongdalenviknagatorockartuzyuzawabnpparibaselburgliwicebnrwe" + - "irbomloabathsbcatholicaxiashorokanaiebondray-dnsupdaternopilawat" + - "ches5ybonnishiharabookinghostfoldnavyboomlahppiacenzachpomorskie" + - "nishiizunazukindigenaklodzkochikushinonsenergyboschaefflerdalimi" + - "tedrayddnsfreebox-osascoli-picenordre-landraydnsakyotanabellunor" + - "d-aurdalvdalaskanittedallasalleangaviikaascolipicenoduminamidait" + - "omandalimoldeloittemp-dnsalangenishikatakazakindustriabostikarel" + - "iancebostonakijinsekikogentinglobalashovhachinohedmarkariyamelbo" + - "urnebotanicalgardenishikatsuragit-reposalondonetskarlsoybotanicg" + - "ardenishikawazukamisunagawabotanybouncemerckmsdnipropetrovskjerv" + - "oyagebounty-fullensakerrypropertiesaltdalinkyard-cloudnsaludrive" + - "fsnillfjordrobaknoluoktagajobojindustriesteamfamberkeleyboutique" + - "becheltenham-radio-openairbusantiquest-a-la-maisondre-landroidru" + - "dunsalvadordalibabalestrandabergamo-siemensncfdupontariodejaneir" + - "odoybozen-sudtirolivornobozen-suedtirolombardynaliaskimitsubatam" + - "ibugattiffanynysadoes-itvedestrandurbanamexnetlifyinfinitintuitj" + - "omemorialomzaporizhzhegurinuyamashinatsukigatakasakitchenishimer" + - "abplacedogawarabikomaezakirunorddalondrinamsskoganeinvestmentsal" + - "zburgloboavistaprintelligencebrandywinevalleybrasiliabrindisiben" + - "ikinderoybristoloseyouriparliamentjxfinitybritishcolumbialowieza" + - "ganquanpachigasakievennodesabaerobaticketsamegawabroadcastlecler" + - "chernihivgubananarepublicasadelamonedatingjesdalavangenayorovnoc" + - "eanographics3-fips-us-gov-west-1broadwaybroke-itkmaxxjavald-aost" + - "aplesamnangerbrokerbronnoysundurhamburglogowfarmsteadweberbrothe" + - "rmesaverdealstahaugesunderseaportsinfolldalorenskogloppenzaolbia" + - "-tempio-olbiatempioolbialystokkepnogataijinzais-a-candidatebrows" + - "ersafetymarketsampalacebrumunddalotenkawabrunelasticbeanstalkarm" + - "oybrusselsamsclubartowhalinglugmbhartipscbgminakamichiharabruxel" + - "lesamsungmodalenishinomiyashironobryansklepparmattelefonicarboni" + - "a-iglesias-carboniaiglesiascarboniabrynewjerseybuskerudinewportl" + - "ligatksatxn--0trq7p7nnishinoomotegobuzentsujiiebuzzlgmxn--11b4c3" + - "dynathomebuiltmparochernigovernmentoyosatoyokawabwhoswhokksundyn" + - "dns-at-homedepotenzamamidsundyndns-at-workisboringrimstadyndns-b" + - "logdnsandnessjoenishinoshimatsuurabzhitomirumalatvuopmicrolighti" + - "ngripebzzparsandoycolognexus-2colonialwilliamsburgrongausdalucan" + - "iacoloradoplateaudiocolumbusheycommunecommunitycomoarekecomparem" + - "arkerryhotelsaobernardocompute-1computerhistoryofscience-fiction" + - "comsecuritytacticsaogoncartiercondoshichinohealth-carereforminam" + - "iiselectraniandriabarlettatraniandriaconferenceconstructionconsu" + - "ladonnakamagayahabaghdadyndns-wikirkenesaotomembersapporoconsult" + - "anthropologyconsultingrossetouchihayaakasakawaharacontactranoyco" + - "ntagematsubaracontemporaryarteducationalchikugodaddyn-vpndnsarde" + - "gnaroycontractorskenconventureshinodebalancertificationcookingch" + - "annelsdvrdnsfor-better-thanawatchandclockashiharacooluccapitalon" + - "ewspapercooperativano-frankivskolegallocus-3copenhagencyclopedic" + - "hiryukyuragifuchungbukharaumalborkarpaczeladzwiiheyakumoduminami" + - "echizenishiokoppegardyndns-freeboxosloftranakanojoetsuwanouchiku" + - "jogaszkolajollamericanexpressexycorsicafederationcorvettemasekas" + - "hiwaracosenzakopanecosidnshome-webserverdalucernecostumedio-camp" + - "idano-mediocampidanomediocouchpotatofriesardiniacouncilukowildli" + - "fedorainfraclouderacouponsarluroycq-acranbrookuwanalyticsarpsbor" + - "groundhandlingroznycrdyndns-workshoppingrpasadenarashinocreditca" + - "rdyndns1creditunioncremonashgabadaddjaguarqhachirogatakanezawacr" + - "ewilliamhillutskashiwazakiyosatokamachintaifun-dnsdojolstercrick" + - "etrzyncrimeast-kazakhstanangercrotonecrownipassagensarufutsunomi" + - "yawakasaikaitakoelncrsvpassenger-associationcruisesasayamacrypto" + - "nomichigangwoncuisinellair-traffic-controlleyculturalcentertainm" + - "entransportecuneocupcakecuritibahcavuotnagaivuotnagaokakyotambab" + - "yeniwaizumiotsukumiyamazonawsagaeroclubmedecincinnationwidealeri" + - "mo-i-ranaamesjevuemielno-ipifonychitachinakagawashtenawdev-myqna" + - "pcloudcontrolledekagaminogiftsandvikcoromantovalle-d-aostathelle" + - "cxn--12c1fe0bradescorporationcymrussiacyonabaruminamiizukamiokam" + - "eokameyamatotakadacyoutheworkpccwinbanzaicloudcontrolappleborkda" + - "lpha-myqnapcloud66ferrerotikagoshimalselvendrelluzernfetsundynse" + - "rvebbsaskatchewanfguitarsavannahgafhvalerfidoomdnstracefieldynuc" + - "onnectransurluxembourgruefigueresinstagingujohanamakinoharafilat" + - "eliafilegear-audnedalnfilegear-deatnurembergulenfilegear-gbizfil" + - "egear-iefilegear-jpmorganfilegear-sgunmaoris-a-financialadvisor-" + - "aurdalvivanovoldafilminamiminowafinalfinancefineartsaves-the-wha" + - "lessandria-trani-barletta-andriatranibarlettaandriafinlandynv6fi" + - "nnoyfirebaseapplinzis-a-geekasukabedzin-berlindasdaburfirenzefir" + - "estonefirmdalegokasells-itravelchannelfishingoldpoint2thisamitsu" + - "kefitjarvodkafjordynvpnplus-4fitnessettlementravelersinsurancefj" + - "alerflesberguovdageaidnulminamioguni5flickragerogersavonarusawaf" + - "lightsaxoflirfloginlinefloraflorencefloridattorelayfloripaderbor" + - "nfloristanohatakahamalvikasumigaurawa-mazowszextraspace-to-renta" + - "lstomakomaibaraflorokunohealthcareerschoenbrunnflowerschokokeksc" + - "hokoladenfltrdyroyrvikinguidegreeflynnhosting-clusterflynnhubarc" + - "laycards3-sa-east-1fndfor-ourfor-someeresistancefor-theaterforex" + - "rothadanorthwesternmutualforgotdnscholarshipschoolforli-cesena-f" + - "orlicesenaforlikescandyn53forsaleikangerforsandasuologoipatriafo" + - "rtalfortmissoulancashirecreationfortworthadselfipaviancarrdforum" + - "zfosneschulefotaris-a-greenfoxfordebianfozorafredrikstadtvschwar" + - "zgwangjuniperfreeddnsgeekgalaxyfreedesktopocznore-og-uvdalfreema" + - "sonryfreesitevadsoccertmgretakahashimamakirovogradoyfreetlschwei" + - "zfreiburgushikamifuranorth-kazakhstanfreightrentin-sud-tirolfres" + - "eniuscountryestateofdelawarezzoologyfribourgwiddleitungsenfriuli" + - "-v-giuliafriuli-ve-giuliafriuli-vegiuliafriuli-venezia-giuliafri" + - "uli-veneziagiuliafriuli-vgiuliafriuliv-giuliafriulive-giuliafriu" + - "livegiuliafriulivenezia-giuliafriuliveneziagiuliafriulivgiuliafr" + - "lfrogansciencecentersciencehistoryfrognfrolandfrom-akrehamnfrom-" + - "alfrom-arfrom-azimuthdfcbankasuyanagawafrom-capebretonamicrosoft" + - "bankaszubyfrom-codyn-o-saurlandescientistordalfrom-ctrentin-sudt" + - "irolfrom-dchitosetogitsuldalottefrom-dedyn-berlincolnfrom-flande" + - "rscjohnsonfrom-gaulardalfrom-hichisochildrensgardenfrom-iafrom-i" + - "dfrom-ilfrom-in-brbarclays3-us-east-2from-kscotlandfrom-kyowaria" + - "sahikawawindmillfrom-lancasterfrom-mamurogawafrom-mdfrom-meethno" + - "logyfrom-mifunefrom-mnfrom-mochizukiryuohdattowebcampinashikimin" + - "ohostre-totendofinternet-dnsaliasiafrom-mscrapper-sitefrom-mtnfr" + - "om-nctulanciafrom-ndfrom-nefrom-nh-serveblogsiteleafamilycompany" + - "minamisanrikubetsurfastly-terrariuminamimakis-a-designerfrom-nja" + - "worznoticiasnesoddenmarkhangelskjakdnepropetrovskiervaapsteierma" + - "rkatowicefrom-nminamitanefrom-nvalled-aostavangerfrom-nyfrom-ohk" + - "urafrom-oketogurafrom-orfrom-padovaksdalfrom-pratohmangolffanscr" + - "appingxn--12co0c3b4evalleaostaticscrysechocolatelemarkaruizawafr" + - "om-ris-a-gurulvikatsushikabeeldengeluidfrom-schmidtre-gauldalfro" + - "m-sdfrom-tnfrom-txn--1ck2e1barefootballfinanzgoraustraliaisondri" + - "obranconagawalbrzycharitysfjordds3-eu-west-1from-utazuerichardli" + - "llehammerfeste-ipfizerfrom-val-daostavalleyfrom-vtrentin-sued-ti" + - "rolfrom-wafrom-wielunnerfrom-wvalledaostavernfrom-wyfrosinonefro" + - "stalowa-wolawafroyahooguyfstcgroupgfoggiafujiiderafujikawaguchik" + - "onefujiminokamoenairlinedre-eikerfujinomiyadavvenjargap-northeas" + - "t-3fujiokayamangyshlakasamatsudovre-eikerfujisatoshonairportland" + - "-4-salernoboribetsuckserveminecraftrentin-suedtirolfujisawafujis" + - "hiroishidakabiratoridefensells-for-lesservemp3fujitsurugashimani" + - "wakuratexaskoyabearalvahkihokumakogengerdalcesurancechirealmpmnf" + - "ujixeroxn--1ctwolominamataobaomoriguchiharagusartservep2pharmaci" + - "enservepicservequakefujiyoshidavvesiidatsunanjoburgfukayabeatser" + - "vesarcasmatartanddesignfukuchiyamadazaifudaigodontexistmein-iser" + - "vebeerfukudominichofunatoriginstitutelevisionishitosashimizunami" + - "namibosogndalottokonamegatakatsukis-a-catererfukuis-a-hard-worke" + - "rservicesevastopolefukumitsubishigakisarazurecontainerdpolicefuk" + - "uokazakishiwadafukuroishikarikaturindalfukusakisofukushimannorfo" + - "lkebibleirfjordfukuyamagatakahatakaishimogosenfunabashiriuchinad" + - "afunagatakamatsukawafunahashikamiamakusatsumasendaisennangonohej" + - "is-a-hunterfundaciofuoiskujukuriyamansionsevenassisicilyfuosskoc" + - "zowindowsewinnersharis-a-knightpointtohobby-sitefurnitureggio-ca" + - "labriafurubirafurudonostiaafurukawairtelebitballooningfusodegaur" + - "afussaikisosakitagawafutabayamaguchinomigawafutboldlygoingnowher" + - "e-for-morenakatombetsumitakagiizefuttsurugimperiafuturecmsharpha" + - "rmacyshawaiijimarnardalfuturehostingfuturemailingfvgfylkesbiblac" + - "kbaudcdn77-securebungoonord-odalwaysdatabaseballangenoamishirasa" + - "tochigiessensiositelekommunikationionjukudoyamaintenanceofyresda" + - "lhangglidinghangoutsystemscloudyclusterhannanmokuizumodellinghan" + - "nosegawahanyuzenhapmirhareidsbergenharstadharvestcelebrationhasa" + - "marburghasaminami-alpshimojis-a-liberalhashbanghasudahasura-apph" + - "dhasvikatsuyamarylandhatogayaizuwakamatsubushikusakadogawahatoya" + - "mazakitakamiizumisanofidelityhatsukaichikaiseis-a-libertarianhat" + - "tfjelldalhayashimamotobungotakadapliernewmexicoalhazuminobusells" + - "yourhomegoodshimokawahelsinkitakatakaokalmykiahembygdsforbundhem" + - "neshimokitayamahemsedalhepforgeherokussldheroyhgtvallee-aosteroy" + - "higashiagatsumagoianiahigashichichibunkyonanaoshimageandsoundand" + - "visionhigashihiroshimanehigashiizumozakitakyushuaiahigashikagawa" + - "higashikagurasoedahigashikawakitaaikitamihamadahigashikurumeguro" + - "roshimonitayanagithubusercontentrentino-a-adigehigashimatsushima" + - "rcheapigeelvinckaufenhigashimatsuyamakitaakitadaitoigawahigashim" + - "urayamamotorcycleshimonosekikawahigashinarusembokukitamotosumy-g" + - "atewayhigashinehigashiomihachimanaustdalhigashiosakasayamanakako" + - "gawahigashishirakawamatakarazukaluganskypehigashisumiyoshikawami" + - "namiaikitanakagusukumodenakayamaritimodernhigashitsunoshiroomura" + - "higashiurausukitashiobarahigashiyamatokoriyamanashifteditchyouri" + - "philadelphiaareadmyblogspotrentino-aadigehigashiyodogawahigashiy" + - "oshinogaris-a-linux-useranishiaritabashijonawatehiraizumisatohno" + - "shoooshikamaishimodatehirakatashinagawahiranairtrafficplexus-1hi" + - "rarahiratsukagawahirayakagehistorichouseshimosuwalkis-a-llamarri" + - "ottrentino-alto-adigehitachiomiyagildeskaliszhitachiotagooglecod" + - "espotaruis-a-musicianhitraeumtgeradelmenhorstalbanshimotsukehjar" + - "tdalhjelmelandholeckobierzyceholidayhomeiphilatelyhomelinkitools" + - "ztynsettlershimotsumahomelinuxn--1lqs03nhomeofficehomesecurityma" + - "caparecidahomesecuritypchonanbulsan-suedtirolouvreisenishiwakis-" + - "a-celticsfanissandiegohomesenseminehomeunixn--1lqs71dhondahoneyw" + - "ellbeingzonehongoppdalhonjyoitakasagotembaixadahornindalhorseoul" + - "lensvanguardhorteneis-a-nascarfanhospitalhoteleshinichinanhotmai" + - "lhoyangerhoylandetroitskautokeinotteroyhumanitieshinjournalismai" + - "lillesandefjordhurdalhurumajis-a-nurservegame-serverhyllestadhyo" + - "goris-a-painteractivegaskvollhyugawarahyundaiwafuneis-very-sweet" + - "pepperis-with-thebandoisleofmanchesterjewelryjewishartgalleryjfk" + - "fhappounzenjgorajlljmphonefosshioyanaizuslivinghistoryjnjcphoeni" + - "xn--1qqw23ajoyentrentino-stiroljoyokaichibalatinoipirangamvikhak" + - "assiajpnjprshirahamatonbetsurnadaljurkoseis-a-photographerokuapp" + - "hilipsyno-dshinjukumanowtvallee-d-aosteigenkosherbrookegawakoshi" + - "mizumakiyosunndalkoshunantankharkovalleedaostekosugekotohiradoma" + - "insureggioemiliaromagnamsosnowiechoseiroumuenchenissayokkaichiro" + - "practichernivtsiciliakotourakouhokutamakizunokunimimatakatoris-a" + - "-playerkounosupplieshiranukamitsuekouyamashikekouzushimashikis-a" + - "-republicancerresearchaeologicaliforniakozagawakozakis-a-rocksta" + - "rachowicekozowioshiraois-a-socialistdlibestadkpnkppspdnshiraokam" + - "ogawakrasnikahokutokashikis-a-soxfankrasnodarkredstonekristiansa" + - "ndcatshiratakahagitlaborkristiansundkrodsheradkrokstadelvaldaost" + - "arnbergkryminamiuonumassa-carrara-massacarraramassabusinessebykl" + - "ecznagasukekumatorinokumejimasoykumenantokigawakunisakis-a-stude" + - "ntalkunitachiarailwaykunitomigusukumamotoyamashikokuchuokunneppu" + - "eblockbustermezkunstsammlungkunstunddesignkuokgroupictetrentino-" + - "sud-tirolkurehabmerkurgankurobelaudibleasingleshishikuis-a-teach" + - "erkassyncloudkurogiminamiashigarakuroisoftwarendalenugkuromatsun" + - "ais-a-techietis-a-patsfankurotakikawasakis-a-therapistoiakushiro" + - "gawakustanais-an-accountantshinkamigotoyohashimototalkusupplykut" + - "chanelkutnokuzumakis-an-actorkvafjordkvalsundkvamlidlugolekadena" + - "gahamaroygardenebakkeshibechambagriculturennebudejjuedischesapea" + - "kebayernuorochesterkvanangenkvinesdalkvinnheradkviteseidskogkvit" + - "soykwpspectruminamiyamashirokawanabelembetsukubankhersonkzmisugi" + - "tokorozawamitourismolangevagrigentomologyeonggiehtavuoatnadexete" + - "rmitoyoakemiuramiyazurewebsiteshikagamiishibukawamiyotamanomjond" + - "alenmlbfanmombetsurgeonshalloffamelhusdecorativeartshisuifuelver" + - "uminanomonstermontrealestatefarmequipmentrentino-sued-tirolmonza" + - "-brianzapposhitaramamonza-e-della-brianzaptokuyamatsumotofukemon" + - "zabrianzaramonzaebrianzamonzaedellabrianzamoonscalevangermoparac" + - "hutingmordoviamoriyamatsunomoriyoshiminamiawajikis-an-artistgory" + - "mormonmouthagakhanamigawamoroyamatsusakahoginankokubunjis-an-eng" + - "ineeringmortgagemoscowitdkhmelnitskiyamarylhurstjordalshalsenmos" + - "eushistorymosjoenmoskeneshizukuishimofusaitamatsukuris-an-entert" + - "ainermosshizuokanagawamosvikhmelnytskyivanylvenicemoteginowaniih" + - "amatamakawajimanxn--2scrj9choshibuyachtsanfranciscofreakunemuror" + - "angeiseiyoichippubetsubetsugarugbydgoszczecinemagentositecnologi" + - "amoviemovimientokyotangotsukitahatakamoriokakegawamovistargardmo" + - "zilla-iotrentino-suedtirolmtranbymuenstermuginozawaonsenmuikamis" + - "atokaizukamikitayamatsuris-bytomaritimekeepingmukodairamulhouser" + - "vehalflifestylewismillermunakatanemuncienciamuosattemupicturesho" + - "ujis-certifieducatorahimeshimamateramobaramurmanskhplaystationmu" + - "rotorcraftrentinoa-adigemusashimurayamatsushigemusashinoharamuse" + - "etrentinoaadigemuseumverenigingmusicargoboatshowamutsuzawamy-vig" + - "orgemy-wanggouvichoyodobashichikashukujitawaravennaharimalopolsk" + - "anlandyndns-homednsangomyactivedirectorymyasustor-elvdalmycdn77-" + - "sslattumincomcastresindevicenzaporizhzhiamydattolocalhistorymydd" + - "nskingmydissentrentinoalto-adigemydobisshikis-foundationmydroboe" + - "hringerikemydshowtimemergencyahikobeardubaiduckdnshriramsterdamn" + - "serverbaniamyeffectrentinoaltoadigemyfirewallonieruchomosciencea" + - "ndindustrynmyfritzmyftpaccessienarutolgamyhome-servermyjinomykol" + - "aivaomymailermymediapchristiansburgriwataraidyndns-ipartis-a-che" + - "farsundyndns-mailowiczest-le-patronissedalplfinancialpuserconten" + - "toyotapartsanjotoyotomiyazakis-a-conservativegarsheis-a-cpaduals" + - "tackhero-networkinggroupartymyokohamamatsudamypepiemontemypetsig" + - "dalmyphotoshibalena-devicesilklabudhabikinokawabarthaebaruericss" + - "onyoursidell-ogliastradermypiagetmyiphostrodawaramypsxn--30rr7ym" + - "ysecuritycamerakermyshopblocksimple-urlmytis-a-bookkeeperugiamyt" + - "uleapilotsirdalmyvnchristmasakindlefrakkestadyndns-office-on-the" + - "-webhopencraftoyotsukaidomywireitrentinos-tirolpiszpittsburghoff" + - "icialpiwatepixolinopizzapknx-serversailleshirakofuefukihaboromsk" + - "ogplantationplantsjcbnlplatformshangrilanslupskolobrzegersundpla" + - "zaplcube-serversicherungplumbingoplurinacionalpodhalezajskomagan" + - "epodlasiellaktyubinskiptveterinaireadthedocscappgafannefrankfurt" + - "rentinosud-tirolpodzonepohlpoivronpokerpokrovskomakiyosemitepoli" + - "ticarrierpolitiendapolkowicepoltavalle-aostarostwodzislawithgoog" + - "leapisa-hockeynutsiracusakatakkoebenhavnpomorzeszowithyoutubersp" + - "acekitagatamayufuettertdasnetzponpesaro-urbino-pesarourbinopesar" + - "omasvuotnaritakurashikis-goneponypordenonepornporsangerporsangug" + - "eporsgrunnanyokoshibahikariwanumatakinouepoznanpraxis-a-bruinsfa" + - "nprdpreservationpresidioprgmrprimeloyalistorageprincipeprivatize" + - "healthinsuranceprochowiceproductionslzprofesionalprogressivennes" + - "laskerrylogisticsnoasaitoshimayfirstockholmestrandpromomahachijo" + - "invilleksvikomatsushimasfjordenpropertyprotectionprotonetrentino" + - "sudtirolprudentialpruszkowiwatsukiyonotairestaurantrentinosued-t" + - "irolprvcyberlevagangaviikanonjis-into-animeiwamarshallstatebanka" + - "zoprzeworskogptplusgardenpupimientaketomisatomobellevuelosangele" + - "sjabbottrentinostirolpvhagebostadpvtrentinosuedtirolpwchromedici" + - "nakaiwamizawassamukawataricoharuovatoyourapzqldqponiatowadaqslin" + - "gquicksytestingquipelementsokananiimihoboleslawiechryslerqvchung" + - "namdalseidfjordyndns-picsannanisshingucciprianiigataishinomakink" + - "obayashikaoirmitakeharasuzakanazawasuzukaneyamazoesuzukis-into-g" + - "amessinazawasvalbardunloppacificircleverappsseljordyndns-webhost" + - "ingroks-thisayamanobeokakudamatsuesveiosvelvikomonowruzhgorodeos" + - "vizzerasvn-reposomnarviikamishihoronobeauxartsandcraftsolarssons" + - "wedenswidnicartoonartdecologiaswidnikkokaminokawanishiaizubanges" + - "wiebodzin-butterswiftcoverswinoujscienceandhistoryswissmartertha" + - "nyousrcfastpanelblagrarchaeologyeongbuk0emmafann-arboretumbriama" + - "llamaceiobbcg120001wwwebspace12hpalermoliserniabogadodgehirnrt3l" + - "3p0rtarnobrzegyptian4tarumizusawabruzzoologicalvinklein-addramme" + - "nuernbergdyniaetnabudapest-a-la-masion-webredirectmedicaltanisse" + - "ttachikawafflecellclaims3-ap-northeast-1337synology-diskstations" + - "ynology-dsootunesor-varangertunkomorotsukaminoyamaxunjargaturyst" + - "ykanmakiwientuscanytushuissier-justicetuvalle-daostatic-accessor" + - "foldtuxfamilytwmailvestfoldvestnesorocabalsan-sudtirollagdenesna" + - "aseralingenkainanaejrietisalatinabenonichurcharternidyndns-remot" + - "ewdyndns-serverisigniyodogawavestre-slidrepbodynamic-dnsorreisah" + - "ayakawakamiichikawamisatottoris-into-carshinshirovestre-totennis" + - "hiawakuravestvagoyvevelstadvibo-valentiavibovalentiavideovillaso" + - "rtlandvinnicasacamdvrcampinagrandebuilderschlesischesoruminiserv" + - "ervinnytsiavirginiavirtual-userveexchangevirtualservervirtualuse" + - "rveftpioneervirtueeldomein-vigorlicevirtuelvisakegawaviterboknow" + - "sitallvivolkenkundenvixn--32vp30haibarakitahiroshimapartmentshel" + - "laspeziavlaanderenvladikavkazimierz-dolnyvladimirvlogintoyonezaw" + - "avminnesotaketakayamasudavologdanskomvuxn--2m4a15evolvolkswagent" + - "soundcastronomy-routervolyngdalvoorloperauniterois-leetnedalvoss" + - "evangenvotevotingvotoyonownextdirectrentoyonakagyokutoyakokonoew" + - "orldworse-thandawowloclawekongsbergwpcomstagingwpdevcloudwritest" + - "hisblogsytewroclawmflabsouthcarolinarvikommunalforbundwtcmintern" + - "ationalfirearmshisognewtfastvps-serveronakasatsunairguardiannaka" + - "domarinebraskauniversitydalaheadjudaicable-modemocraciawuozustka" + - "nnamilanotogawawzmiuwajimaxn--3pxu8kongsvingerxn--42c2d9axn--45b" + - "r5cylxn--45brj9cistrondheimmobilienxn--45q11citadeliveryggeexn--" + - "4gbriminingxn--4it168dxn--4it797koninjambylxn--4pvxs4allxn--54b7" + - "fta0ccitichernovtsymantechnologyxn--55qw42gxn--55qx5dxn--5js045d" + - "xn--5rtp49civilaviationxn--5rtq34konskowolayangrouphotographysio" + - "xn--5su34j936bgsgxn--5tzm5gxn--6btw5axn--6frz82gxn--6orx2rxn--6q" + - "q986b3xlxn--7t0a264civilisationxn--80adxhksouthwestfalenxn--80ao" + - "21axn--80aqecdr1axn--80asehdbarrell-of-knowledgeologyonagoyautom" + - "otiveconomiasakuchinotsuchiurakawalesundevelopmentattoobninskara" + - "coldwarmiastagebizenakanotoddenavuotnaples3-eu-west-2xn--80aswgx" + - "n--80augustownproviderxn--8ltr62konsulatrobeepilepsykkylvenetoei" + - "dsvollxn--8pvr4utwentexn--8y0a063axn--90a3academiamicaaarborteac" + - "hes-yogasawaracingxn--90aeroportalabamagasakishimabaraogakibichu" + - "oxn--90aishobarakawagoexn--90azhytomyravendbarsycenterprisesakik" + - "ugawalmartaxihuanflfanfshostrowwlkpmgjovikaragandautoscanadaegua" + - "mbulancehimejibmdgcagliaribeiraokinawashirosatochiokinoshimaizur" + - "uhreviewskrakoweddingjerstadotsuruokakamigaharaurskog-holandingj" + - "erdrumetacentrumeteorappalmaserati234lima-cityeatselinogradultat" + - "arantours3-ap-southeast-1kappchizip6xn--9dbhblg6dietcimdbarsyonl" + - "inewhampshirealtysnes3-us-gov-west-1xn--9dbq2axn--9et52uxn--9krt" + - "00axn--andy-iraxn--aroport-byandexn--3bst00misakis-an-actresshin" + - "shinotsurgeryxn--asky-iraxn--aurskog-hland-jnbashkiriaveroykengl" + - "andiscountyolasitempresashibetsukuiitatebayashiibajddarchitectur" + - "ealtorlandiscourses3-eu-west-3utilitiesquare7xn--avery-yuasakuho" + - "kkaidownloadxn--b-5gaxn--b4w605ferdxn--balsan-sdtirol-nsbsowaxn-" + - "-bck1b9a5dre4civilizationxn--bdddj-mrabdxn--bearalvhki-y4axn--be" + - "rlevg-jxaxn--bhcavuotna-s4axn--bhccavuotna-k7axn--bidr-5nachikat" + - "suuraxn--bievt-0qa2xn--bjarky-fyaotsurreyxn--bjddar-ptargets-itr" + - "evisohughesopotrentinsud-tirolxn--blt-elabourxn--bmlo-graingerxn" + - "--bod-2natalxn--bozen-sdtirol-2obanazawaxn--brnny-wuacademy-fire" + - "wall-gatewayxn--brnnysund-m8accident-investigation-aptibleadpage" + - "st-mon-blogueurovision-rancherkasydneyxn--brum-voagatritonxn--bt" + - "sfjord-9zaxn--bulsan-sdtirol-nsbasicservercelliguriavocatanzarow" + - "edeployombolzano-altoadigemrevistanbulsan-sudtirolavagiskeu-1xn-" + - "-c1avgxn--c2br7gxn--c3s14misasaguris-an-anarchistoricalsocietyxn" + - "--cck2b3basilicataniavoues3-external-1xn--cesena-forl-mcbremange" + - "rxn--cesenaforl-i8axn--cg4bkis-lostrolekamakurazakiwakunigamihar" + - "unusualpersonxn--ciqpnxn--clchc0ea0b2g2a9gcdxn--comunicaes-v6a2o" + - "xn--correios-e-telecomunicaes-ghc29axn--czr694basketballyngenvir" + - "onmentalconservationrenderxn--czrs0troandinosaurepaircraftingvol" + - "lombardiamondsor-odalxn--czru2dxn--czrw28batodayonagunicommbanka" + - "rasjohkamikoaniikappuboliviajessheimetlifeinsuranceu-4xn--d1acj3" + - "batsfjordishakotanhktcp4xn--d1alfaromeoxn--d1atrogstadxn--d5qv7z" + - "876civilwarmanagementoystre-slidrettozawaxn--davvenjrga-y4axn--d" + - "jrs72d6uyxn--djty4konyvelolxn--dnna-grajewolterskluwerxn--drbak-" + - "wuaxn--dyry-iraxn--e1a4clanbibaidarmeniaxn--eckvdtc9dxn--efvn9sp" + - "eedpartnersolognexn--efvy88hair-surveillancexn--ehqz56nxn--elqq1" + - "6hakatanortonxn--estv75gxn--eveni-0qa01gaxn--f6qx53axn--fct429ko" + - "oris-a-personaltrainerxn--fhbeiarnxn--finny-yuaxn--fiq228c5hspje" + - "lkavikommunexn--fiq64bauhausposts-and-telecommunicationswatch-an" + - "d-clockerxn--fiqs8spreadbettingxn--fiqz9spydebergxn--fjord-lraxn" + - "--fjq720axn--fl-ziaxn--flor-jraxn--flw351exn--forl-cesena-fcbsrl" + - "xn--forlcesena-c8axn--fpcrj9c3dxn--frde-grandrapidsrtrentinsudti" + - "rolxn--frna-woaraisaijosoyrovigotpantheonsitextileirvikopervikha" + - "rkivalleeaosteinkjerusalembroideryxn--frya-hraxn--fzc2c9e2cldmai" + - "lubindalublindesnesannohelpagesanokarumaifashionxn--fzys8d69uvgm" + - "ailxn--g2xx48clickasaokamiminersantabarbaraxn--gckr3f0fauskedsmo" + - "korsetagayasells-for-ufcfanxn--gecrj9clinichirurgiens-dentistes-" + - "en-francexn--ggaviika-8ya47hakodatexn--gildeskl-g0axn--givuotna-" + - "8yasakaiminatoyookaniepcexn--gjvik-wuaxn--gk3at1exn--gls-elacaix" + - "axn--gmq050is-not-certifiedugit-pagespeedmobilizeroticahcesuoloa" + - "nshintomikasaharaxn--gmqw5axn--h-2failxn--h1aeghakonexn--h2breg3" + - "evenesrvaporcloudxn--h2brj9c8cliniquenoharaxn--h3cuzk1digitalxn-" + - "-hbmer-xqaxn--hcesuolo-7ya35beneventogakushimotoganewhollandisre" + - "chtrainingladefinimakanegasakiraxaustevoll-o-g-i-naval-d-aosta-v" + - "alleyokosukanumazuryokotebinagisobetsumidatlantic66xn--hery-irax" + - "n--hgebostad-g3axn--hkkinen-5waxn--hmmrfeasta-s4accident-prevent" + - "ion-riopretobamaceratabuseating-organicbcn-north-1xn--hnefoss-q1" + - "axn--hobl-iraxn--holtlen-hxaxn--hpmir-xqaxn--hxt814exn--hyanger-" + - "q1axn--hylandet-54axn--i1b6b1a6a2exn--imr513nxn--indery-fyasugiv" + - "ingxn--io0a7is-savedunetbankazunow-dnshinyoshitomiokamitondabaya" + - "shiogamagoriziaxn--j1aefbsbxn--12cfi8ixb8luxuryxn--j1amhakubahcc" + - "avuotnagarahkkeravjuegoshikikuchikuseikarugalsacexn--j6w193gxn--" + - "jlq61u9w7bentleyoriikarasjokarasuyamarumorimachidaxn--jlster-bya" + - "suokanoyaltakashimarugame-hostrowieclintonoshoesantacruzsantafed" + - "jejuifminamifuranoxn--jrpeland-54axn--jvr189misawaxn--k7yn95exn-" + - "-karmy-yuaxn--kbrq7oxn--kcrx77d1x4axn--kfjord-iuaxn--klbu-woaxn-" + - "-klt787dxn--kltp7dxn--kltx9axn--klty5xn--3ds443gxn--koluokta-7ya" + - "57hakuis-a-landscaperxn--kprw13dxn--kpry57dxn--kpu716fbx-osassar" + - "is-a-doctorayxn--kput3is-slickddielddanuorrikuzentakatajimidoris" + - "sagamiharaxn--krager-gyatomitamamuraxn--kranghke-b0axn--krdshera" + - "d-m8axn--krehamn-dxaxn--krjohka-hwab49jdfastlylbarcelonagareyama" + - "keupowiat-band-campaniaustinnavigationavoizumizakibigawajudygarl" + - "anddnslivelanddnss3-ca-central-1xn--ksnes-uuaxn--kvfjord-nxaxn--" + - "kvitsy-fyatsukanraxn--kvnangen-k0axn--l-1fairwindstorfjordxn--l1" + - "accentureklamborghinikolaeventstorjdevcloudfunctionshiojirishiri" + - "fujiedaxn--laheadju-7yatsushiroxn--langevg-jxaxn--lcvr32dxn--ldi" + - "ngen-q1axn--leagaviika-52beppublishproxyzgorzeleccoffeedbackplan" + - "eapplicationcloudaccesscambridgestonewyorkshirecifedexhibitionhl" + - "fanhs3-us-west-1xn--lesund-huaxn--lgbbat1ad8jelenia-goraxn--lgrd" + - "-poacctromsakakinokiaxn--lhppi-xqaxn--linds-pramericanartromsoja" + - "misonxn--lns-qlanxesstpetersburgxn--loabt-0qaxn--lrdal-sraxn--lr" + - "enskog-54axn--lt-liaclothingdustdataitogliattiresantamariakexn--" + - "lten-granexn--lury-iraxn--m3ch0j3axn--mely-iraxn--merker-kuaxn--" + - "mgb2ddestreamuneuesolundbeckomforbarreauctionredumbrella-speziau" + - "strheimatunduhrennesoyokozebinordreisa-geek12xn--mgb9awbfbxosaud" + - "axn--mgba3a3ejtrusteexn--mgba3a4f16axn--mgba3a4franamizuholdings" + - "tudioxn--mgba7c0bbn0axn--mgbaakc7dvfedorapeoplegnicanonoichinomi" + - "yakexn--mgbaam7a8hakusanagochijiwadellogliastradingxn--mgbab2bdx" + - "n--mgbai9a5eva00beskidyn-ip24xn--mgbai9azgqp6jeonnamerikawauexn-" + - "-mgbayh7gpaleoxn--mgbb9fbpobihirosakikamijimatsuzakis-uberleetre" + - "ntino-altoadigexn--mgbbh1a71exn--mgbc0a9azcgxn--mgbca7dzdoxn--mg" + - "berp4a5d4a87gxn--mgberp4a5d4arxn--mgbgu82axn--mgbi4ecexposedxn--" + - "mgbpl2fhskydivingxn--mgbqly7c0a67fbcn-northwest-1xn--mgbqly7cvaf" + - "ranziskanerimaringatlantakaharuxn--mgbt3dhdxn--mgbtf8flatangerxn" + - "--mgbtx2bestbuyshouses3-us-west-2xn--mgbx4cd0abbvieeexn--mix082f" + - "edoraprojectrapaniizaxn--mix891feiraquarelleaseeklogesauheradynn" + - "sasebofageorgeorgiaxn--mjndalen-64axn--mk0axin-dslgbtrvareserveh" + - "ttpinkmpspbargainstantcloudfrontdoorhcloudiscoveryomitanoceanogr" + - "aphiqueu-3xn--mk1bu44cngrondarxn--mkru45is-very-badajozxn--mlatv" + - "uopmi-s4axn--mli-tlapyxn--mlselv-iuaxn--moreke-juaxn--mori-qsaku" + - "ragawaxn--mosjen-eyawaraxn--mot-tlaquilancomeldalxn--mre-og-roms" + - "dal-qqbetainaboxfusejnyoshiokanzakiyokawaraxn--msy-ula0haldenxn-" + - "-mtta-vrjjat-k7aflakstadaokagakicks-assnasaarlandxn--muost-0qaxn" + - "--mxtq1misconfusedxn--ngbc5azdxn--ngbe9e0axn--ngbrxn--3e0b707exn" + - "--nit225koryokamikawanehonbetsurutaharaxn--nmesjevuemie-tcbalsan" + - "-suedtirolkuszczytnombresciaxn--nnx388axn--nodessakurais-very-ev" + - "illagexn--nqv7fs00emaxn--nry-yla5gxn--ntso0iqx3axn--ntsq17gxn--n" + - "ttery-byaeservehumourxn--nvuotna-hwaxn--nyqy26axn--o1achattanoog" + - "anordlandxn--o3cw4halsaintlouis-a-anarchistoireggio-emilia-romag" + - "nakatsugawaxn--o3cyx2axn--od0algxn--od0aq3bhzcaseihicampobassoci" + - "atest-iservecounterstrikeverbankaratevje-og-hornnes3-website-ap-" + - "northeast-1xn--ogbpf8flekkefjordxn--oppegrd-ixaxn--ostery-fyawat" + - "ahamaxn--osyro-wuaxn--otu796dxn--p1acfermobilyxn--p1ais-very-goo" + - "dyearxn--pbt977cnpyatigorskodjeffersonxn--pgbs0dhlxn--porsgu-sta" + - "26ferraraxn--pssu33lxn--pssy2uxn--q9jyb4cnsantoandreamhostersanu" + - "kis-a-cubicle-slavellinodearthachiojiyaitakanabeautysvardoesntex" + - "isteingeekashibatakasugais-a-democratozsdeltaiwanairforcebetsuik" + - "idsmynasushiobarackmazerbaijan-mayendoftheinternetflixilovecolle" + - "gefantasyleaguernseyxn--qcka1pmckinseyxn--qqqt11mishimatsumaebas" + - "hikshacknetrentino-sudtirolxn--qxamusementdllxn--rady-iraxn--rda" + - "l-poaxn--rde-ularvikosaigawaxn--rdy-0nabaris-very-nicexn--rennes" + - "y-v1axn--rhkkervju-01aferrarivnexn--rholt-mragowoodsidemoneyxn--" + - "rhqv96gxn--rht27zxn--rht3dxn--rht61exn--risa-5nativeamericananti" + - "questudynamisches-dnsolutionsokndalxn--risr-iraxn--rland-uuaxn--" + - "rlingen-mxaxn--rmskog-byaxn--rny31hammarfeastafricapetownnews-st" + - "agingxn--rovu88bieigersundivtasvuodnakamuratajirittogojomedizinh" + - "istorisches3-website-ap-southeast-1xn--rros-granvindafjordxn--rs" + - "kog-uuaxn--rst-0naturalhistorymuseumcenterxn--rsta-francaisehara" + - "xn--rvc1e0am3exn--ryken-vuaxn--ryrvik-byaxn--s-1faithruherecipes" + - "caravantaarpippulawyxn--s9brj9cntrani-andria-barletta-trani-andr" + - "iaxn--sandnessjen-ogbielawalterxn--sandy-yuaxn--sdtirol-n2axn--s" + - "eral-lraxn--ses554gxn--sgne-gratangenxn--skierv-utazastuff-4-sal" + - "exn--skjervy-v1axn--skjk-soaxn--sknit-yqaxn--sknland-fxaxn--slat" + - "-5naturalsciencesnaturellestufftoread-booksnesomaxn--slt-elabcie" + - "szynxn--smla-hraxn--smna-gratis-a-bulls-fanxn--snase-nraxn--sndr" + - "e-land-0cbielladbrokes3-website-ap-southeast-2xn--snes-poaxn--sn" + - "sa-roaxn--sr-aurdal-l8axn--sr-fron-q1axn--sr-odal-q1axn--sr-vara" + - "nger-ggbieszczadygeyachiyodaejeonbuklugsmilebtimnetzjampagefront" + - "appanamatta-varjjatjeldsundivttasvuotnakaniikawatanaguraxn--srfo" + - "ld-byaxn--srreisa-q1axn--srum-grazxn--stfold-9xaxn--stjrdal-s1ax" + - "n--stjrdalshalsen-sqbievathletajimabaridagawakuyabukijobserverra" + - "nkoshigayachimataikikonaikawachinaganoharamcoachampionshiphoptob" + - "ishimagazineat-urlillyukiiyamanouchikuhokuryugasakitaurayasudaxn" + - "--stre-toten-zcbifukagawarszawashingtondclkaratsuginamikatagamil" + - "itaryukuhashimoichinosekigaharaxn--t60b56axn--tckweatherchannelx" + - "n--tiq49xqyjetztrentino-s-tirolxn--tjme-hraxn--tn0agrinet-freaks" + - "tuttgartrentinsued-tirolxn--tnsberg-q1axn--tor131oxn--trany-yuax" + - "n--trentin-sd-tirol-rzbigv-infoodnetworkangerxn--trentin-sdtirol" + - "-7vbihorologyurihonjournalistjohnikonanporohtawaramotoineppuglia" + - "xn--trentino-sd-tirol-c3bikedagestangeometre-experts-comptables3" + - "-website-eu-west-1xn--trentino-sdtirol-szbilbaogashimadachicago-" + - "vipsinaappanasonicasertairanzaninohekinannestadiyusuharaxn--tren" + - "tinosd-tirol-rzbillustrationthewifiatmallorcadaques3-website-sa-" + - "east-1xn--trentinosdtirol-7vbiomutashinain-the-bandain-vpncasino" + - "rdkapparaglidinglassassinationalheritagexn--trentinsd-tirol-6vbi" + - "rdartcenterprisecloudappspotagerxn--trentinsdtirol-nsbirkenesodd" + - "tangenovaraholtaleninomiyakonojorpelandnparisor-fronirasakincheo" + - "nishiazaindianapolis-a-bloggerxn--trgstad-r1axn--trna-woaxn--tro" + - "ms-zuaxn--tysvr-vraxn--uc0atvarggatrentinsuedtirolxn--uc0ay4axn-" + - "-uist22hamurakamigoris-a-lawyerxn--uisz3gxn--unjrga-rtargivestby" + - "temarkosakaerodromegallupinbarrel-of-knowledgemologicallazioddau" + - "thordalandeportenrightathomeftpalmspringsakereportatsunobiraukra" + - "anghkeymachineustarhubss3-eu-central-1xn--unup4yxn--uuwu58axn--v" + - "ads-jraxn--valle-aoste-ebbtrysiljanxn--valle-d-aoste-ehbodollsus" + - "akis-into-cartoonshintokushimaxn--valleaoste-e7axn--valledaoste-" + - "ebbvacationsusonoxn--vard-jraxn--vegrshei-c0axn--vermgensberater" + - "-ctbirthplacexn--vermgensberatung-pwbjarkoyusuisserveircateringe" + - "buildingleezexn--vestvgy-ixa6oxn--vg-yiabkhaziaxn--vgan-qoaxn--v" + - "gsy-qoa0jevnakershuscultureggiocalabriaxn--vgu402coguchikuzenxn-" + - "-vhquvaroyxn--vler-qoaxn--vre-eiker-k8axn--vrggt-xqadxn--vry-yla" + - "5gxn--vuq861bjerkreimbamblebesbyglandroverhallaakesvuemielecceu-" + - "2xn--w4r85el8fhu5dnraxn--w4rs40lxn--wcvs22dxn--wgbh1collectionxn" + - "--wgbl6axn--xhq521bjugnieznord-frontierxn--xkc2al3hye2axn--xkc2d" + - "l3a5ee0handsonxn--y9a3aquariumissilelxn--yer-znaturbruksgymnxn--" + - "yfro4i67oxn--ygarden-p1axn--ygbi2ammxn--3hcrj9circustomerxn--yst" + - "re-slidre-ujblackfridayuu2-localhostoregontrailroadrangedalimano" + - "warudaxn--zbx025dxn--zf0ao64axn--zf0avxn--3oq18vl8pn36axn--zfr16" + - "4bloombergbauernishigovtjmaxxxboxenapponazure-mobilexnbayxz" +const text = "9guacuiababia-goracleaningroks-theatree12hpalermomahachijoinvill" + + "eksvik12ix4432-balsfjordd-dnsiskinkyotobetsulikes-piedmonticello" + + "dingen4tatarantours3-ap-south-16-b-dataiji234lima-cityeatselinog" + + "radult3l3p0rtashkentatamotors3-ap-northeast-2038blackfridayuu2-l" + + "ocalhostoregontrailroadnparachutingleezebloombergbauernirasakind" + + "igenaklodzkochikushinonsenergyuzawabloxcms3-website-us-west-1blu" + + "edagestangemologicallimoliseminebmoattachments3-website-us-west-" + + "2bms5ybmweddinglitchattanooganordlandrangedalinkyard-cloudyclust" + + "erbnrwedeploybomloabathsbchernihivgubsakyotanabellunord-aurdalph" + + "a-myqnapcloudaccesscambridgestoneuesalangenishiazaindustriabondr" + + "ay-dnsupdaternopilawatchesalondonetskaruizawabonnishigohtawaramo" + + "toineppueblockbustermezparaglidingliwicebookinghostfoldnavybooml" + + "air-traffic-controlleyboschaefflerdalivornomutashinaindustrieste" + + "amfamberkeleybostikarumaifarmsteadrayddnsfreebox-osascoli-piceno" + + "rdre-landraydnsaltdalombardynaliaskimitsubatamibudejjuegoshikiho" + + "kumakogenebakkeshibechambagriculturennebugattiffanynysadoes-itve" + + "destrandrivefsnillfjordrobaknoluoktachikawakembuchikumagayagawak" + + "kanaibetsubamericanfamilydsclouderackmazerbaijan-mayen-rootaribe" + + "iraogashimadachicagoboatsaludrudupontariobranconakamuratajirivne" + + "bostonakijinsekikogentappsselfiparisor-fronishiharabotanicalgard" + + "enishiizunazukinfinitintuitjomeloyalistoragebotanicgardenishikat" + + "aketomisatomobellevuelosangelesjabbottjxfinitybotanybouncemerckm" + + "sdnipropetrovskjervoyageorgeorgiabounty-fullensakerrypropertiesa" + + "lvadordalibabalestrandabergamo-siemensncfdurbanamexnethnologybou" + + "tiquebechernivtsiciliabozen-sudtirolomzaporizhzhegurinuyamashina" + + "tsukigatakasakitaurayasudabozen-suedtirolondrinamsskoganeinvestm" + + "entsalzburglobalashovhachinohedmarkasaokamiminersamegawabplacedo" + + "gawarabikomaezakirunorddalorenskogloboavistanbulsan-sudtiroloten" + + "kawabrandywinevalleybrasiliabrindisibenikimobetsuitainaioiraseba" + + "stopologyeongnamegawafflecellclaimsamnangerbristoloseyouriparlia" + + "mentkmaxxjavald-aostarnberglogowegroweibolognagareyamakeupowiath" + + "letajimabaridagawakuyabukikonaikawachinaganoharamcoachampionship" + + "hoptobishimadridvagsoyerbritishcolumbialowiezaganishikatsuragit-" + + "reposampalacebroadcastleclerchernovtsymantechnologybroadwaybroke" + + "-itksatxn--0trq7p7nnishikawazukamisunagawabrokerbronnoysundurham" + + "burgloppenzaolbia-tempio-olbiatempioolbialystokkepnogatagajoboji" + + "nzais-a-candidatebrothermesaverdealstahaugesunderseaportsinfolld" + + "alottebrowsersafetymarketsamsclubartoweirbrumunddalottokonamegat" + + "akayamashikokuchuobrunelasticbeanstalkashibatakatoris-a-catererb" + + "russelsamsunglugmbhartipscbgminakamichiharabruxellesandnessjoeni" + + "shimerabryansklepparmatta-varjjatmparochernigovernmentoyosatoyok" + + "awabrynewjerseybuskerudinewmexicoalouvreitoyotaparsandoybuzentsu" + + "jiiebuzzwellbeingzonebwfarsundweberbzhitomirumalatvuopmicrolight" + + "ingmodellingmxn--11b4c3dynathomebuiltwithdarkashiharabzzcolumbus" + + "heycommunecommunity-prochowicecomoarekecomparemarkerryhotelsanta" + + "mariakecompute-1computerhistoryofscience-fictioncomsecuritytacti" + + "csantoandreamhostersanukis-a-cubicle-slavellinodearthachiojiyaho" + + "oguycondoshichinohealth-carereforminamidaitomanchesterconference" + + "constructionconsuladonnagatorodoyconsultanthropologyconsultingro" + + "ngausdalukowhalingrossetouchihayaakasakawaharacontactraniandriab" + + "arlettatraniandriacontagematsubaracontemporaryarteducationalchik" + + "ugodontexistmein-iservebeercontractorskenconventureshinodebalanc" + + "ertificationcookingchannelsdvrdnsfor-better-thanawassamukawatari" + + "ghtathomeftpartycooluroycooperativano-frankivskolegallocus-3cope" + + "nhagencyclopedichitosetogakushimotoganewyorkshirecifedexhibition" + + "ishinoomotegocorsicafederationcorvettemp-dnsaobernardocosenzakop" + + "anecosidnshome-webserverdalutskasuyameinforumzcostumedicinaharim" + + "alopolskanlandyndns-office-on-the-webhareidsbergentingroundhandl" + + "ingroznycouchpotatofriesaogoncarriercounciluxurycouponsaotomelda" + + "luzerncq-acranbrookuwanalyticsapporocrdyndns-picsardegnaroycredi" + + "tcardyndns-remotewdyndns-serverisigncreditunioncremonashgabadadd" + + "jaguarqcxn--12c1fe0bradescorporationrendercrewhoswhokksundyndns-" + + "webhopencraftranoycricketrzyncrimeast-kazakhstanangercrotonecrow" + + "nipasadenarashinocrsvpassagensardiniacruisesarlvivanovoldacrypto" + + "nomichigangwoncuisinellajollamericanexpressexyculturalcentertain" + + "mentransportecuneocupcakecuritibaghdadyndns-wikirkenesarpsborgrp" + + "assenger-associationcymrussiacyonabaruminamiechizencyouthruherec" + + "ipescaravantaarpatriaferrerotikagoshimalvikaszubyfetsundyndns1fg" + + "uidegreefhvalerfidoomdnstracefieldynnsarufutsunomiyawakasaikaita" + + "koelnfigueresinstaginguitarsauheradynservebbsasayamayfirstockhol" + + "mestrandyndns-workshopitsitexaskoyabearalvahkijobservableusercon" + + "tentransurlfilateliafilegear-audnedalnfilegear-deatnulminamiiser" + + "niafilegear-gbizfilegear-iefilegear-jpmorganfilegear-sgujohanama" + + "kinoharafilminamiizukamiokameokameyamatotakadafinalfinancefinear" + + "tsavannahgafinlandynufcfanfinnoyfirebaseapplinzis-a-doctorayfire" + + "nzefirestonefirmdalegoldpoint2thisamitsukefishingolffansaves-the" + + "-whalessandria-trani-barletta-andriatranibarlettaandriafitjarvod" + + "kafjordynv6fitnessettlementravelersinsurancefjalerflesbergulenfl" + + "ickragerogersavonarusawaflightsaxoflirfloginlinefloraflorenceflo" + + "ridattorelayfloripaderbornfloristanohatakaharulvikatowicefloroku" + + "nohealthcareerschoenbrunnflowerschokokekschokoladenfltrdynvpnplu" + + "s-4flynnhosting-clusterflynnhubarcelonagawalesundgcagliaricoharu" + + "ovataxihuanflfanfshostrowwlkpmgjerdrumemsettsupportcp4fndyroyrvi" + + "kingruefor-ourfor-somedizinhistorischescholarshipschoolschulefor" + + "-theaterforexrothachirogatakamoriokakudamatsueforgotdnschwarzgwa" + + "ngjuniperforli-cesena-forlicesenaforlikescandyn53forsaleikangerf" + + "orsandasuologoipaviancargodaddyn-o-saurlandeschweizfortalfortmis" + + "soulancasterfortworthadanorthwesternmutualfosnesciencecenterscie" + + "ncehistoryfotaruis-a-financialadvisor-aurdalfoxfordebianfozorafr" + + "edrikstadtvscientistordalfreeddnsgeekgalaxyfreedesktopocznore-og" + + "-uvdalfreemasonryfreesitextileirfjordfreetlscjohnsonfreiburgunma" + + "nxn--12co0c3b4evalleaostavangerfreightrentin-sud-tirolfreseniusc" + + "ountryestateofdelawareggio-calabriafribourguovdageaidnunusualper" + + "sonfriuli-v-giuliafriuli-ve-giuliafriuli-vegiuliafriuli-venezia-" + + "giuliafriuli-veneziagiuliafriuli-vgiuliafriuliv-giuliafriulive-g" + + "iuliafriulivegiuliafriulivenezia-giuliafriuliveneziagiuliafriuli" + + "vgiuliafrlfroganscotlandfrognfrolandfrom-akrehamnfrom-alfrom-arf" + + "rom-azimutheworkpccwiiheyakagefrom-capebretonamicrosoftbankatsus" + + "hikabeeldengeluidfrom-codyn-vpndnscrapper-sitefrom-ctrentin-sudt" + + "irolfrom-dchocolatelevisionishinoshimatsushigefrom-dedyn-berlinc" + + "olnfrom-flanderscrappingushikamifuranorth-kazakhstanfrom-gaulard" + + "alfrom-hichisochildrensgardenfrom-iafrom-idfrom-ilfrom-in-brbarc" + + "laycards3-sa-east-1from-kscrysechofunatoriginstitutemasekashiwaz" + + "akiyosatokamachintaifun-dnsdojolsterfrom-kyowariasahikawawildlif" + + "edorainfracloudfrontdoorfrom-lanciafrom-mamurogawafrom-mdfrom-me" + + "eresistancefrom-mifunefrom-mnfrom-modalenfrom-mserveirchonanbuls" + + "an-suedtirolowiczest-le-patronishiokoppegardyndns-at-homedepoten" + + "zamamidsundyndns-at-workisboringrimstadyndns-blogdnsangofrom-mtn" + + "from-nctulangevagrigentomologyeonggiehtavuoatnadexeterfrom-ndfro" + + "m-nefrom-nh-serveblogsiteleafamilycompanyminamimakis-a-geekatsuy" + + "amarugame-hostrowiechoseiroumuenchenishitosashimizunaminamibosog" + + "ndalpusercontentoyotsukaidofrom-njaworznoticiasnesoddenmarkhange" + + "lskjakdnepropetrovskiervaapsteiermarkaufenfrom-nminamiminowafrom" + + "-nvalled-aostavernfrom-nyfrom-ohkurafrom-oketogurafrom-orfrom-pa" + + "dovaksdalfrom-pratohmandalfrom-ris-a-greenfrom-schmidtre-gauldal" + + "from-sdfrom-tnfrom-txn--1ck2e1barclays3-us-east-2from-utazuerich" + + "ardlillehammerfeste-ipfizerfrom-val-daostavalleyfrom-vtrentin-su" + + "ed-tirolfrom-wafrom-wielunnerfrom-wvalledaostaobaomoriguchiharah" + + "kkeravjuedischesapeakebayernunzenfrom-wyfrosinonefrostalowa-wola" + + "wafroyahikobeardubaiduckdnserveminecraftrentin-suedtirolfstcgrou" + + "pgfoggiafujiiderafujikawaguchikonefujiminokamoenairguardiannakad" + + "omarineat-urlfujinomiyadavvenjargap-northeast-3fujiokayamangonoh" + + "ejis-a-guruslivinghistoryfujisatoshonairlinebraskauniversitychya" + + "ttorneyagawakayamagazinedre-eikerfujisawafujishiroishidakabirato" + + "ridefenseljordfujitsurugashimangyshlakasamatsudovre-eikerfujixer" + + "oxn--1ctwolominamatargivestbytemarkautokeinotteroyfujiyoshidavve" + + "siidatsunanjoburgwiddleitungsenfukayabeatservemp3fukuchiyamadaza" + + "ifudaigojomedio-campidano-mediocampidanomediofukudominichoshibuy" + + "achiyodatingripefukuis-a-hard-workerservep2pharmacienservepicser" + + "vequakefukumitsubishigakisarazurecontainerdpolicefukuokazakishiw" + + "adafukuroishikarikaturindalfukusakisofukushimaniwakuratefukuyama" + + "gatakahatakaishimogosenfunabashiriuchinadafunagatakamatsukawafun" + + "ahashikamiamakusatsumasendaisennangooglecodespotrentino-a-adigef" + + "undaciofuoiskujukuriyamannorfolkebibleirvikazoologyfuosskoczowil" + + "liamhillfurnitureggio-emilia-romagnakasatsunairportland-4-salern" + + "oboribetsuckservesarcasmatartanddesignfurubirafurudonostiaafuruk" + + "awairtelebitballooningxn--1lqs03nfusodegaurafussagamiharafutabay" + + "amaguchinomigawafutboldlygoingnowhere-for-morenakatombetsumitaka" + + "giizefuttsurugimperiafuturecmservicesevastopolefuturehostingfutu" + + "remailingfvgfylkesbiblackbaudcdn77-securebungoonord-odalwaysdata" + + "baseballangenkainanaejrietisalatinabenonicbcn-north-1fyresdalhan" + + "goutsystemscloudhannanmokuizumodenakayamapartmentsewinbarefootba" + + "llfinanzgoraustrheimatunduhrennesoyokozebinagisoccertmgretakaham" + + "alselvendrellaziobiramusementdllpages3-ap-southeast-2hannosegawa" + + "hanyuzenhapmirharstadharvestcelebrationhasamarburghasaminami-alp" + + "sharis-a-lawyerhashbanghasudahasura-appharmacysharphdfcbankddiel" + + "ddanuorrittogliattireshawaiijimaritimoduminamioguni5hasvikfhappo" + + "usrcfastly-terrariuminamifuranohatogayaitakanezawahatoyamazakita" + + "kamiizumisanofidelityhatsukaichikaiseis-a-liberalhattfjelldalhay" + + "ashimamotobungotakadancehazuminobusells-for-ustkannamilanotogawa" + + "helsinkitakatakaokalmykiahembygdsforbundhemneshellaspeziahemseda" + + "lhepforgeherokussldheroyhgtvallee-aosteroyhigashiagatsumagoiania" + + "higashichichibunkyonanaoshimageandsoundandvisionthewifiatmallorc" + + "adaqueshimojis-a-libertarianhigashihiroshimanehigashiizumozakita" + + "kyushuaiahigashikagawahigashikagurasoedahigashikawakitaaikitamih" + + "amadahigashikurumeetnedalhigashimatsushimarcheapigeelvinckhakass" + + "iahigashimatsuyamakitaakitadaitoigawahigashimurayamamotorcyclesh" + + "imokawahigashinarusells-itrentino-alto-adigehigashinehigashiomih" + + "achimanagementrentino-altoadigehigashiosakasayamanakakogawahigas" + + "hishirakawamatakarazukaluganskygearapphiladelphiaareadmyblogspot" + + "rentino-s-tirolhigashisumiyoshikawaminamiaikitamotosumy-gatewayh" + + "igashitsunoshiroomurahigashiurausukitanakagusukumodernhigashiyam" + + "atokoriyamanashifteditchyouriphilatelyhigashiyodogawahigashiyosh" + + "inogaris-a-linux-useranishiaritabashijonawatehiraizumisatohnosho" + + "ooshikamaishimodatehirakatashinagawahiranairtrafficplexus-1hirar" + + "ahiratsukagawahirayaizuwakamatsubushikusakadogawahistorichousesh" + + "imokitayamahitachiomiyagildeskaliszhitachiotagoppdalhitraeumtger" + + "adelmenhorstalbanshimonitayanagithubusercontentrentino-stirolhja" + + "rtdalhjelmelandholeckobierzyceholidayhomeiphilipsyno-dshimonosek" + + "ikawahomelinkitoolsztynsettlershimosuwalkis-a-llamarriottrentino" + + "-sud-tirolhomelinuxn--1lqs71dhomeofficehomesecuritymacaparecidah" + + "omesecuritypchoyodobashichikashukujitawaravennagasukehomesenseer" + + "inghomeunixn--1qqw23ahondahongotembaixadahonjyoitakasagotpantheo" + + "nsitehornindalhorsellsyourhomegoodshimotsukehorteneis-a-musician" + + "hospitalhoteleshimotsumahotmailhoyangerhoylandetroitskypehumanit" + + "ieshinichinanhurdalhurumajis-a-nascarfanhyllestadhyogoris-a-nurs" + + "embokukitchenhyugawarahyundaiwafuneis-very-sweetpepperis-with-th" + + "ebandoisleofmanaustdaljewelryjewishartgalleryjfkharkovalleedaost" + + "ejgorajlljmphotographysiojnjcphonefosshintomikasaharajoyentrenti" + + "noa-adigejoyokaichibalatinogiftshiojirishirifujiedajpnjprshioyan" + + "aizujurkoseis-a-personaltrainerkosherbrookegawakoshimizumakizuno" + + "kunimimatakatsukiyosemitekoshunantankhmelnitskiyamarumorimachida" + + "kosugekotohiradomainsurehabmerkotourakouhokutamakis-a-photograph" + + "erokuapphoenixn--2m4a15ekounosupplieshirakofuefukihaboromskogkou" + + "yamarylhurstjordalshalsenkouzushimasfjordenkozagawakozakis-a-pla" + + "yerkozowindmillkpnkppspdnshiranukamitsuekrasnikahokutokashikis-a" + + "-republicancerresearchaeologicaliforniakrasnodarkredstonekristia" + + "nsandcatshiraois-a-rockstarachowicekristiansundkrodsheradkroksta" + + "delvaldaostarostwodzislawindowskrakowinnershiraokamogawakryminam" + + "isanrikubetsurfastpanelblagrarchaeologyeongbuk0emmafann-arboretu" + + "mbriamallamaceiobbcg120001wwwebredirectmembers3-ap-northeast-133" + + "7kumatorinokumejimashikis-a-socialistdlibestadkumenantokigawakun" + + "isakis-a-soxfankunitachiarailwaykunitomigusukumamotoyamashikekun" + + "neppubtlshiratakahagitlaborkunstsammlungkunstunddesignkuokgroupi" + + "lotshishikuis-a-studentalkureisenkurgankurobelaudibleasingleshis" + + "ognekurogiminamiashigarakuroisoftwarendalenugkuromatsunais-a-tea" + + "cherkassyncloudkurotakikawasakis-a-techietis-a-painteractivegask" + + "vollkushirogawakustanais-a-therapistoiakusupplykutchanelkutnokuz" + + "umakis-an-accountantshinjournalismailillesandefjordkvafjordkvals" + + "undkvamlidlugolekadenagahamaroygardendoftheinternetlifyis-an-act" + + "orkvanangenkvinesdalkvinnheradkviteseidskogkvitsoykwpspectrumina" + + "mitanekzmissileluxembourgmisugitokorozawamitourismolanxesshisuif" + + "uettertdasnetzmitoyoakemiuramiyazurewebsiteshikagamiishibukawami" + + "yotamanomjondalenmlbfanmonstermontrealestatefarmequipmentrentino" + + "aadigemonza-brianzapposhitaramamonza-e-della-brianzaptokuyamatsu" + + "maebashikshacknetrentinoalto-adigemonzabrianzaramonzaebrianzamon" + + "zaedellabrianzamoonscalevangermordoviamoriyamatsumotofukemoriyos" + + "himinamiawajikis-an-engineeringmormonmouthaebaruericssongdalenvi" + + "knakatsugawamoroyamatsunomortgagemoscowioshizukuishimofusaitamat" + + "sukuris-an-entertainermoseushistorymosjoenmoskeneshizuokanagawam" + + "osshoppingmosvikhplaystationmoteginowaniihamatamakawajimansionsh" + + "oujis-bytomaritimekeepingmoviemovimientokyotangovtrentinoaltoadi" + + "gemozilla-iotrentinos-tirolmtranbymuenstermuginozawaonsenmuikami" + + "satokaizukamikitayamatsuris-certifieducatorahimeshimamateramobar" + + "amukodairamulhouseoullensvanguardmunakatanemuncienciamuosattemup" + + "imientakinouemurmansklabudhabikinokawabarthadselectrentino-aadig" + + "emurotorcraftrentinostirolmusashimurayamatsusakahoginankokubunji" + + "s-foundationmusashinoharamuseetrentinosud-tirolmuseumverenigingm" + + "usicarbonia-iglesias-carboniaiglesiascarboniamutsuzawamy-vigorge" + + "my-wanggouvichromedicaltanissettairamyactivedirectorymyasustor-e" + + "lvdalmycdn77-sslattuminamiuonumassa-carrara-massacarraramassabus" + + "inessebyklecznagasakinderoymydattolocalhistorymyddnskingmydissen" + + "trentinosudtirolmydobisshikis-gonemydroboehringerikemydshowamyef" + + "fectrentinosued-tirolmyfirewallonieruchomoscienceandindustrynmyf" + + "oruminamiyamashirokawanabelembetsukubankhmelnytskyivanylvenicemy" + + "fritzmyftpaccesshowtimelhusdecorativeartshriramsterdamnserverban" + + "iamyhome-servermyjinomykolaivaomymailermymediapchungnamdalseidfj" + + "ordyndns-ipartis-a-chefashionishiwakis-a-conservativegarsheis-a-" + + "cpadualstackhero-networkinggroupartsannanissandiegomyokohamamats" + + "udamypepinkmpspbargainstantcloudfunctionswedenvironmentalconserv" + + "ationionjukudoyamaintenancempresashibetsukuiiyamanouchikuhokuryu" + + "gasakitashiobarauthordalanddnslivelanddnss3-eu-west-1mypetsienar" + + "utolgamyphotoshibalena-devicesigdalmypictetrentinosuedtirolmypsx" + + "n--30rr7ymysecuritycamerakermyshopblocksilknx-serverrankoshigaya" + + "nagawamytis-a-bloggermytuleapioneermyvnchurcharternidyndns-mailu" + + "bindalublindesnesannohelplfinancialucaniamywirepaircraftingvollo" + + "mbardiamondsimple-urlpizzapkolobrzegersundplantsirdalplatformsha" + + "ngrilapyplazaplcube-serversaillesjcbnpparibaselburgplumbingoplur" + + "inacionalpodhalewismillerpodlasiellaktyubinskiptveterinaireadthe" + + "docscappgafannefrankfurtrentinsud-tirolpodzonepohlpoivronpokerpo" + + "krovskomaganepoliticarrdpolitiendapolkowicepoltavalle-aostathell" + + "ezajskomakiyosunndalpomorzeszowitdkomatsushimarylandponpesaro-ur" + + "bino-pesarourbinopesaromasvuotnaritakurashikis-into-animeguroros" + + "hinkamigotoyohashimototalponypordenonepornporsangerporsangugepor" + + "sgrunnanyokoshibahikariwanumatakkoebenhavnpoznanpraxis-a-bookkee" + + "perspectakashimarnardalprdpreservationpresidioprgmrprimelbournep" + + "rincipeprivatizehealthinsuranceproductionslupskomforbarreauction" + + "-webhostingjerstadotsuruokakamigaharautomotiveconomiasakuchinots" + + "uchiurakawalbrzycharitysfjordds3-eu-west-2profesionalprogressive" + + "nneslaskerrylogisticslzpromombetsurgeonshalloffameiwamasoyproper" + + "typrotectionprotonetrentinsudtirolprudentialpruszkowithgoogleapi" + + "sa-hockeynutsiracusakatamayufuelveruminanoprvcyberlevagangaviika" + + "nonjis-into-carshinshinotsurgeryprzeworskogptplusgardenpulawypup" + + "ippugliapvhagakhanamigawapvtrentinsued-tirolpwcircustomer-ocimdb" + + "ananarepublicaseihicampobassociatest-iservecounterstrikehimejibm" + + "deportevadsobetsumidatlanticasertaipeiheijiitatebayashiibajddarc" + + "hitecturealtorlandevelopmentattoobservereviewsaintlouis-a-bruins" + + "fanayorovnoceanographics3-fips-us-gov-west-1pzqhagebostadqldqpon" + + "iatowadaqslingqualifioappiszquickconnectrentinsuedtirolquicksyte" + + "stingquipelementsnoasaitoshimattelekommunikationqvcistrondheimmo" + + "bilienissayokkaichiropractichirurgiens-dentistes-en-francesuzaka" + + "nazawasuzukaneyamazoesuzukis-leetrentino-sudtirolsvalbardunloppa" + + "cificitichiryukyuragifuchungbukharaumalborkashiwarasveiosvelviko" + + "morotsukaminoyamaxunjargasvizzerasvn-reposomnarviikamishihoronob" + + "eauxartsandcraftsokndalswidnicartoonartdecologiaswidnikkokaminok" + + "awanishiaizubangeswiebodzin-butterswiftcoverswinoujscienceandhis" + + "toryswissmarterthanyousynology-diskstationsynology-dsooturystyka" + + "nmakiwientuscanytushuissier-justicetuvalle-daostaticsor-varanger" + + "tuxfamilytwmailvestfoldvestnesorfoldvestre-slidreplantationvestr" + + "e-totennishiawakuravestvagoyvevelstadvibo-valentiavibovalentiavi" + + "deovillasorocabalsan-sudtirollagdenesnaaseinet-freaksolarssonvin" + + "nicasacamdvrcampinagrandebuilderschlesischesorreisahayakawakamii" + + "chikawamisatottoris-into-cartoonshinshirovinnytsiavipsinaappitts" + + "burghofficialvirginiavirtual-userveftpiwatevirtualservervirtualu" + + "servegame-servervirtueeldomein-vigorlicevirtuelvisakegawaviterbo" + + "knowsitallvivolkenkundenvixn--32vp30haibarakitahatakanabeautysva" + + "rdoesntexisteingeekazunow-dnsevenassisicilyvlaanderenvladikavkaz" + + "imierz-dolnyvladimirvlogintoyonezawavminiserversicherungvologdan" + + "skongsbergvolvolkswagentsortlandvolyngdalvoorloperauniterois-los" + + "trolekamakurazakiwakunigamiharutwentevossevangenvotevotingvotoyo" + + "nowloclawekongsvingerwmflabsorumincomcastresindevicenzaporizhzhi" + + "awnextdirectrogstadworldworse-thandawowithyoutuberspacekitagatar" + + "getmyiphostrodawarawpdevcloudwritesthisblogsytewroclawiwatsukiyo" + + "notairestaurantroandinosaurepbodynamic-dnsopotrentoyonakagyokuto" + + "yakokonoewtcminnesotaketakazakis-an-actresshinjukumanowtvallee-d" + + "-aosteigenwtfastvps-serveronakanotoddenwuozuwzmiuwajimaxn--3oq18" + + "vl8pn36axn--3pxu8koninjambylxn--42c2d9axn--45br5cylxn--45brj9civ" + + "ilisationisshinguccircleverappsanokasukabedzin-berlindasdaburxn-" + + "-45q11civilizationiyodogawaxn--4gbriminingxn--4it168dxn--4it797k" + + "onskowolayangroupictureshirahamatonbetsurnadalxn--4pvxs4allxn--5" + + "4b7fta0ccivilwarmiastagets-itozsdeltajimidorissagaeroclubmedecin" + + "cinnationwidealerxn--55qw42gxn--55qx5dxn--5js045dxn--5rtp49clanb" + + "ibaidarmeniaxn--5rtq34konsulatrobeepilepsykkylvenetodayxn--5su34" + + "j936bgsgxn--5tzm5gxn--6btw5axn--6frz82gxn--6orx2rxn--6qq986b3xlx" + + "n--7t0a264cldmailovecollegefantasyleaguernseyxn--80adxhksoundcas" + + "tronomy-routerxn--80ao21axn--80aqecdr1axn--80asehdbarrell-of-kno" + + "wledgeiseiyoichippubetsubetsugarugbyglandroverhalla-speziautosca" + + "nadaeguambulanceobninskaracoldwarszawaukraanghkeymachinewhampshi" + + "realtydalaskanittedallasalleangaviikaascolipicenodumemergencyach" + + "ts3-ca-central-1xn--80aswgxn--80augustownproviderxn--8ltr62konyv" + + "elolipopiemontexn--8pvr4uxn--8y0a063axn--90a3academiamicaaarbort" + + "eaches-yogasawaracingxn--90aeroportalabamagasakishimabaraogakibi" + + "chuoxn--90aishobarakawagoexn--90azhytomyravendbarsycenterprisesa" + + "kikuchikuseikarugamvikarasjokarasuyamarshallstatebankaratemrhclo" + + "udiscountyombolzano-altoadigeometre-experts-comptables3-us-west-" + + "1xn--9dbhblg6dietciprianiigataishinomakinkobayashikaoirmitakehar" + + "axn--9dbq2axn--9et52uxn--9krt00axn--andy-iraxn--aroport-byandexc" + + "loudxn--asky-iraxn--aurskog-hland-jnbarsyonlinewhollandiscourses" + + "3-us-west-2xn--avery-yuasakuhokkaidownloadxn--b-5gaxn--b4w605fer" + + "dxn--balsan-sdtirol-nsbsouthcarolinarvikommunexn--bck1b9a5dre4cl" + + "ickasumigaurawa-mazowszextraspace-to-rentalstomakomaibaraxn--bdd" + + "dj-mrabdxn--bearalvhki-y4axn--berlevg-jxaxn--bhcavuotna-s4axn--b" + + "hccavuotna-k7axn--bidr-5nachikatsuuraxn--bievt-0qa2xn--bjarky-fy" + + "aotsurreyxn--bjddar-ptarnobrzegyptianxn--blt-elabourxn--bmlo-gra" + + "ingerxn--bod-2natalxn--bozen-sdtirol-2obanazawaxn--brnny-wuacade" + + "my-firewall-gatewayxn--brnnysund-m8accident-investigation-aptibl" + + "eadpagest-mon-blogueurovision-k3southwestfalenxn--brum-voagatrom" + + "sakakinokiaxn--btsfjord-9zaxn--bulsan-sdtirol-nsbashkiriaveroyke" + + "ngerdalcesurancechirealmpmnavigationavoizumizakibigawaurskog-hol" + + "andingdyniaetnabudapest-a-la-masion-riopretobamaceratabuseating-" + + "organicasadelamonedapliernewspapereportateshinanomachimkentateya" + + "mabogadobeaemcloud66xn--c1avgxn--c2br7gxn--c3s14misakis-an-anarc" + + "historicalsocietyxn--cck2b3basicservercelliguriavocatanzarowebsp" + + "acebinordreisa-geekaragandaustevoll-o-g-i-natuurwetenschappenaum" + + "burggfarmerseine164-baltimore-og-romsdalipayboltatsunobihirosaki" + + "kamijimatsuuragrocerybnikeisenbahnaturhistorisches3-ap-southeast" + + "-1kappchizip6xn--cckwcxetdxn--cesena-forl-mcbremangerxn--cesenaf" + + "orl-i8axn--cg4bkis-not-certifiedugit-pagespeedmobilizeroticahces" + + "uoloanshintokushimaxn--ciqpnxn--clchc0ea0b2g2a9gcdxn--comunicaes" + + "-v6a2oxn--correios-e-telecomunicaes-ghc29axn--czr694basilicatani" + + "avoues3-eu-west-3utilitiesquare7xn--czrs0tromsojamisonxn--czru2d" + + "xn--czrw28basketballyngenhktjeldsundiscoveryomitanoceanographiqu" + + "eu-1xn--d1acj3batochiokinoshimaizuruhrxn--d1alfaromeoxn--d1atrus" + + "teexn--d5qv7z876clinichitachinakagawashtenawdev-myqnapcloudeitys" + + "nesandvikcoromantovalle-d-aostatic-accessanfranciscofreakunemuro" + + "rangehirnrtoyotomiyazakis-a-celticsfanishinomiyashironoxn--davve" + + "njrga-y4axn--djrs72d6uyxn--djty4kooris-a-patsfanxn--dnna-grajewo" + + "lterskluwerxn--drbak-wuaxn--dyry-iraxn--e1a4cliniquenoharaxn--ec" + + "kvdtc9dxn--efvn9sowaxn--efvy88hair-surveillancexn--ehqz56nxn--el" + + "qq16hakatanortonxn--estv75gxn--eveni-0qa01gaxn--f6qx53axn--fct42" + + "9kopervikhersonxn--fhbeiarnxn--finny-yuaxn--fiq228c5hspeedpartne" + + "rsolognexn--fiq64batsfjordishakotanhlfanhs3-website-ap-northeast" + + "-1xn--fiqs8spjelkavikomonowruzhgorodeoxn--fiqz9spreadbettingxn--" + + "fjord-lraxn--fjq720axn--fl-ziaxn--flor-jraxn--flw351exn--forl-ce" + + "sena-fcbsspydebergxn--forlcesena-c8axn--fpcrj9c3dxn--frde-grandr" + + "apidsrlxn--frna-woaraisaijosoyrovigotsukisosakitagawaxn--frya-hr" + + "axn--fzc2c9e2clintonoshoesantabarbaraxn--fzys8d69uvgmailxn--g2xx" + + "48clothingdustdataitogitsuldalucernexn--gckr3f0fauskedsmokorseta" + + "gayaseralingenoamishirasatogokasells-for-lessasebofageologyxn--g" + + "ecrj9cn-northwest-1xn--ggaviika-8ya47hakodatexn--gildeskl-g0axn-" + + "-givuotna-8yasakaiminatoyookaniepcexn--gjvik-wuaxn--gk3at1exn--g" + + "ls-elacaixaxn--gmq050is-savedunetflixilxn--gmqw5axn--h-2failxn--" + + "h1aeghakonexn--h2breg3evenesrvaporcloudxn--h2brj9c8cngroks-thisa" + + "yamanobeokakegawaxn--h3cuzk1digitalxn--hbmer-xqaxn--hcesuolo-7ya" + + "35bauhausposts-and-telecommunications3-website-ap-southeast-1xn-" + + "-hery-iraxn--hgebostad-g3axn--hkkinen-5waxn--hmmrfeasta-s4accide" + + "nt-prevention-rancherkasydneyxn--hnefoss-q1axn--hobl-iraxn--holt" + + "len-hxaxn--hpmir-xqaxn--hxt814exn--hyanger-q1axn--hylandet-54axn" + + "--i1b6b1a6a2exn--imr513nxn--indery-fyasugivingxn--io0a7is-slickh" + + "arkivalleeaosteinkjerusalembroideryxn--j1aefbsbxn--12cfi8ixb8lxn" + + "--j1amhakubahccavuotnagaraholtalenglandxn--j6w193gxn--jlq480n2rg" + + "xn--jlq61u9w7beneventoeidsvollimanowarudaxaustinnaval-d-aosta-va" + + "lleyokosukanumazuryokoteastcoastaldefenceatonsbergjemnes3-eu-cen" + + "tral-1xn--jlster-byasuokanoyakumoldeloittenrikuzentakataiwanairf" + + "orcebetsuikidsmynasushiobaragusartstorfjordxn--jrpeland-54axn--j" + + "vr189misasaguris-an-artistgoryxn--k7yn95exn--karmy-yuaxn--kbrq7o" + + "xn--kcrx77d1x4axn--kfjord-iuaxn--klbu-woaxn--klt787dxn--kltp7dxn" + + "--kltx9axn--klty5xn--3bst00mintelligencexn--koluokta-7ya57hakuis" + + "-a-hunterxn--kprw13dxn--kpry57dxn--kpu716fbx-osaskatchewanxn--kp" + + "ut3is-uberleetrentino-sued-tirolxn--krager-gyatomitamamuraxn--kr" + + "anghke-b0axn--krdsherad-m8axn--krehamn-dxaxn--krjohka-hwab49jdfa" + + "stlylbanzaicloudcontrolledekagaminombresciaustraliajudaicable-mo" + + "democraciabruzzoologicalvinklein-addrammenuorochesterimo-i-ranaa" + + "mesjevuemielno-ipifonyc66xn--ksnes-uuaxn--kvfjord-nxaxn--kvitsy-" + + "fyatsukanraxn--kvnangen-k0axn--l-1fairwindstorjdevcloudnshinyosh" + + "itomiokamitondabayashiogamagoriziaxn--l1accentureklamborghinikol" + + "aeventstpetersburgxn--laheadju-7yatsushiroxn--langevg-jxaxn--lcv" + + "r32dxn--ldingen-q1axn--leagaviika-52bentleyonagoyaxn--lesund-hua" + + "xn--lgbbat1ad8jelenia-goraxn--lgrd-poacctrvareservehalflifestyle" + + "xn--lhppi-xqaxn--linds-pramericanartrycloudflarezzoxn--lns-qlaqu" + + "ilanstreamswatch-and-clockerxn--loabt-0qaxn--lrdal-sraxn--lrensk" + + "og-54axn--lt-liacnpyatigorskodjeffersonxn--lten-granexn--lury-ir" + + "axn--m3ch0j3axn--mely-iraxn--merker-kuaxn--mgb2ddestudioxn--mgb9" + + "awbfbxosassaris-a-democratrapaniizaxn--mgba3a3ejtrysiljanxn--mgb" + + "a3a4f16axn--mgba3a4franamizuholdingstudynamisches-dnsolundbeckom" + + "munalforbundxn--mgba7c0bbn0axn--mgbaakc7dvfedorapeoplegnicanonoi" + + "chinomiyakexn--mgbaam7a8hakusanagochijiwadell-ogliastraderxn--mg" + + "bab2bdxn--mgbah1a3hjkrdxn--mgbai9a5eva00beppublishproxyzgorzelec" + + "coffeedbackplaneapplicationcloudappspotagerxn--mgbai9azgqp6jeonn" + + "amerikawauexn--mgbayh7gpaleoxn--mgbbh1a71exn--mgbc0a9azcgxn--mgb" + + "ca7dzdoxn--mgberp4a5d4a87gxn--mgberp4a5d4arxn--mgbgu82axn--mgbi4" + + "ecexposedxn--mgbpl2fhskydivingxn--mgbqly7c0a67fbcnsantacruzsanta" + + "fedjejuifmetlifeinsurancexn--mgbqly7cvafranziskanerimaringatlant" + + "akahashimamakiryuohdattowebcampinashikiminohostre-totendofintern" + + "et-dnsaliasiaxn--mgbt3dhdxn--mgbtf8flatangerxn--mgbtx2beskidyn-i" + + "p24xn--mgbx4cd0abbvieeexn--mix082fedoraprojectravelchannelxn--mi" + + "x891feiraquarelleaseeklogesaudaxn--mjndalen-64axn--mk0axin-dslgb" + + "tunesor-odalxn--mk1bu44cntrani-andria-barletta-trani-andriaxn--m" + + "kru45is-very-badajozxn--mlatvuopmi-s4axn--mli-tlarvikoryokamikaw" + + "anehonbetsurutaharaxn--mlselv-iuaxn--moreke-juaxn--mori-qsakurag" + + "awaxn--mosjen-eyawaraxn--mot-tlavagiskexn--mre-og-romsdal-qqbuse" + + "rveexchangexn--msy-ula0haldenxn--mtta-vrjjat-k7aflakstadaokagaki" + + "cks-assnasaarlandxn--muost-0qaxn--mxtq1misawaxn--ngbc5azdxn--ngb" + + "e9e0axn--ngbrxn--3ds443gxn--nit225kosaigawaxn--nmesjevuemie-tcba" + + "lsan-suedtirolkuszczytnoipirangalsacexn--nnx388axn--nodessakurai" + + "s-very-evillagexn--nqv7fs00emaxn--nry-yla5gxn--ntso0iqx3axn--nts" + + "q17gxn--nttery-byaeservehttpixolinoxn--nvuotna-hwaxn--nyqy26axn-" + + "-o1acheltenham-radio-openairbusantiquest-a-la-maisondre-landroid" + + "xn--o3cw4halsaikitahiroshimaoris-a-knightpointtohobby-sitexn--o3" + + "cyx2axn--od0algxn--od0aq3bestbuyshouses3-website-ap-southeast-2x" + + "n--ogbpf8flekkefjordxn--oppegrd-ixaxn--ostery-fyawatahamaxn--osy" + + "ro-wuaxn--otu796dxn--p1acfermochizukirovogradoyxn--p1ais-very-go" + + "odyearxn--pbt977coguchikuzenxn--pgbs0dhlxn--porsgu-sta26ferrarax" + + "n--pssu33lxn--pssy2uxn--q9jyb4collectionxn--qcka1pmckinseyxn--qq" + + "qt11misconfusedxn--qxa6axn--qxamuneustargardxn--rady-iraxn--rdal" + + "-poaxn--rde-ulavangenxn--rdy-0nabaris-very-nicexn--rennesy-v1axn" + + "--rhkkervju-01aferraris-a-designerxn--rholt-mragowoodsidemoneyxn" + + "--rhqv96gxn--rht27zxn--rht3dxn--rht61exn--risa-5nativeamericanan" + + "tiquestuff-4-salexn--risr-iraxn--rland-uuaxn--rlingen-mxaxn--rms" + + "kog-byaxn--rny31hammarfeastafricapetownnews-stagingxn--rovu88bet" + + "ainaboxfusejnyonagunicommbankaratsuginamikatagamilitaryoriikarel" + + "ianceu-2xn--rros-granvindafjordxn--rskog-uuaxn--rst-0naturalhist" + + "orymuseumcenterxn--rsta-francaiseharaxn--rvc1e0am3exn--ryken-vua" + + "xn--ryrvik-byaxn--s-1faithamurakamigoris-a-landscaperugiaxn--s9b" + + "rj9colognexus-2xn--sandnessjen-ogbhzcateringebuildingjesdalimite" + + "diskussionsbereichaseljeepsondriodejaneirockartuzyoshiokanzakiyo" + + "kawaraxn--sandy-yuaxn--sdtirol-n2axn--seral-lraxn--ses554gxn--sg" + + "ne-gratangenxn--skierv-utazastufftoread-booksnesolutionsokananii" + + "mihoboleslawiecitadeliveryggeexn--skjervy-v1axn--skjk-soaxn--skn" + + "it-yqaxn--sknland-fxaxn--slat-5naturalsciencesnaturellestuttgart" + + "revisohughesomaxn--slt-elabcieszynxn--smla-hraxn--smna-gratis-a-" + + "bulls-fanxn--snase-nraxn--sndre-land-0cbieigersundisrechtraining" + + "jovikariyaltakasugaincheonikonanporocpanamatsuzakindianapolis-a-" + + "anarchistoireggiocalabriaxn--snes-poaxn--snsa-roaxn--sr-aurdal-l" + + "8axn--sr-fron-q1axn--sr-odal-q1axn--sr-varanger-ggbielawalmartjm" + + "axxxboxenapponazure-mobileu-3xn--srfold-byaxn--srreisa-q1axn--sr" + + "um-grazxn--stfold-9xaxn--stjrdal-s1axn--stjrdalshalsen-sqbiellaa" + + "kesvuemielecceu-4xn--stre-toten-zcbieszczadygeyachimataikikugawa" + + "ltervistaprinternationalfirearms3-website-eu-west-1xn--t60b56axn" + + "--tckweatherchannelxn--tiq49xqyjetztrentino-suedtirolxn--tjme-hr" + + "axn--tn0agrinetbankosakaerodromegallupinbarrel-of-knowledgestack" + + "arasjohkamikoaniikappuboliviajessheimetacentrumeteorappalmaserat" + + "in-the-bandain-vpncasinordkappalmspringsakerevistaples3-us-gov-w" + + "est-1xn--tnsberg-q1axn--tor131oxn--trany-yuaxn--trentin-sd-tirol" + + "-rzbievat-band-campaniaxn--trentin-sdtirol-7vbifukagawashingtond" + + "clkarlsoyukindianmarketingladefinimakanegasakiraxn--trentino-sd-" + + "tirol-c3bigv-infoodnetworkangerxn--trentino-sdtirol-szbihorology" + + "ukuhashimoichinosekigaharaxn--trentinosd-tirol-rzbikedaejeonbukl" + + "ugsmileborkdalvdalaheadjudygarlandivtasvuodnakaiwamizawatchandcl" + + "ockarmoyurihonjournalistjohninohekinannestadivttasvuotnakamagaya" + + "habahcavuotnagaivuotnagaokakyotambabydgoszczecinemagentositelema" + + "rkarpaczeladzjampagefrontappanasonicatholicaxiashorokanaievje-og" + + "-hornnes3-website-sa-east-1xn--trentinosdtirol-7vbilbaokinawashi" + + "rosatochigiessensiositecnologiaxn--trentinsd-tirol-6vbillustrati" + + "onredumbrellahppiacenzachpomorskieninomiyakonojorpelandiyusuhara" + + "xn--trentinsdtirol-nsbioddaxn--trgstad-r1axn--trna-woaxn--troms-" + + "zuaxn--tysvr-vraxn--uc0atvarggatritonxn--uc0ay4axn--uist22handso" + + "nyoursidellogliastradingxn--uisz3gxn--unjrga-rtarumizusawaxn--un" + + "up4yxn--uuwu58axn--vads-jraxn--valle-aoste-ebbtunkomvuxn--2scrj9" + + "christmasakindlefrakkestadyndns-homednsanjotoyouraxn--valle-d-ao" + + "ste-ehbodollsusakis-into-gamessinazawaxn--valleaoste-e7axn--vall" + + "edaoste-ebbvacationsusonoxn--vard-jraxn--vegrshei-c0axn--vermgen" + + "sberater-ctbirdartcenterprisecloudcontrolapplebtimnetzlglassassi" + + "nationalheritagexn--vermgensberatung-pwbirkenesoddtangenovaranza" + + "nquanpachigasakievennodesabaerobatickets3-website-us-east-1xn--v" + + "estvgy-ixa6oxn--vg-yiabkhaziaxn--vgan-qoaxn--vgsy-qoa0jevnakersh" + + "uscultureggioemiliaromagnamsosnowiechristiansburgriwataraidyndns" + + "-freeboxosloftranakaniikawatanaguraxn--vgu402colonialwilliamsbur" + + "grondarxn--vhquvaroyxn--vler-qoaxn--vre-eiker-k8axn--vrggt-xqadx" + + "n--vry-yla5gxn--vuq861birthplacexn--w4r85el8fhu5dnraxn--w4rs40lx" + + "n--wcvs22dxn--wgbh1coloradoplateaudioxn--wgbl6axn--xhq521bjarkoy" + + "usuisservehumourxn--xkc2al3hye2axn--xkc2dl3a5ee0hangglidingxn--y" + + "9a3aquariumishimasudaxn--yer-znaturbruksgymnxn--yfro4i67oxn--yga" + + "rden-p1axn--ygbi2ammxn--3e0b707exn--ystre-slidre-ujbjerkreimbamb" + + "lebesbyeniwaizumiotsukumiyamazonawsmpplanetariumemorialillyolasi" + + "tebizenakanojoetsuwanouchikujogaszkolancashirecreationavuotnaple" + + "s3-external-1xn--zbx025dxn--zf0ao64axn--zf0avxn--3hcrj9civilavia" + + "tionissedaluccapitalonewportlligatoystre-slidrettozawaxn--zfr164" + + "bjugnieznord-frontierxnbayxz" // 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 @@ -522,8860 +524,8925 @@ const text = "9guacuiababia-goracleaningroks-theatree164-baltimore-og-romsdali" // [15 bits] text index // [ 6 bits] text length var nodes = [...]uint32{ - 0x32bd43, - 0x3ac204, - 0x2e8b86, - 0x2fe083, - 0x2fe086, - 0x389b46, - 0x3b0ec3, - 0x31f984, - 0x309b87, - 0x2e87c8, + 0x32ce03, + 0x243304, + 0x2d7946, + 0x215803, + 0x215806, + 0x38b3c6, + 0x3ae643, + 0x246d44, + 0x341047, + 0x2d7588, 0x1a000c2, - 0x1f3dd07, - 0x375009, - 0x2c444a, - 0x2c444b, - 0x22d043, - 0x2342c5, - 0x2206702, - 0x2483c4, - 0x25ba43, - 0x331e45, - 0x260dcc2, - 0x32eec3, - 0x2a1e744, - 0x30b345, - 0x2e240c2, - 0x26dc8e, - 0x253f83, - 0x3a7b46, - 0x3201842, - 0x2d02c7, - 0x236c86, - 0x3604b02, - 0x227483, - 0x280a84, - 0x2165c6, - 0x39fc48, - 0x289886, - 0x26f844, - 0x3a00b02, - 0x34a789, - 0x217307, - 0x200f46, - 0x274909, - 0x2fccc8, - 0x346d44, - 0x368ac6, - 0x255fc6, - 0x3e017c2, - 0x23938f, - 0x205b8e, - 0x2199c4, - 0x215ac5, - 0x32bc45, - 0x2e1d89, - 0x23cc09, - 0x216dc7, - 0x21e046, - 0x248903, - 0x4220f02, - 0x222e83, - 0x317cca, - 0x46020c3, - 0x248d45, - 0x2ffe82, - 0x38a8c9, - 0x4e02442, - 0x20c3c4, - 0x3b89c6, - 0x336d45, - 0x36c084, - 0x5637884, - 0x20a683, - 0x233684, - 0x5a026c2, - 0x250bc4, - 0x5e6c7c4, - 0x398e8a, + 0x1f3aec7, + 0x377a09, + 0x2c628a, + 0x2c628b, + 0x231b43, + 0x233805, + 0x2203042, + 0x212284, + 0x2d7ac3, + 0x203045, + 0x260c6c2, + 0x3290c3, + 0x2b22c44, + 0x33f285, + 0x2e0c182, + 0x26d6ce, + 0x24e5c3, + 0x3a36c6, + 0x3206082, + 0x2fd2c7, + 0x236086, + 0x3602982, + 0x27f103, + 0x27f104, + 0x397646, + 0x36bf08, + 0x288086, + 0x270104, + 0x3a00ac2, + 0x34cb09, + 0x2171c7, + 0x344986, + 0x28dfc9, + 0x32fa48, + 0x34b444, + 0x3947c6, + 0x336a46, + 0x3e03582, + 0x3da686, + 0x24070f, + 0x2112ce, + 0x217bc4, + 0x20d005, + 0x32cd05, + 0x2e1b49, + 0x23b549, + 0x397e47, + 0x3cffc6, + 0x28e143, + 0x4212082, + 0x2232c3, + 0x28da0a, + 0x4613583, + 0x3cea45, + 0x299082, + 0x38c209, + 0x4e02282, + 0x213c04, + 0x21fb46, + 0x2fff45, + 0x36db84, + 0x5643344, + 0x225843, + 0x232b84, + 0x5a03342, + 0x31fd84, + 0x5f8a244, + 0x2fe64a, 0x6200882, - 0x3b7607, - 0x206288, - 0x7202202, - 0x37e987, - 0x22d3c4, - 0x2c1807, - 0x22d3c5, - 0x351647, - 0x3cbf86, - 0x2ad604, - 0x32ec45, - 0x25bc47, - 0x82052c2, - 0x244683, - 0x20b582, - 0x3607c3, - 0x860d242, - 0x283a05, - 0x8a00202, - 0x243f44, - 0x2e1a05, - 0x219907, - 0x21f2ce, - 0x2b0444, - 0x265604, - 0x218a43, - 0x371bc9, - 0x257f0b, - 0x269488, - 0x2746c8, - 0x38c288, - 0x28da08, - 0x346b8a, - 0x351547, - 0x2c7086, - 0x8e4a0c2, - 0x309243, - 0x3ce603, - 0x3d0044, - 0x309283, - 0x3639c3, - 0x1739742, - 0x9202c42, - 0x27fe45, - 0x39eb86, - 0x281084, - 0x369247, - 0x250a06, - 0x2ba9c4, - 0x389207, - 0x203a83, - 0x96cb182, - 0x9a25a42, - 0x9e25802, - 0x225806, - 0xa200282, - 0x2850c5, - 0x33ac83, - 0x3c0604, - 0x2ef704, - 0x2ef705, - 0x3c4703, - 0xa64ce83, - 0xab3b5c2, - 0x28cf05, - 0x3da30b, - 0x2c004b, - 0x22afc4, - 0x3dc049, - 0x207fc4, - 0xae08202, - 0x208a43, - 0x208fc3, - 0xb201a42, - 0x2ee503, - 0x20a94a, - 0xb6010c2, - 0x2dca05, - 0x2e0f4a, - 0x38b104, - 0x20b083, - 0x20b944, - 0x20c483, - 0x20c484, - 0x20c487, - 0x20db85, - 0x210d86, - 0x211146, - 0x212103, - 0x215e08, - 0x20e383, - 0xba1c742, - 0x247308, - 0x37868b, - 0x220808, - 0x221346, - 0x221e87, - 0x225088, - 0xca07c02, - 0xcf25802, - 0x30b488, - 0x219047, - 0x314885, - 0x314888, - 0xd2bdcc8, - 0x2d4803, - 0x228bc4, - 0x389bc2, - 0xd629c02, - 0xda43fc2, - 0xe22b882, - 0x22b883, - 0xe605cc2, - 0x30f943, - 0x239944, - 0x212283, - 0x3cbd04, - 0x30ab0b, - 0x23af03, - 0x2ea246, - 0x23af04, - 0x2b920e, - 0x381c85, - 0x3a7c48, - 0x235dc7, - 0x235dca, - 0x226e43, - 0x3ac007, - 0x2580c5, - 0x22fc84, - 0x256786, - 0x256787, - 0x312944, - 0x22f5c7, - 0xea1f604, - 0x398b44, - 0x398b46, - 0x25b444, - 0x3c4e86, - 0x20b383, - 0x3d1dc8, - 0x20b388, - 0x2655c3, - 0x2ee4c3, - 0x343dc4, - 0x353ec3, - 0xf235d82, - 0xf68d142, - 0x208183, - 0x242d46, - 0x28ed83, - 0x23ab04, - 0xfa17b02, - 0x308183, - 0x217b03, - 0x212f82, - 0xfe014c2, - 0x2c5006, - 0x234f87, - 0x275487, - 0x209e85, - 0x396d84, - 0x29b045, - 0x23f907, - 0x2eb4c9, - 0x2fed86, - 0x300c48, - 0x3109c6, - 0x1022ec82, - 0x3019c8, - 0x3037c6, - 0x2d4b85, - 0x321b07, - 0x323144, - 0x323145, - 0x10731a84, - 0x331a88, - 0x10a0a602, - 0x10e00482, - 0x30c486, + 0x21ef47, + 0x27afc8, + 0x7204c82, + 0x2f6e47, + 0x2c2b84, + 0x2c2b87, + 0x3d6805, + 0x362187, + 0x2e73c6, + 0x27d8c4, + 0x328e45, + 0x256407, + 0x8a05802, + 0x3da803, + 0x21e182, + 0x369a03, + 0x8e09bc2, + 0x281705, + 0x9200202, + 0x3c2844, + 0x277445, + 0x217b07, + 0x2fdfce, + 0x2b1044, + 0x261dc4, + 0x20e5c3, + 0x251789, + 0x265f0b, + 0x273788, + 0x28dd88, + 0x2e53c8, + 0x28c008, + 0x34b28a, + 0x362087, + 0x276586, + 0x9615842, + 0x2be403, + 0x3cab03, + 0x3cd244, + 0x2be443, + 0x28ca83, + 0x1736f42, + 0x9a019c2, + 0x27e945, + 0x313dc6, + 0x2335c4, + 0x379907, + 0x263e46, + 0x2bfa04, + 0x399647, + 0x2019c3, + 0x9ecb4c2, + 0xa227682, + 0xa627442, + 0x227446, + 0xaa00282, + 0x285845, + 0x338483, + 0x3bfc44, + 0x2eddc4, + 0x2eddc5, + 0x3c7543, + 0xae48343, + 0xb338dc2, + 0x203c05, + 0x203c0b, + 0x20b24b, + 0x26bb44, + 0x204a09, + 0x205f44, + 0xb606802, + 0x207043, + 0x207183, + 0xba08082, + 0x2ed8ca, + 0xbe08342, + 0x212505, + 0x2de9ca, + 0x35cc04, + 0x208343, + 0x209ec4, + 0x20ba03, + 0x20ba04, + 0x20ba07, + 0x20c585, + 0x20d346, + 0x213006, + 0x213cc3, + 0x217f48, + 0x20db43, + 0xc209582, + 0x23d4c8, + 0x20958b, + 0x221cc8, + 0x222a86, + 0x224447, + 0x226fc8, + 0xd205b82, + 0xd6c1142, + 0x33f3c8, + 0x20f9c7, + 0x30f645, + 0x30f648, + 0xdadcf48, + 0x27ff43, + 0x22a104, + 0x38b442, + 0xde2a542, + 0xe243bc2, + 0xea2a8c2, + 0x22a8c3, + 0xee04042, + 0x30e303, + 0x237484, + 0x204043, + 0x206444, + 0x37454b, + 0x2094c3, + 0x2e94c6, + 0x27f404, + 0x2ba20e, + 0x381e45, + 0x3a37c8, + 0x3dd347, + 0x3dd34a, + 0x22f603, + 0x243107, + 0x2660c5, + 0x22f604, + 0x250206, + 0x250207, + 0x2fc304, + 0xf30f084, + 0x2fe304, + 0x2fe306, + 0x3db9c4, + 0x3ba486, + 0x226e03, + 0x3a8908, + 0x3c38c8, + 0x291d83, + 0x2ed883, + 0x346ac4, + 0x358183, + 0xfa09382, + 0xfe8b742, + 0x20b983, + 0x240d86, + 0x329383, + 0x35b7c4, + 0x102179c2, + 0x24a583, + 0x2179c3, + 0x214c82, + 0x10600d42, + 0x2c5c86, + 0x2344c7, + 0x2f8407, + 0x3a9405, + 0x207484, + 0x29bac5, + 0x267347, + 0x3cb009, + 0x2db306, + 0x2ea9c6, + 0x10a02c82, + 0x331448, + 0x31f486, + 0x34ebc5, + 0x3ac387, + 0x306104, + 0x306105, + 0x10e02c84, + 0x202c88, + 0x11203cc2, + 0x11600482, + 0x21d746, 0x200488, - 0x358345, - 0x359946, - 0x35e748, - 0x37c508, - 0x11205f85, - 0x11625344, - 0x2448c7, - 0x11a07a42, - 0x11ed5e42, - 0x13202782, - 0x3b8ac5, - 0x2a5f45, - 0x377c46, - 0x3a0ec7, - 0x22c487, - 0x13a2d7c3, - 0x2df287, - 0x348dc8, - 0x1da2d989, - 0x26de47, - 0x22de07, - 0x22e808, - 0x22f006, - 0x22f786, - 0x230bcc, - 0x23230a, - 0x232c87, - 0x23418b, - 0x234dc7, - 0x234dce, - 0x1de35c44, - 0x236204, - 0x239807, - 0x260147, - 0x23c4c6, - 0x23c4c7, - 0x337307, - 0x1e22bdc2, - 0x23de06, - 0x23de0a, - 0x23e20b, - 0x23fec7, - 0x240945, - 0x2414c3, - 0x241b06, - 0x241b07, - 0x272803, - 0x1e600102, - 0x24238a, - 0x1eb76cc2, - 0x1ee487c2, - 0x1f247002, - 0x1f636d82, - 0x247745, - 0x248484, - 0x1fe37982, - 0x250c45, - 0x231543, - 0x2080c5, - 0x204a44, - 0x20bc84, - 0x21f906, - 0x27f946, - 0x2a7843, - 0x3ba9c4, - 0x275783, - 0x20e02942, - 0x222204, - 0x244e46, - 0x222205, - 0x2576c6, - 0x321c08, - 0x28fd84, - 0x2102c8, - 0x39fa05, - 0x39f748, - 0x2bef86, - 0x359d87, - 0x26ec04, - 0x2226ec06, - 0x22645dc3, - 0x39cbc3, - 0x348188, - 0x332c04, - 0x22b5ed87, - 0x232de7c6, - 0x2de7c9, - 0x336088, - 0x38ca48, - 0x34a204, - 0x3c2b83, - 0x23e8c2, - 0x23652282, - 0x23a03e02, - 0x3c7983, - 0x23e12ac2, - 0x2f0a04, - 0x36f146, - 0x309cc5, - 0x21b1c3, - 0x2b5f07, - 0x3306c3, - 0x338108, - 0x214ec5, - 0x25cdc3, - 0x2e1985, - 0x2e1ac4, - 0x3034c6, - 0x217004, - 0x217b86, - 0x219846, - 0x206804, - 0x235183, - 0x2420d602, - 0x2479e645, + 0x335f85, + 0x34d406, + 0x351b08, + 0x35b088, + 0x11a07d45, + 0x11e25744, + 0x322d47, + 0x122059c2, + 0x1268cac2, + 0x13a0c302, + 0x21fc45, + 0x284a05, + 0x384006, + 0x326507, + 0x3a80c7, + 0x1422c0c3, + 0x318887, + 0x3a4548, + 0x1f22c289, + 0x26d887, + 0x22c9c7, + 0x22d408, + 0x22dc06, + 0x22f106, + 0x23000c, + 0x230d0a, + 0x231b87, + 0x2336cb, + 0x234307, + 0x23430e, + 0x1f635404, + 0x235604, + 0x237347, + 0x25bfc7, + 0x23ac06, + 0x23ac07, + 0x333e47, + 0x2e4003, + 0x1fa2ae02, + 0x23bec6, + 0x23beca, + 0x23c90b, + 0x23e487, + 0x23ef05, + 0x23f443, + 0x23f946, + 0x23f947, + 0x2ef083, + 0x1fe00102, + 0x24038a, + 0x20378f82, + 0x20661482, + 0x20a3d1c2, + 0x20e36182, + 0x242505, + 0x242cc4, + 0x21659dc2, + 0x31fe05, + 0x23cf03, + 0x2954c5, + 0x2028c4, + 0x20a204, + 0x280186, + 0x27e0c6, + 0x203e03, + 0x3bcfc4, + 0x2f8703, + 0x226081c2, + 0x2247c4, + 0x3232c6, + 0x2247c5, + 0x244086, + 0x3ac488, + 0x22b144, + 0x36b888, + 0x322805, + 0x37f488, + 0x2c24c6, + 0x3049c7, + 0x287804, + 0x23a87806, + 0x23ee85c3, + 0x39c943, + 0x2ec108, + 0x331344, + 0x24361707, + 0x24abe846, + 0x2dbb09, + 0x330048, + 0x34b8c8, + 0x355644, + 0x3c6d83, + 0x23cfc2, + 0x24e4cfc2, + 0x25201d42, + 0x204583, + 0x2560a782, + 0x2ef004, + 0x24ad06, + 0x21af83, + 0x2b6387, + 0x2f7443, + 0x334888, + 0x2101c5, + 0x259203, + 0x2773c5, + 0x277504, + 0x305e06, + 0x2127c6, + 0x217a46, + 0x2203c4, + 0x2346c3, + 0x25a05202, + 0x25e2ec05, 0x200843, - 0x24e16042, - 0x22d943, - 0x246385, - 0x25233743, - 0x25a33749, - 0x25e00942, - 0x26605242, - 0x28ca45, - 0x213986, - 0x20da06, - 0x2d0f48, - 0x2d0f4b, - 0x32dc4b, - 0x20a085, - 0x2cc809, - 0x1601982, - 0x2e8e88, - 0x21f084, - 0x26e01242, - 0x337943, - 0x27660306, - 0x27db08, - 0x27a01f02, - 0x310588, - 0x27e758c2, - 0x33f30a, - 0x282d2003, - 0x28b75646, - 0x399608, - 0x315848, - 0x3c0b46, - 0x386d47, - 0x239587, - 0x255b4a, - 0x38b184, - 0x35d884, - 0x374a49, - 0x28fabc05, - 0x205d86, - 0x219243, - 0x271e84, - 0x29202404, - 0x202407, - 0x29757a47, - 0x26e4c4, - 0x378c45, - 0x377d08, - 0x3a4587, - 0x249487, - 0x29a19d02, - 0x3c3844, - 0x293548, - 0x24aa44, - 0x24e444, - 0x24e805, - 0x24e947, - 0x29e4dbc9, - 0x250104, - 0x250f49, - 0x251188, - 0x251984, - 0x251987, - 0x2a252083, - 0x252747, - 0x1603582, - 0x16b0f82, - 0x253946, - 0x253fc7, - 0x254244, - 0x255047, - 0x256bc7, - 0x257843, - 0x2b06c2, - 0x20c742, - 0x2747c3, - 0x3be744, - 0x3be74b, - 0x2a6747c8, - 0x25c784, - 0x258ec5, - 0x25a687, - 0x25bec5, - 0x2e0b8a, - 0x25c6c3, - 0x2aa0e282, - 0x20e284, - 0x25ff09, - 0x263f83, - 0x264047, - 0x38c6c9, - 0x3d77c8, - 0x238983, - 0x27cb87, - 0x27dfc9, - 0x23fac3, - 0x2872c4, - 0x288c09, - 0x28ab06, - 0x219c03, - 0x205282, - 0x236883, - 0x2b0d87, - 0x236885, - 0x3cb4c6, - 0x2aea44, - 0x302fc5, - 0x279d03, - 0x212346, - 0x237482, - 0x24ce44, - 0x2ae0a1c2, - 0x2b22b083, - 0x2b604182, - 0x24c203, - 0x2115c4, - 0x2115c7, - 0x38b206, - 0x2023c2, - 0x2ba02382, - 0x321e04, - 0x2be0c602, - 0x2c212782, - 0x246644, - 0x246645, - 0x3cae05, - 0x365f46, - 0x2c609d82, - 0x360245, - 0x3c53c5, - 0x2270c3, - 0x211746, - 0x21c105, - 0x225782, - 0x357f85, - 0x225784, - 0x226203, - 0x228d03, - 0x2ca05142, - 0x233b47, - 0x251b04, - 0x251b09, - 0x271d84, - 0x28d503, - 0x39bf48, - 0x2cea5dc4, - 0x2a5dc6, - 0x2ab3c3, - 0x259703, - 0x220583, - 0x2d2ee042, - 0x300002, - 0x2d600642, - 0x33cd88, - 0x220108, - 0x3b1646, - 0x25c585, - 0x22c045, - 0x201887, - 0x2da78745, - 0x2068c2, - 0x2de96bc2, - 0x2e200042, - 0x31ed08, - 0x301905, - 0x2f5f44, - 0x257605, - 0x24a487, - 0x273244, - 0x242282, - 0x2e605002, - 0x34e6c4, - 0x221807, - 0x28f307, - 0x351604, - 0x3ced83, - 0x265504, - 0x265508, - 0x22fac6, - 0x25660a, - 0x3575c4, - 0x295548, - 0x28af44, - 0x221f86, - 0x296b84, - 0x3b8dc6, - 0x251dc9, - 0x245847, - 0x21f183, - 0x2ea07102, - 0x34a483, - 0x208402, - 0x2ee01d02, - 0x2f3206, - 0x380e08, - 0x2a7747, - 0x22a1c9, - 0x295109, - 0x2a8c85, - 0x2aa589, - 0x2aad45, - 0x2aae89, - 0x2abe05, - 0x2ac848, - 0x2f20c644, - 0x2f657987, - 0x22e1c3, - 0x2aca47, - 0x22e1c6, - 0x2ace87, - 0x2a48c5, - 0x2ba0c3, - 0x2fa320c2, - 0x20b2c4, - 0x2fe2bf42, - 0x302373c2, - 0x33c146, - 0x206205, - 0x2af987, - 0x32f343, - 0x363944, - 0x203f43, - 0x2c6883, - 0x306067c2, - 0x30e03d82, - 0x389c44, - 0x36b103, - 0x2fc5c5, - 0x31205e42, - 0x31a00bc2, - 0x2da6c6, - 0x332d44, - 0x321644, - 0x32164a, - 0x322005c2, - 0x244b03, - 0x2157ca, - 0x219c88, - 0x32622884, + 0x2660f4c2, + 0x22c243, + 0x373605, + 0x26a32c43, + 0x27232c49, + 0x27600942, + 0x27e04282, + 0x28b045, + 0x215e46, + 0x205606, + 0x2cf508, + 0x2cf50b, + 0x32ed0b, + 0x3a9605, + 0x2cbc09, + 0x1600b42, + 0x2cfc08, + 0x204d04, + 0x28601bc2, + 0x34a603, + 0x28e5c186, + 0x33e208, + 0x29201a02, + 0x28c608, + 0x29609802, + 0x33c4ca, + 0x29a46e03, + 0x2a378046, + 0x3910c8, + 0x330906, + 0x387087, + 0x240907, + 0x3365ca, + 0x35cc84, + 0x35fe04, + 0x376889, + 0x2a7a7545, + 0x2114c6, + 0x20fbc3, + 0x24bd04, + 0x2aa0d644, + 0x344147, + 0x2aee3587, + 0x293104, + 0x236cc5, + 0x3840c8, + 0x3a03c7, + 0x243547, + 0x2b20c202, + 0x298d44, + 0x294348, + 0x2443c4, + 0x249204, + 0x249b85, + 0x249cc7, + 0x2b658549, + 0x24a804, + 0x24b0c9, + 0x24b308, + 0x24ba84, + 0x24ba87, + 0x2ba4cdc3, + 0x24d2c7, + 0x2be014c2, + 0x16b1b82, + 0x24df86, + 0x24e607, + 0x24e884, + 0x24f687, + 0x250647, + 0x2510c3, + 0x2b12c2, + 0x20bcc2, + 0x28de83, + 0x3be3c4, + 0x3be3cb, + 0x2c28de88, + 0x258bc4, + 0x254205, + 0x255c47, + 0x238a05, + 0x2d908a, + 0x258b03, + 0x2c603d42, + 0x20da44, + 0x25bd89, + 0x2601c3, + 0x260287, + 0x2683c9, + 0x3de348, + 0x23e2c3, + 0x27c387, + 0x27ce49, + 0x266883, + 0x284fc4, + 0x286209, + 0x289406, + 0x2c7d43, + 0x2076c2, + 0x235c83, + 0x2b1987, + 0x235c85, + 0x3b8806, + 0x26e144, + 0x3cc645, + 0x279803, + 0x213f06, + 0x210dc3, + 0x204c02, + 0x248304, + 0x2ca6bc02, + 0x2ce6bc03, + 0x2d2020c2, + 0x247603, + 0x213484, + 0x239bc7, + 0x216586, + 0x278042, + 0x2d65c582, + 0x3ac684, + 0x2da0bb82, + 0x2de063c2, + 0x2b36c4, + 0x2b36c5, + 0x27d545, + 0x366a06, + 0x2e204882, + 0x3bd645, + 0x3cedc5, + 0x204883, + 0x21a286, + 0x21b845, + 0x2273c2, + 0x35acc5, + 0x2273c4, + 0x22b083, + 0x22b2c3, + 0x2e61d302, + 0x256607, + 0x24b504, + 0x24b509, + 0x24bc04, + 0x284883, + 0x39bf88, + 0x2ea84884, + 0x284886, + 0x2a6b43, + 0x254c43, + 0x228b03, + 0x2eeedc82, + 0x302342, + 0x2f200642, + 0x339f48, + 0x301408, + 0x3aedc6, + 0x272945, + 0x2802c5, + 0x345387, + 0x2f677f05, + 0x220482, + 0x2fa97642, + 0x2fe00042, + 0x278cc8, + 0x31f3c5, + 0x2f3e44, + 0x243fc5, + 0x245547, + 0x27a1c4, + 0x240282, + 0x30205702, + 0x352784, + 0x222f47, + 0x28cf47, + 0x362144, + 0x3cc143, + 0x291cc4, + 0x291cc8, + 0x22f446, + 0x25008a, + 0x2eb544, + 0x296008, + 0x242ec4, + 0x224546, + 0x297604, + 0x21ff46, + 0x24b7c9, + 0x2a62c7, + 0x2087c3, + 0x306033c2, + 0x34b643, + 0x206a02, + 0x30a17d82, + 0x2fb0c6, + 0x380708, + 0x2a8787, + 0x26ad49, + 0x2ad689, + 0x2aa9c5, + 0x2abd49, + 0x2ac545, + 0x2ad385, + 0x2ae008, + 0x30e04104, + 0x31251207, + 0x22cd83, + 0x2ae207, + 0x22cd86, + 0x2ae607, + 0x2a5e45, + 0x22c603, + 0x31630ac2, + 0x208584, + 0x31a0adc2, + 0x31e04742, + 0x3ae186, + 0x27af45, + 0x2b0587, + 0x2fef43, + 0x28ca04, + 0x201e83, + 0x20f703, + 0x32203dc2, + 0x32a01cc2, + 0x38b4c4, + 0x3881c3, + 0x2fbf45, + 0x32e00f42, + 0x33602b82, + 0x2d5c86, + 0x2fdf04, + 0x303f04, + 0x303f0a, + 0x33e005c2, + 0x263f43, + 0x20cd0a, + 0x214388, + 0x34224e44, 0x2005c3, - 0x32a038c3, - 0x281709, - 0x252d49, - 0x2b6006, - 0x32e19e43, - 0x21c445, - 0x31de8d, - 0x219e46, - 0x21bccb, - 0x33204c02, - 0x2b2c48, - 0x36215f02, - 0x36604c82, - 0x375e05, - 0x36a01b82, - 0x230047, - 0x2adec7, - 0x204383, - 0x341788, - 0x36e06102, - 0x3b9c84, - 0x219583, - 0x328085, - 0x23e906, - 0x220d44, - 0x2ee483, - 0x2b1e03, - 0x37202d42, - 0x20a004, - 0x3bc2c5, - 0x2b0987, - 0x27a143, - 0x2b1403, - 0x16b14c2, - 0x2b14c3, - 0x2b1d83, - 0x376035c2, - 0x3b7d44, - 0x27fb46, - 0x2e6343, - 0x2b22c3, - 0x37a4d442, - 0x24d448, - 0x2b3204, - 0x368486, - 0x25d187, - 0x29b3c6, - 0x36f744, - 0x45a015c2, - 0x22e08b, - 0x2f90ce, - 0x21450f, - 0x2b0fc3, - 0x4625d602, - 0x1637542, - 0x46603882, - 0x295ac3, - 0x209503, - 0x21d046, - 0x2eb746, - 0x21ac87, - 0x30e184, - 0x46a13ac2, - 0x46e0a3c2, - 0x241385, - 0x2fa2c7, - 0x2b4ac6, - 0x47248702, - 0x32e844, - 0x2bab43, - 0x47653a42, - 0x47b70e03, - 0x2bbb44, - 0x2c0a89, - 0x47ec80c2, - 0x48203942, - 0x203945, - 0x486c8e02, - 0x48a06ac2, - 0x35be87, - 0x3b2349, - 0x37528b, - 0x239345, - 0x26a549, - 0x26d1c6, - 0x38f987, - 0x48e0e984, - 0x3d5849, - 0x37b387, - 0x20f607, - 0x22bb83, - 0x2b2ac6, - 0x32a947, - 0x20bec3, - 0x3ca646, - 0x4960ac02, - 0x49a339c2, - 0x3b5543, - 0x38aa85, - 0x21ee87, - 0x2eb846, - 0x236805, - 0x251304, - 0x2a3dc5, - 0x38bc44, - 0x49e00f82, - 0x274d87, - 0x2c5c44, - 0x23bf84, - 0x34998d, - 0x2d9189, - 0x22be88, - 0x203bc4, - 0x3b9445, - 0x20df07, - 0x210184, - 0x267b87, - 0x357285, - 0x4a214a04, - 0x2b4085, - 0x262c44, - 0x2b1a46, - 0x3a0cc5, - 0x4a624ec2, - 0x30c403, - 0x35cf44, - 0x35cf45, - 0x3520c6, - 0x236945, - 0x238904, - 0x34c603, - 0x4aa12a06, - 0x2676c5, - 0x282305, - 0x3a0dc4, - 0x2e5a43, - 0x2e5a4c, - 0x4aeb0a82, - 0x4b203502, - 0x4b600b42, + 0x34601803, + 0x266ac9, + 0x24d8c9, + 0x2b6486, + 0x34a14543, + 0x36f705, + 0x3b62cd, + 0x214546, + 0x219e4b, + 0x34e129c2, + 0x394608, + 0x38218042, + 0x38604dc2, + 0x2b3905, + 0x38a01742, + 0x2c67c7, 0x214903, - 0x214904, - 0x4ba08002, - 0x37e508, - 0x3cb585, - 0x24b304, - 0x367a46, - 0x4be0f1c2, - 0x4c205e82, - 0x4c601442, - 0x28c045, - 0x2066c6, - 0x357984, - 0x216b06, - 0x371f86, - 0x210043, - 0x4cb4b2ca, - 0x271cc5, - 0x317c83, - 0x209b86, - 0x209b89, - 0x224207, - 0x2a4ec8, - 0x2fcb89, - 0x331688, - 0x226b86, - 0x218a03, - 0x4cedf302, - 0x3a1788, - 0x4d24ab82, - 0x4d6024c2, - 0x22a243, - 0x2e43c5, - 0x26ae44, - 0x211ec9, - 0x2e14c4, - 0x21a048, - 0x4de08443, - 0x4e30af84, - 0x2139c8, - 0x3498c7, - 0x4e65e5c2, - 0x23f1c2, - 0x32bbc5, - 0x265dc9, - 0x205e03, - 0x281304, - 0x31de44, - 0x20df83, - 0x2835ca, - 0x4ea01582, - 0x4ee0b102, - 0x2cb103, - 0x38e683, - 0x162d842, - 0x308a43, - 0x4f202dc2, - 0x4f600c02, - 0x4fb216c4, - 0x3dcb86, - 0x39ba06, - 0x226244, - 0x279343, - 0x3bb343, - 0x4fecb283, - 0x23e586, - 0x3a4dc5, - 0x2cc1c7, - 0x2cee45, - 0x2d0006, - 0x2d1208, - 0x2d1406, - 0x207304, - 0x29c1cb, - 0x2d6043, - 0x2d6045, - 0x2d6c88, - 0x2104c2, - 0x35c182, - 0x502477c2, - 0x50600e82, - 0x200e83, - 0x50a6cec2, - 0x26cec3, - 0x2d7683, - 0x51224682, - 0x516dc3c6, - 0x2594c6, - 0x51ab2e42, - 0x51e09002, - 0x52228d42, - 0x52645ec2, - 0x52a1a282, - 0x52e01342, - 0x20ed83, - 0x2c9e05, - 0x327d86, - 0x53205184, - 0x244c4a, - 0x3aa406, - 0x20c844, - 0x201c43, - 0x53e02a42, - 0x202642, - 0x22d903, - 0x54206b43, - 0x366547, - 0x3a0bc7, - 0x55ee7247, - 0x3cd307, - 0x227983, - 0x35fc8a, - 0x235fc4, - 0x31b684, - 0x31b68a, - 0x22c5c5, - 0x56205d42, - 0x255003, - 0x56600602, - 0x251ac3, - 0x34a443, - 0x56e00582, - 0x348d44, - 0x201a84, - 0x3bf805, - 0x322885, - 0x2aa2c6, - 0x2b6c06, - 0x5724fd42, - 0x576013c2, - 0x37a405, - 0x2591d2, - 0x34f1c6, - 0x24e703, - 0x304c46, - 0x2b4545, - 0x160a982, - 0x5fa0af02, - 0x3743c3, - 0x20af03, - 0x288883, - 0x5fe1a682, - 0x23d443, - 0x6060cc82, - 0x2a7503, - 0x3b7d88, - 0x2a8b03, - 0x2a8b06, - 0x32f7c7, - 0x324a06, - 0x324a0b, - 0x20c787, - 0x347f84, - 0x60e00e42, - 0x3cb405, - 0x61212b03, - 0x2050c3, - 0x28e805, - 0x332f43, - 0x61b32f46, - 0x2e900a, - 0x2a3083, - 0x2164c4, + 0x21ba08, + 0x38e02cc2, + 0x219384, + 0x20ff03, + 0x2f7ac5, + 0x23d006, + 0x21e244, + 0x2ed843, + 0x2b26c3, + 0x392163c2, + 0x3a9584, + 0x3b77c5, + 0x2b1587, + 0x279c43, + 0x2b2183, + 0x16b2242, + 0x2b2243, + 0x2b2643, + 0x39600e02, + 0x246b84, + 0x27e2c6, + 0x3cba43, + 0x2b2d43, + 0x39a48902, + 0x248908, + 0x2b3d84, + 0x20ed06, + 0x255087, + 0x270906, + 0x291e84, + 0x47e01b82, + 0x22cc4b, + 0x2f91ce, + 0x216c0f, + 0x292e43, + 0x48659902, + 0x163ea82, + 0x48a017c2, + 0x296583, + 0x20e883, + 0x2dd4c6, + 0x3cb286, + 0x2b0187, + 0x30b0c4, + 0x48e11902, + 0x492106c2, + 0x245005, + 0x2f1887, + 0x2b47c6, + 0x496526c2, + 0x2526c4, + 0x2b93c3, + 0x49a4e082, + 0x49f72383, + 0x2bac04, + 0x2c1d89, + 0x4a2c8c82, + 0x4a601882, + 0x201885, + 0x4aac9182, + 0x4ae03c42, + 0x35f107, + 0x377c8b, + 0x2406c5, + 0x2570c9, + 0x268746, + 0x4b207844, + 0x328949, + 0x2c9cc7, + 0x32a547, + 0x22abc3, + 0x2b3546, + 0x3246c7, + 0x20a443, + 0x291246, + 0x4ba23342, + 0x4be1d702, + 0x34b783, + 0x38c3c5, + 0x221587, + 0x3cb386, + 0x235c05, + 0x24b484, + 0x2a4d05, + 0x38cf44, + 0x4c201b02, + 0x2c71c4, + 0x267f44, + 0x38830d, + 0x37adc9, + 0x22aec8, + 0x201b04, + 0x3dad85, + 0x3a8e87, + 0x206504, + 0x263f07, + 0x2eb205, + 0x4c607b04, + 0x2a8b45, + 0x25ee84, + 0x27a306, + 0x35f885, + 0x4ca26902, + 0x21d6c3, + 0x28f783, + 0x348084, + 0x348085, + 0x37c586, + 0x235d45, + 0x3d3284, + 0x32c043, + 0x4ce0a6c6, + 0x225045, + 0x225c85, + 0x326404, + 0x2eb5c3, + 0x2eb5cc, + 0x4d204482, + 0x4d601442, + 0x4da03102, + 0x20e403, + 0x20e404, + 0x4de05f82, + 0x380d88, + 0x3b88c5, + 0x2c93c4, + 0x23aa86, + 0x4e217002, + 0x4e6115c2, + 0x4ea00c42, + 0x291a85, + 0x220286, + 0x20d584, + 0x397b86, + 0x21ed06, + 0x221983, + 0x4ee9e10a, + 0x279e05, + 0x28d9c3, + 0x2254c6, + 0x3bd449, + 0x2254c7, + 0x2a9c48, + 0x32f909, + 0x3b9e48, + 0x303706, + 0x20e583, + 0x4f21fc02, + 0x39dc88, + 0x4f644502, + 0x4fa06a42, + 0x238cc3, + 0x2e2a45, + 0x29b404, + 0x2f5d89, + 0x32acc4, + 0x3dabc8, + 0x50206a43, + 0x507749c4, + 0x215e88, + 0x388247, + 0x50a52742, + 0x22e302, + 0x32cc85, + 0x261b89, + 0x211543, + 0x27fcc4, + 0x36f6c4, + 0x20e903, + 0x2812ca, + 0x50f40d82, + 0x512083c2, + 0x2cb443, + 0x38f5c3, + 0x162c142, + 0x2bdc03, + 0x5161d902, + 0x51a00bc2, + 0x51f03f84, + 0x3b3506, + 0x269884, + 0x278b03, + 0x3bf203, + 0x52200bc3, + 0x23cc86, + 0x3a0e45, + 0x2cb5c7, + 0x2cf7c6, + 0x2d0648, + 0x2d0846, + 0x2035c4, + 0x29cd0b, + 0x2d3643, + 0x2d3645, + 0x21fdc2, + 0x35f402, + 0x52642582, + 0x52a05a02, + 0x215fc3, + 0x52e6bf42, + 0x26bf43, + 0x2d46c3, + 0x5360cac2, + 0x53ad9bc6, + 0x257906, + 0x53ed9d02, + 0x542071c2, + 0x5462b302, + 0x54a09082, + 0x54e18942, + 0x552050c2, + 0x208b03, + 0x26cb45, + 0x379b06, + 0x55617b84, + 0x3230ca, + 0x3a5d46, + 0x20bdc4, + 0x28dd43, + 0x56212b02, + 0x205642, + 0x22c203, + 0x5660a803, + 0x3b8307, + 0x35f787, + 0x58ae4447, + 0x39e847, + 0x229183, + 0x333b4a, + 0x340644, + 0x319084, + 0x31908a, + 0x3a8205, + 0x58e11482, + 0x24df43, + 0x59200602, + 0x24bbc3, + 0x34b603, + 0x59a00582, + 0x3a44c4, + 0x345584, + 0x3b0645, + 0x31e4c5, + 0x2e4a06, + 0x304146, + 0x59e39242, + 0x5a202f42, + 0x33d185, + 0x257612, + 0x353286, + 0x270e03, + 0x356606, + 0x31cd05, + 0x16045c2, + 0x626080c2, + 0x376203, + 0x2080c3, + 0x396203, + 0x62a18d42, + 0x23a183, + 0x63223242, + 0x220103, + 0x300808, + 0x239503, + 0x239506, + 0x3c4d87, + 0x321186, + 0x32118b, + 0x20bd07, + 0x2ebf04, + 0x63a00c02, + 0x3b8745, + 0x63e09783, + 0x21d283, + 0x2e60c5, + 0x333a43, + 0x64733a46, + 0x3c8fca, + 0x2a3fc3, + 0x235f44, 0x2003c6, - 0x2d4f86, - 0x61e3cf83, - 0x363807, - 0x281607, - 0x29dbc5, - 0x2ec406, - 0x267703, - 0x64a11983, - 0x64e01002, - 0x6533ef04, - 0x3c2249, - 0x3c7a05, - 0x22c244, - 0x34e0c8, - 0x2e6185, - 0x656e75c5, - 0x240ac9, - 0x201003, - 0x248744, - 0x65a02142, - 0x213d03, - 0x65e76402, - 0x276406, - 0x1678842, - 0x662201c2, - 0x28bf48, - 0x291f83, - 0x2b3fc7, - 0x2b1545, - 0x2b3b85, - 0x324c8b, - 0x2e8146, - 0x324e86, - 0x2e96c6, - 0x27f1c4, - 0x2c0c86, - 0x666d9d88, - 0x23afc3, - 0x23d903, - 0x23d904, - 0x38c084, - 0x316147, - 0x2ed4c5, - 0x66aed602, - 0x66e06a82, - 0x6761b085, - 0x2b8044, - 0x2daccb, - 0x2ef608, - 0x2525c4, - 0x67a2bd02, - 0x67e23802, - 0x3c4e03, - 0x2f15c4, - 0x2f1885, - 0x2f2247, - 0x2f5a84, - 0x351704, - 0x68213c42, - 0x37ab09, - 0x2f6bc5, - 0x239605, - 0x2f7745, - 0x68613c43, - 0x2f8644, - 0x2f864b, - 0x2f8984, - 0x2f8c4b, - 0x2f9c85, - 0x21464a, - 0x2fa7c8, - 0x2fa9ca, - 0x2fb203, - 0x2fb20a, - 0x68e0a0c2, - 0x69241f42, - 0x6961f4c3, - 0x69afed02, - 0x2fed03, - 0x69f52a42, - 0x6a33b402, - 0x2ffbc4, - 0x215f46, - 0x216845, - 0x300e43, - 0x32c306, - 0x216345, - 0x2e4a44, - 0x6a600902, - 0x2a1344, - 0x2cc48a, - 0x336fc7, - 0x3332c6, - 0x3abe47, - 0x23de43, - 0x2bbb88, - 0x37eb4b, - 0x2c12c5, - 0x2a9c05, - 0x2a9c06, - 0x2ec744, - 0x210f48, - 0x222b03, - 0x255ec4, - 0x255ec7, - 0x347bc6, - 0x3ccb06, - 0x2b904a, - 0x250fc4, - 0x2fba4a, - 0x6ab30086, - 0x330087, - 0x258f47, - 0x275dc4, - 0x275dc9, - 0x2ff605, - 0x3cc44b, - 0x2ee903, - 0x217d43, - 0x6ae1d583, - 0x2ca004, - 0x6b200682, - 0x229446, - 0x6b6b9e45, - 0x304e85, - 0x253b86, - 0x29fe44, - 0x6ba02542, - 0x241504, - 0x6be16f82, - 0x2d5745, - 0x32ffc4, - 0x6ca1b683, - 0x6ce01e82, - 0x201e83, - 0x237086, - 0x6d209482, - 0x391a48, - 0x224084, - 0x224086, - 0x38ef06, - 0x6d65a744, - 0x212985, - 0x225248, - 0x226087, - 0x246747, - 0x24674f, - 0x293446, - 0x231c83, - 0x23c644, - 0x20e4c3, - 0x2220c4, - 0x254144, - 0x6da02c02, - 0x28ce43, - 0x338dc3, - 0x6de02002, - 0x227683, - 0x2259c3, - 0x20dc0a, - 0x273b07, - 0x25984c, - 0x259b06, - 0x25c186, - 0x25ce87, - 0x6e22ec47, - 0x268049, - 0x247444, - 0x269ac4, - 0x6e600ec2, - 0x6ea01bc2, - 0x2b9406, - 0x363604, - 0x28d2c6, - 0x22f0c8, - 0x38ab44, - 0x230086, - 0x20d9c5, - 0x6ee83048, - 0x241c03, - 0x287a45, - 0x288203, - 0x239703, - 0x239704, - 0x20e243, - 0x6f24d882, - 0x6f601282, - 0x2ee7c9, - 0x28be45, - 0x28c144, - 0x317f05, - 0x297104, - 0x3a1fc7, - 0x36aac5, - 0x6fa3d804, - 0x23d808, - 0x2d9f46, - 0x2dcb04, - 0x2e1348, - 0x2e1c47, - 0x6fe037c2, - 0x2e8684, - 0x303104, - 0x2c1a07, - 0x70207c44, - 0x22b302, - 0x70603842, - 0x203843, - 0x203844, - 0x29e943, - 0x29e945, - 0x70a388c2, - 0x2fff05, - 0x2801c2, - 0x307d85, - 0x3b49c5, - 0x70e15042, - 0x217a84, - 0x71203002, - 0x25e406, - 0x2ba6c6, - 0x265f08, - 0x2c2988, - 0x33c0c4, - 0x305d85, - 0x3a6509, - 0x20a104, - 0x2e8fc4, - 0x206903, - 0x71655c85, - 0x243185, - 0x2a15c4, - 0x35248d, - 0x308102, - 0x353f43, - 0x354c83, - 0x71a02702, - 0x391505, - 0x220f87, - 0x2b9f44, - 0x3cd3c7, - 0x2fcd89, - 0x2cc5c9, - 0x202703, - 0x278688, - 0x2f9889, - 0x2f7a07, - 0x3da885, - 0x37e1c6, - 0x380fc6, - 0x3a60c5, - 0x2d9285, - 0x71e03b42, - 0x27b445, - 0x2b8308, - 0x2c4dc6, - 0x72206ec7, - 0x26e404, - 0x335187, - 0x302c86, - 0x72641542, - 0x351dc6, - 0x30740a, - 0x307c85, - 0x72ae9d02, - 0x72e8f4c2, - 0x33f806, - 0x323448, - 0x7328f4c7, - 0x73639102, - 0x28a5c3, - 0x209786, - 0x224e44, - 0x27e606, - 0x33bd46, - 0x20720a, - 0x331f45, - 0x328c46, - 0x32e243, - 0x32e244, - 0x202742, - 0x332cc3, - 0x73a14942, - 0x2d15c3, - 0x215a44, - 0x2c3184, - 0x73f2358a, - 0x21c4c3, - 0x226c4a, - 0x239dc7, - 0x312e86, - 0x25e2c4, - 0x20c702, - 0x2a6742, - 0x742007c2, - 0x2654c3, - 0x258d07, + 0x34efc6, + 0x64a16603, + 0x340007, + 0x2669c7, + 0x29e985, + 0x26f486, + 0x2158c3, + 0x6761a4c3, + 0x67a00a82, + 0x67e8f804, + 0x3c36c9, + 0x2137c5, + 0x229bc4, + 0x354e88, + 0x2e47c5, + 0x682352c5, + 0x23f549, + 0x344a43, + 0x261404, + 0x686161c2, + 0x2161c3, + 0x68a74542, + 0x274546, + 0x1678002, + 0x68e08f82, + 0x291988, + 0x291c83, + 0x2a8a87, + 0x2b2745, + 0x2b22c5, + 0x2b22cb, + 0x2e8206, + 0x2b24c6, + 0x23bb44, + 0x2e8946, + 0x69321408, + 0x27f4c3, + 0x264503, + 0x264504, + 0x2e51c4, + 0x2ea707, + 0x2ec545, + 0x696ec682, + 0x69a08242, + 0x6a21ae45, + 0x2b8f44, + 0x2d244b, + 0x2edcc8, + 0x250f44, + 0x6a62ad42, + 0x6aa23c42, + 0x3ba403, + 0x2efb84, + 0x2efe45, + 0x2f0607, + 0x2f3984, + 0x362244, + 0x6ae16102, + 0x37b5c9, + 0x2f4c05, + 0x240985, + 0x2f5cc5, + 0x6b216103, + 0x2f67c4, + 0x2f67cb, + 0x2f8a84, + 0x2f8d4b, + 0x2f95c5, + 0x216d4a, + 0x2f9e88, + 0x2fa08a, + 0x2fa883, + 0x2fa88a, + 0x6ba13602, + 0x6be20082, + 0x6c2ba0c3, + 0x6c6fdb02, + 0x2fdb03, + 0x6caed182, + 0x6cf38c02, + 0x301f04, + 0x218086, + 0x3978c5, + 0x303c03, + 0x32d3c6, + 0x3973c5, + 0x3d2dc4, + 0x6d200902, + 0x29fc84, + 0x2cb88a, + 0x3001c7, + 0x32a006, + 0x242f47, + 0x23bf03, + 0x2bac48, + 0x3c608b, + 0x2b6585, + 0x2c26c5, + 0x2c26c6, + 0x229984, + 0x3a4f48, + 0x20f883, + 0x25b984, + 0x336947, + 0x2ebb46, + 0x340846, + 0x2ba04a, + 0x24b144, + 0x31b14a, + 0x6d7009c6, + 0x3009c7, + 0x254287, + 0x273f04, + 0x273f09, + 0x251e05, + 0x234f8b, + 0x2ed083, + 0x212983, + 0x6da1de03, + 0x331d84, + 0x6de00682, + 0x228906, + 0x6e2bb4c5, + 0x356845, + 0x24e1c6, + 0x2a1384, + 0x6e602442, + 0x23f484, + 0x6ea0a982, + 0x3287c5, + 0x34c884, + 0x6f61b443, + 0x6fa08102, + 0x208103, + 0x3062c6, + 0x6fe04e82, + 0x392248, + 0x225344, + 0x225346, + 0x38fe46, + 0x70255d04, + 0x20a645, + 0x225648, + 0x227187, + 0x34e087, + 0x34e08f, + 0x294246, + 0x23b743, + 0x23fac4, + 0x20dc83, + 0x224684, + 0x24e784, + 0x706085c2, + 0x28b443, + 0x335543, + 0x70a09482, + 0x209483, + 0x227603, + 0x20c60a, + 0x272bc7, + 0x25398c, + 0x70e53c46, + 0x253dc6, + 0x254d87, + 0x7122d847, + 0x25aac9, + 0x23d604, + 0x71660404, + 0x71a16002, + 0x71e02e42, + 0x2ba406, + 0x33fe04, + 0x28b8c6, + 0x22dcc8, + 0x38c484, + 0x2d7b46, + 0x2055c5, + 0x7228a748, + 0x23fa43, + 0x314705, + 0x28dc43, + 0x240a83, + 0x240a84, + 0x20da03, + 0x72648d42, + 0x72a03382, + 0x2ecf49, + 0x291b85, + 0x292544, + 0x296b45, + 0x209b04, + 0x2cd147, + 0x35a545, + 0x72e46484, + 0x2d2088, + 0x2d2f86, + 0x2dedc4, + 0x2e13c8, + 0x2e1a07, + 0x73201702, + 0x2e99c4, + 0x310d44, + 0x2c2d87, + 0x73605bc4, + 0x215782, + 0x73a01782, + 0x201783, + 0x201784, + 0x29f703, + 0x2aed05, + 0x73e2e942, + 0x302245, + 0x287582, + 0x30a205, + 0x3c0085, + 0x74210342, + 0x217944, + 0x74602602, + 0x28eb86, + 0x2bf706, + 0x261cc8, + 0x2c3748, + 0x3ae104, + 0x30ed05, + 0x3abbc9, + 0x2cfd44, + 0x3c8f84, + 0x2204c3, + 0x319c83, + 0x74b19c85, + 0x2411c5, + 0x284b04, + 0x356bcd, + 0x293042, + 0x359103, + 0x74e09442, + 0x75203a42, + 0x391d05, + 0x3babc7, + 0x21e484, + 0x32fb09, + 0x2cb9c9, + 0x277e43, + 0x277e48, + 0x245e09, + 0x214947, + 0x204185, + 0x37c106, + 0x37ec86, + 0x3808c5, + 0x37aec5, + 0x75601a82, + 0x287205, + 0x2b7748, + 0x2c5a46, + 0x75a52b07, + 0x2bd2c4, + 0x2fc647, + 0x305546, + 0x75e01082, + 0x37c286, + 0x30988a, + 0x30a105, + 0x762e8f82, + 0x76621902, + 0x3645c6, + 0x221908, + 0x76a8d107, + 0x76e43b02, + 0x288ec3, + 0x2ff806, + 0x226884, + 0x275b06, + 0x319f46, + 0x2034ca, + 0x2021c5, + 0x3006c6, + 0x2520c3, + 0x2520c4, + 0x207442, + 0x331403, + 0x7720e442, + 0x2f1803, + 0x7760cf84, + 0x221a44, + 0x77a21a4a, + 0x22ce03, + 0x266c87, + 0x30d106, + 0x2ff144, + 0x20bc82, + 0x2a6f02, + 0x77e007c2, + 0x22b9c3, + 0x254047, 0x2007c7, - 0x2895c4, - 0x21e8c7, - 0x2f2346, - 0x219187, - 0x225904, - 0x37cb05, - 0x218345, - 0x74619f82, - 0x3dc5c6, - 0x21d843, - 0x220bc2, - 0x220bc6, - 0x74a19b42, - 0x74e1be02, - 0x3c3905, - 0x75243982, - 0x75602b42, - 0x348ac5, - 0x2d6385, - 0x2a7ec5, - 0x75a04e83, - 0x36f205, - 0x2e8207, - 0x2c4c05, - 0x332105, - 0x32a284, - 0x2e6006, - 0x34b504, - 0x75e008c2, - 0x76ae94c5, - 0x382b07, - 0x360088, - 0x251646, - 0x25164d, - 0x252b09, - 0x252b12, - 0x380385, - 0x38bd03, - 0x76e062c2, - 0x2f3e44, - 0x219ec3, - 0x30d305, - 0x30e4c5, - 0x772195c2, - 0x25ce03, - 0x7765b8c2, - 0x77ee3402, - 0x78200082, - 0x2c8b45, - 0x3cd503, - 0x24af88, - 0x78619082, - 0x78a0d2c2, - 0x348d06, - 0x31f38a, - 0x20ef03, - 0x25ac43, - 0x2eeac3, - 0x79e07d82, - 0x8821a6c2, - 0x88a0a742, - 0x206842, - 0x3d00c9, - 0x2c7504, - 0x2ac108, - 0x88efc182, - 0x89214f82, - 0x2af4c5, - 0x2345c8, - 0x311308, - 0x2ef30c, - 0x239d03, - 0x8961f202, - 0x89a0a342, - 0x349646, - 0x313d05, - 0x2dcf43, - 0x2574c6, - 0x313e46, - 0x29b2c3, - 0x3c2003, - 0x3152c6, - 0x316ac4, - 0x2819c6, - 0x21c28a, - 0x24e184, - 0x317184, - 0x31820a, - 0x89e1ff02, - 0x252205, - 0x319d4a, - 0x319c85, - 0x31b1c4, - 0x31b2c6, - 0x31b444, - 0x213fc6, - 0x8a22bc42, - 0x2fdd06, - 0x328805, - 0x32e0c7, - 0x3ad646, - 0x25d084, - 0x2dd1c7, - 0x34b206, - 0x20bf45, - 0x20bf47, - 0x3bbc47, - 0x3bbc4e, - 0x26bb86, - 0x221d45, - 0x207b87, - 0x306003, - 0x330387, - 0x209185, - 0x20af84, - 0x221ac2, - 0x229c47, - 0x30e204, - 0x231784, - 0x23f04b, - 0x21c8c3, - 0x288087, - 0x21c8c4, - 0x288287, - 0x294a03, - 0x34ca4d, - 0x3a4bc8, - 0x8a62a984, - 0x23d705, - 0x31bfc5, - 0x31c403, - 0x8aa23f82, - 0x31dd83, - 0x31e583, - 0x3dc744, - 0x27e0c5, - 0x21d8c7, - 0x32e2c6, - 0x38bac3, - 0x228d8b, - 0x27444b, - 0x2b200b, - 0x2d440b, - 0x2e9d4a, - 0x33484b, - 0x36d94b, - 0x392c8c, - 0x3d990b, - 0x3db991, - 0x32068a, - 0x320b8b, - 0x320e4c, - 0x32114b, - 0x3218ca, - 0x321f0a, - 0x322e0e, - 0x32380b, - 0x323aca, - 0x325011, - 0x32544a, - 0x32594b, - 0x325e8e, - 0x3267cc, - 0x326e0b, - 0x3270ce, - 0x32744c, - 0x329d4a, - 0x32b58c, - 0x8af2b88a, - 0x32c488, - 0x32d049, - 0x33390a, - 0x333b8a, - 0x333e0b, - 0x33854e, - 0x338f51, - 0x341f49, - 0x34218a, - 0x342f8b, - 0x3444ca, - 0x345596, - 0x34690b, - 0x34768a, - 0x34854a, - 0x349d8b, - 0x34a609, - 0x34d3c9, - 0x34da0d, - 0x34e44b, - 0x34f34b, - 0x34fd0b, - 0x350589, - 0x350bce, - 0x35130a, - 0x35224a, - 0x3527ca, - 0x352f8b, - 0x3537cb, - 0x35448d, - 0x356b8d, - 0x357c10, - 0x3580cb, - 0x358acc, - 0x3596cb, - 0x35b98b, - 0x35dd4e, - 0x35e44b, - 0x35e44d, - 0x364a4b, - 0x3654cf, - 0x36588b, - 0x3660ca, - 0x3673c9, - 0x367bc9, - 0x8b368c4b, - 0x368f0e, - 0x36b88b, - 0x36c50f, - 0x36e54b, - 0x36e80b, - 0x36eacb, - 0x36f34a, - 0x374e89, - 0x37978f, - 0x37df0c, - 0x37fb4c, - 0x38004e, - 0x38054f, - 0x38090e, - 0x381150, - 0x38154f, - 0x38210e, - 0x382ccc, - 0x382fd2, - 0x383751, - 0x383f4e, - 0x38438e, - 0x3853cb, - 0x3853ce, - 0x38574f, - 0x385b0e, - 0x385e93, - 0x386351, - 0x38678c, - 0x386a8e, - 0x386f0c, - 0x387453, - 0x387c50, - 0x3887cc, - 0x388acc, - 0x388f8b, - 0x38984e, - 0x389d4b, - 0x38a54b, - 0x38d28c, - 0x391f8a, - 0x39248c, - 0x39278c, - 0x392a89, - 0x39470b, - 0x3949c8, - 0x395189, - 0x39518f, - 0x39690b, - 0x8b79724a, - 0x39a2cc, - 0x39b48b, - 0x39b749, - 0x39bb88, - 0x39c14b, - 0x39c98b, - 0x39d50a, - 0x39d78b, - 0x3a150c, - 0x3a26c8, - 0x3a4f0b, - 0x3a814b, - 0x3ab00e, - 0x3ac50b, - 0x3ae20b, - 0x3bb7cb, - 0x3bba89, - 0x3bbfcd, - 0x3cd98a, - 0x3d0b57, - 0x3d1358, - 0x3d3f49, - 0x3d508b, - 0x3d6054, - 0x3d654b, - 0x3d6aca, - 0x3d6f8a, - 0x3d720b, - 0x3d79d0, - 0x3d7dd1, - 0x3d838a, - 0x3d8f0d, - 0x3d960d, - 0x3dbdcb, - 0x3dc6c3, - 0x8bb77983, - 0x2d4886, - 0x278445, - 0x30db87, - 0x334706, - 0x1605042, - 0x2dd4c9, - 0x32c104, - 0x2e7748, - 0x21d4c3, - 0x2f3d87, - 0x22f282, - 0x2af9c3, - 0x8be0a842, - 0x2cd186, - 0x2ce1c4, - 0x35cbc4, - 0x332803, - 0x8c6c8e42, - 0x8caab204, - 0x275d07, - 0x8ce37b02, - 0x22d7c3, - 0x233743, - 0x220583, - 0x205e03, - 0x206b43, - 0x23cf83, - 0xecf48, - 0x2013c3, + 0x287dc4, + 0x3d0847, + 0x2f0706, + 0x20fb07, + 0x227544, + 0x292445, + 0x2187c5, + 0x78214682, + 0x3b2f46, + 0x215943, + 0x21e0c2, + 0x21e0c6, + 0x78621542, + 0x78a19f82, + 0x298e05, + 0x78e47c82, + 0x79201942, + 0x324c85, + 0x2d3985, + 0x2a9385, + 0x79a1d043, + 0x24adc5, + 0x2e82c7, + 0x2f3505, + 0x202385, + 0x32b944, + 0x229a46, + 0x3dd844, + 0x79e008c2, + 0x7ab82d05, + 0x3c9447, + 0x3afe08, + 0x24d686, + 0x38bb4d, + 0x24d689, + 0x24d692, + 0x34cf05, + 0x37aa03, + 0x7ae06902, + 0x319b44, + 0x2145c3, + 0x38d005, + 0x30b405, + 0x7b20ff42, + 0x259243, + 0x7b62b902, + 0x7beca302, + 0x7c200082, + 0x2e08c5, + 0x2088c3, + 0x7c60fa02, + 0x7ca14302, + 0x3a4486, + 0x27ac8a, + 0x208c83, + 0x256203, + 0x2f6ac3, + 0x7de05402, + 0x8c218d82, + 0x8ca05782, + 0x217042, + 0x3cd2c9, + 0x2c80c4, + 0x2d6648, + 0x8cefbb02, + 0x8d60ff82, + 0x2c4e85, + 0x233b08, + 0x23c708, + 0x315b0c, + 0x237843, + 0x8da08842, + 0x8de00f02, + 0x3b9686, + 0x30df85, + 0x2dae43, + 0x252f86, + 0x30e0c6, + 0x27a383, + 0x310c83, + 0x311346, + 0x312bc4, + 0x263546, + 0x3b610a, + 0x23fbc4, + 0x313284, + 0x314aca, + 0x8e212f42, + 0x24cf45, + 0x31634a, + 0x316285, + 0x317c04, + 0x317d06, + 0x317e84, + 0x216486, + 0x8e615482, + 0x215486, + 0x251a45, + 0x3b2dc7, + 0x3b5f86, + 0x254f84, + 0x2db0c7, + 0x20a4c5, + 0x20a4c7, + 0x3b7147, + 0x3b714e, + 0x389606, + 0x22a785, + 0x205b07, + 0x207203, + 0x207207, + 0x21e905, + 0x225944, + 0x22a582, + 0x23db47, + 0x30b144, + 0x241b04, + 0x285f4b, + 0x21c283, + 0x2bc607, + 0x21c284, + 0x2bc907, + 0x229683, + 0x350f8d, + 0x3a0c48, + 0x8ea46384, + 0x246385, + 0x3194c5, + 0x319903, + 0x8ee25242, + 0x31c243, + 0x31d283, + 0x3b30c4, + 0x27cf45, + 0x2159c7, + 0x252146, + 0x38cdc3, + 0x22b34b, + 0x27350b, + 0x2ac28b, + 0x3cad8b, + 0x2e8fca, + 0x36f44b, + 0x39334b, + 0x3d950c, + 0x3dcb4b, + 0x31ddd1, + 0x31e20a, + 0x31e70b, + 0x31e9cc, + 0x31eccb, + 0x31ff4a, + 0x3206ca, + 0x321ece, + 0x32344b, + 0x32370a, + 0x324dd1, + 0x32520a, + 0x32570b, + 0x325c4e, + 0x326b4c, + 0x32738b, + 0x32764e, + 0x3279cc, + 0x32b40a, + 0x32c64c, + 0x8f32c94a, + 0x32d548, + 0x32e109, + 0x33204a, + 0x3322ca, + 0x33254b, + 0x334cce, + 0x335b91, + 0x341509, + 0x34174a, + 0x34244b, + 0x34634d, + 0x3471ca, + 0x348716, + 0x349a8b, + 0x34a80a, + 0x34ad8a, + 0x34c10b, + 0x34c989, + 0x351909, + 0x351e8d, + 0x35250b, + 0x35340b, + 0x353dcb, + 0x3543c9, + 0x354a0e, + 0x35520a, + 0x35608a, + 0x35698a, + 0x35724b, + 0x357a8b, + 0x35890d, + 0x35a04d, + 0x35a950, + 0x35ae0b, + 0x35b90c, + 0x35cecb, + 0x35ec0b, + 0x3602ce, + 0x3609cb, + 0x3609cd, + 0x36550b, + 0x365f8f, + 0x36634b, + 0x366b8a, + 0x3678c9, + 0x367f89, + 0x8f7689cb, + 0x368c8e, + 0x36900e, + 0x36cecb, + 0x36e00f, + 0x37024b, + 0x37050b, + 0x3707cb, + 0x370e8a, + 0x377889, + 0x37a00f, + 0x37e9cc, + 0x37ee0c, + 0x37f8ce, + 0x37fe4f, + 0x38020e, + 0x381310, + 0x38170f, + 0x3822ce, + 0x382e8c, + 0x383191, + 0x3835d2, + 0x384ad1, + 0x3852ce, + 0x38570b, + 0x38570e, + 0x385a8f, + 0x385e4e, + 0x3861d3, + 0x386691, + 0x386acc, + 0x386dce, + 0x38724c, + 0x387793, + 0x388650, + 0x38a34c, + 0x38a64c, + 0x38ab0b, + 0x38b0ce, + 0x38b5cb, + 0x38be8b, + 0x38d30c, + 0x39278a, + 0x392b4c, + 0x392e4c, + 0x393149, + 0x39494b, + 0x394c08, + 0x3953c9, + 0x3953cf, + 0x396c8b, + 0x8fb9800a, + 0x399fcc, + 0x39b18b, + 0x39b449, + 0x39bbc8, + 0x39c18b, + 0x39c70b, + 0x39d28a, + 0x39d50b, + 0x39da0c, + 0x39e3c9, + 0x39e608, + 0x3a0f8b, + 0x3a3ccb, + 0x3a694e, + 0x3a7e4b, + 0x3aabcb, + 0x3b6ccb, + 0x3b6f89, + 0x3b74cd, + 0x3c9e8a, + 0x3cdd57, + 0x3cf418, + 0x3d41c9, + 0x3d530b, + 0x3d5814, + 0x3d5d0b, + 0x3d628a, + 0x3d694a, + 0x3d6bcb, + 0x3d7410, + 0x3d7811, + 0x3d7eca, + 0x3d8b0d, + 0x3d920d, + 0x3ddd8b, + 0x3b3043, + 0x8ff83d43, + 0x32af06, + 0x22ef05, + 0x307347, + 0x332e46, + 0x1602d42, + 0x2ab3c9, + 0x32d1c4, + 0x2e4d08, + 0x21dd43, + 0x319a87, + 0x22de82, + 0x2b05c3, + 0x902057c2, + 0x2cc446, + 0x2cdb04, + 0x347d04, + 0x346243, + 0x90ac91c2, + 0x90e2a444, + 0x273e47, + 0x9122a1c2, + 0x22c0c3, + 0x232c43, + 0x228b03, + 0x211543, + 0x20a803, + 0x216603, + 0x111148, + 0x20ca43, 0x2000c2, - 0xa14c8, - 0x202782, - 0x220583, - 0x205e03, - 0x206b43, - 0x13c3, - 0x23cf83, - 0x202003, - 0x33e716, - 0x362c13, - 0x21e749, - 0x2447c8, - 0x3cb289, - 0x319ec6, - 0x34e710, - 0x2425d3, - 0x347c88, - 0x279447, - 0x27ad47, - 0x2a3b0a, - 0x32efc9, - 0x3a2849, - 0x24184b, - 0x3cbf86, - 0x289b0a, - 0x221346, - 0x32bd03, - 0x2dc8c5, - 0x3d1dc8, - 0x234a8d, - 0x3b8b8c, - 0x310ac7, - 0x32428d, - 0x225344, - 0x23094a, - 0x231e4a, - 0x23230a, - 0x2428c7, - 0x23bc07, - 0x23ef84, - 0x26ec06, - 0x32f404, - 0x2da308, - 0x2e1509, - 0x2d0f46, - 0x2d0f48, - 0x242d8d, - 0x2cc809, - 0x315848, - 0x239587, - 0x2399ca, - 0x253fc6, - 0x25f947, - 0x2cbe44, - 0x28f147, - 0x22964a, - 0x23d00e, - 0x278745, - 0x28f04b, - 0x229149, - 0x252d49, - 0x2add07, - 0x3bf4ca, - 0x2c1947, - 0x2f9209, - 0x3b9108, - 0x28eb4b, - 0x2e43c5, - 0x22bd4a, - 0x28fd09, - 0x37270a, - 0x2ceecb, - 0x3c514b, - 0x2415d5, - 0x2eb105, - 0x239605, - 0x2f864a, - 0x25b58a, - 0x311a07, - 0x234703, - 0x2b9388, - 0x2db00a, - 0x224086, - 0x266809, - 0x283048, - 0x2dcb04, - 0x387209, - 0x2c2988, - 0x2beec7, - 0x2e94c6, - 0x382b07, - 0x3503c7, - 0x23e385, - 0x2e730c, - 0x23d705, - 0x22d7c3, - 0x233743, - 0x220583, - 0x206b43, - 0x13c3, - 0x23cf83, - 0x202782, - 0x22d7c3, - 0x206b43, - 0x2013c3, - 0x23cf83, - 0x22d7c3, - 0x206b43, - 0x13c3, - 0x2a8b03, - 0x23cf83, - 0x1cdd43, - 0xa14c8, - 0x22d7c3, - 0x233743, - 0x220583, - 0x205e03, - 0x206b43, - 0x13c3, - 0x23cf83, - 0xa14c8, - 0x202782, - 0x22d7c3, - 0x22d7c7, - 0x206b43, - 0x23cf83, - 0x202782, - 0x203dc2, - 0x31b402, - 0x206102, - 0x200d42, - 0x2ea5c2, - 0x91d46, - 0x54389, - 0x481b683, - 0x89947, - 0x7b83, - 0x11b645, + 0x9fe08, + 0x20c302, + 0x228b03, + 0x211543, + 0x20a803, + 0xca43, + 0x216603, + 0x20c603, + 0x33b8d6, + 0x363e93, + 0x3d06c9, + 0x322c48, + 0x3b85c9, + 0x3164c6, + 0x3527d0, + 0x20c013, + 0x2ebc08, + 0x27a947, + 0x286b07, + 0x2a4a4a, + 0x3291c9, + 0x28f509, + 0x24224b, + 0x2e73c6, + 0x28830a, + 0x222a86, + 0x32cdc3, + 0x256545, + 0x3a8908, + 0x233fcd, + 0x21fd0c, + 0x2eaac7, + 0x3dcdcd, + 0x225744, + 0x22fd8a, + 0x23084a, + 0x230d0a, + 0x20c307, + 0x23a907, + 0x23da84, + 0x287806, + 0x251c04, + 0x2d58c8, + 0x32ad09, + 0x2cf506, + 0x2cf508, + 0x240dcd, + 0x2cbc09, + 0x3910c8, + 0x240907, + 0x23750a, + 0x24e606, + 0x25b7c7, + 0x2fb704, + 0x20b6c7, + 0x228b0a, + 0x239d4e, + 0x277f05, + 0x3d7c0b, + 0x22b709, + 0x24d8c9, + 0x2c6607, + 0x3c138a, + 0x2c2cc7, + 0x2f9309, + 0x27b408, + 0x2e640b, + 0x2e2a45, + 0x22ad8a, + 0x22b0c9, + 0x33e68a, + 0x20460b, + 0x20b5cb, + 0x241fd5, + 0x2c1f85, + 0x240985, + 0x2f67ca, + 0x3dbb0a, + 0x31b687, + 0x233c43, + 0x2ba388, + 0x2d80ca, + 0x225346, + 0x2592c9, + 0x28a748, + 0x2dedc4, + 0x387549, + 0x2c3748, + 0x2c2407, + 0x382d06, + 0x3c9447, + 0x2b4607, + 0x23ca85, + 0x2e450c, + 0x246385, + 0x22c0c3, + 0x232c43, + 0x228b03, + 0x20a803, + 0xca43, + 0x216603, + 0x20c302, + 0x22c0c3, + 0x20a803, + 0x20ca43, + 0x216603, + 0x22c0c3, + 0x20a803, + 0xca43, + 0x239503, + 0x216603, + 0x1ca243, + 0x9fe08, + 0x22c0c3, + 0x232c43, + 0x228b03, + 0x211543, + 0x20a803, + 0xca43, + 0x216603, + 0x9fe08, + 0x20c302, + 0x22c0c3, + 0x22c0c7, + 0x20a803, + 0x216603, + 0x20c302, + 0x201d02, + 0x2ebe82, + 0x202cc2, + 0x202f82, + 0x2e5382, + 0x91746, + 0x4e9c9, + 0x481b443, + 0x88147, + 0x5b03, + 0x119045, 0xc1, - 0x522d7c3, - 0x233743, - 0x228843, - 0x220583, - 0x219e43, - 0x205e03, - 0x2dc7c6, - 0x206b43, - 0x23cf83, - 0x204283, - 0xa14c8, - 0x200984, - 0x30ad47, - 0x332843, - 0x375e04, - 0x21a5c3, - 0x212003, - 0x220583, - 0x14c47, - 0x109744, - 0x3283, - 0x131905, + 0x522c0c3, + 0x232c43, + 0x212483, + 0x228b03, + 0x214543, + 0x211543, + 0x2d9fc6, + 0x20a803, + 0x216603, + 0x20f803, + 0x9fe08, + 0x3443c4, + 0x374787, + 0x346283, + 0x2b3904, + 0x218c83, + 0x286243, + 0x228b03, + 0x176c87, + 0x9c4, + 0x11c3, + 0x2b05, 0x2000c2, - 0x4ce83, - 0x6602782, - 0x688bc49, - 0x8c5cd, - 0x8c90d, - 0x31b402, - 0x22884, - 0x131949, + 0x48343, + 0x660c302, + 0x688a549, + 0x8abcd, + 0x8af0d, + 0x2ebe82, + 0x24e44, + 0x2b49, 0x2003c2, - 0x6e22788, - 0xf7dc4, - 0xa14c8, - 0x1419a42, + 0x6e24d48, + 0xf61c4, + 0x9fe08, + 0x1417c42, 0x14005c2, - 0x1419a42, - 0x1517386, - 0x22f303, - 0x26f283, - 0x762d7c3, - 0x230944, - 0x7a33743, - 0x7e20583, - 0x2067c2, - 0x222884, - 0x206b43, - 0x305f83, - 0x201642, - 0x23cf83, - 0x218142, - 0x2ffb03, - 0x209482, - 0x207043, - 0x283103, - 0x205302, - 0xa14c8, - 0x22f303, - 0x305f83, - 0x201642, - 0x2ffb03, - 0x209482, - 0x207043, - 0x283103, - 0x205302, - 0x2ffb03, - 0x209482, - 0x207043, - 0x283103, - 0x205302, - 0x22d7c3, - 0x24ce83, - 0x22d7c3, - 0x233743, - 0x220583, - 0x222884, - 0x219e43, - 0x205e03, - 0x205184, - 0x206b43, - 0x23cf83, - 0x202102, - 0x213c43, - 0xa14c8, - 0x22d7c3, - 0x233743, - 0x220583, - 0x205e03, - 0x206b43, - 0x23cf83, - 0x24ce83, - 0x202782, - 0x22d7c3, - 0x233743, - 0x220583, - 0x222884, - 0x206b43, - 0x23cf83, - 0x3da885, - 0x2195c2, + 0x1417c42, + 0x1513486, + 0x22df03, + 0x26fb43, + 0x762c0c3, + 0x22fd84, + 0x7a32c43, + 0x8628b03, + 0x203dc2, + 0x224e44, + 0x20a803, + 0x2e59c3, + 0x201e02, + 0x216603, + 0x2185c2, + 0x301e43, + 0x204e82, + 0x203303, + 0x28a803, + 0x205842, + 0x9fe08, + 0x22df03, + 0x3c38c8, + 0x7ee59c3, + 0x201e02, + 0x301e43, + 0x204e82, + 0x8203303, + 0x28a803, + 0x205842, + 0x253c47, + 0x232c49, + 0x301e43, + 0x204e82, + 0x203303, + 0x28a803, + 0x205842, + 0x22c0c3, + 0x248343, + 0x22c0c3, + 0x232c43, + 0x228b03, + 0x224e44, + 0x214543, + 0x211543, + 0x217b84, + 0x20a803, + 0x216603, + 0x20b142, + 0x216103, + 0x9fe08, + 0x22c0c3, + 0x232c43, + 0x228b03, + 0x211543, + 0x20a803, + 0x216603, + 0x248343, + 0x20c302, + 0x22c0c3, + 0x232c43, + 0x228b03, + 0x224e44, + 0x20a803, + 0x216603, + 0x204185, + 0x20ff42, 0x2000c2, - 0xa14c8, - 0x144b148, - 0x103e4a, - 0x220583, - 0x207881, - 0x2009c1, + 0x9fe08, + 0x14470c8, + 0xf704a, + 0x228b03, 0x203281, - 0x202ec1, - 0x200a41, - 0x20c101, + 0x2009c1, 0x200a01, - 0x228441, - 0x207901, + 0x201301, + 0x201281, + 0x207101, + 0x2027c1, + 0x2223c1, + 0x203bc1, 0x200001, 0x2000c1, 0x200201, - 0x12dac5, - 0xa14c8, + 0x12eb85, + 0x9fe08, 0x200101, - 0x200f01, + 0x2015c1, 0x200501, - 0x202401, + 0x2014c1, 0x200041, 0x200801, 0x200181, - 0x202d41, + 0x200e01, 0x200701, 0x2004c1, - 0x200c01, + 0x200bc1, 0x200581, 0x2003c1, - 0x201001, - 0x215f41, + 0x200a81, + 0x209101, 0x200401, 0x200741, 0x2007c1, 0x200081, - 0x206841, - 0x201ec1, - 0x203301, - 0x201081, - 0x20a781, - 0x22d7c3, - 0x233743, - 0x220583, - 0x206b43, - 0x23cf83, - 0x202782, - 0x22d7c3, - 0x233743, + 0x200f01, + 0x205841, + 0x201241, + 0x2018c1, + 0x204981, + 0x22c0c3, + 0x232c43, + 0x228b03, + 0x20a803, + 0x216603, + 0x20c302, + 0x22c0c3, + 0x232c43, 0x2003c2, - 0x23cf83, - 0x1b043, - 0x14c47, - 0x5f07, - 0x29f46, - 0x3530a, - 0x8b088, - 0x58748, - 0x58c07, - 0x108a46, - 0xe3485, - 0x45585, - 0x125d43, - 0x5bac6, - 0xec046, - 0x241844, - 0x37e847, - 0xa14c8, - 0x2dd2c4, - 0x22d7c3, - 0x233743, - 0x220583, - 0x206b43, - 0x23cf83, - 0x2782, - 0x22d7c3, - 0x233743, - 0x220583, - 0x206b43, - 0x23cf83, - 0x32ba88, - 0x201844, - 0x233684, - 0x22afc4, - 0x349547, - 0x2d9947, - 0x22d7c3, - 0x23620b, - 0x31fb4a, - 0x3cc247, - 0x306588, - 0x328108, - 0x233743, - 0x336447, - 0x228843, - 0x20d348, - 0x210b49, - 0x222884, - 0x219e43, - 0x2fee88, - 0x205e03, - 0x2d618a, - 0x2dc7c6, - 0x3aa407, - 0x206b43, - 0x394486, - 0x26f108, - 0x23cf83, - 0x25ae06, - 0x2ef84d, - 0x2f1f08, - 0x2f898b, - 0x2bff86, - 0x3416c7, - 0x214dc5, - 0x2d5dca, - 0x228105, - 0x24308a, - 0x2195c2, - 0x207b83, - 0x231784, + 0x216603, + 0x1ae03, + 0x176c87, + 0x11647, + 0x39346, + 0x3484a, + 0x89988, + 0x53388, + 0x53f47, + 0xbdc06, + 0xe1145, + 0x175305, + 0x125b03, + 0x13686, + 0x3e006, + 0x242244, + 0x2f6d07, + 0x9fe08, + 0x2db1c4, + 0x22c0c3, + 0x232c43, + 0x228b03, + 0x20a803, + 0x216603, + 0xc302, + 0x22c0c3, + 0x232c43, + 0x228b03, + 0x20a803, + 0x216603, + 0x32cb48, + 0x345344, + 0x232b84, + 0x26bb44, + 0x3b9587, + 0x2d6b87, + 0x22c0c3, + 0x23560b, + 0x37400a, + 0x2ff007, + 0x308a08, + 0x2f7b48, + 0x232c43, + 0x2e6687, + 0x212483, + 0x204f48, + 0x209c89, + 0x224e44, + 0x214543, + 0x238cc8, + 0x211543, + 0x2d378a, + 0x2d9fc6, + 0x3a5d47, + 0x20a803, + 0x373846, + 0x26f9c8, + 0x216603, + 0x2433c6, + 0x2edf0d, + 0x2f0348, + 0x2f8a8b, + 0x20b186, + 0x3baac7, + 0x212605, + 0x3c554a, + 0x222085, + 0x2410ca, + 0x20ff42, + 0x205b03, + 0x241b04, 0x200006, - 0x3b0ec3, - 0x2a13c3, - 0x24de03, - 0x201843, - 0x372dc3, - 0x2017c2, - 0x300745, - 0x2a9049, - 0x23ea03, - 0x20a683, - 0x202b03, + 0x3ae643, + 0x29fd03, + 0x258783, + 0x20f643, + 0x373c83, + 0x203582, + 0x3abe85, + 0x2aad89, + 0x23d103, + 0x225843, + 0x215203, 0x200201, - 0x2e8d87, - 0x2c8885, - 0x398a83, - 0x3c4703, - 0x22afc4, - 0x32f383, - 0x21c1c8, - 0x367603, - 0x31454d, - 0x26bc48, - 0x20b546, - 0x332d03, - 0x38d543, - 0x3ac783, - 0xbe2d7c3, - 0x232f88, - 0x236204, - 0x23fec3, + 0x2cfb07, + 0x2e0605, + 0x3a8843, + 0x3c7543, + 0x26bb44, + 0x2fef83, + 0x21b908, + 0x367b03, + 0x30f30d, + 0x3896c8, + 0x3c3a86, + 0x2fdec3, + 0x360cc3, + 0x38d5c3, + 0xc62c0c3, + 0x232488, + 0x235604, + 0x23e483, 0x200106, - 0x243608, - 0x202943, - 0x2d5e03, - 0x22d943, - 0x233743, - 0x210483, - 0x2416c3, - 0x2a6003, - 0x332c83, - 0x209c83, - 0x202403, - 0x38a7c5, - 0x254344, - 0x254cc7, - 0x2b06c2, - 0x2584c3, - 0x25af86, - 0x25c303, - 0x25c9c3, - 0x278643, - 0x309303, - 0x202383, - 0x2973c7, - 0xc220583, - 0x24b543, - 0x3d54c3, - 0x209a03, - 0x219c83, - 0x2fe043, - 0x3b4d05, - 0x371983, - 0x2f9f89, - 0x2035c3, - 0x30e7c3, - 0xc636803, - 0x3d8883, - 0x21b888, - 0x2a8f86, - 0x3090c6, - 0x29d786, - 0x388307, - 0x226b83, - 0x22a243, - 0x205e03, - 0x28b186, - 0x2104c2, - 0x2a6343, - 0x33d1c5, - 0x206b43, - 0x31aa87, - 0x16013c3, - 0x26f103, - 0x234203, - 0x218003, - 0x2050c3, - 0x23cf83, - 0x20e486, - 0x3315c6, - 0x37a043, - 0x2f0b83, - 0x213c43, - 0x225983, - 0x3c2083, - 0x2fe543, - 0x2ffec3, - 0x216345, - 0x25b583, - 0x378b46, - 0x32f608, - 0x217d43, - 0x274f89, - 0x363108, - 0x2170c8, - 0x224385, - 0x37cc0a, - 0x39da8a, - 0x22e30b, - 0x22f448, - 0x2ee443, - 0x38bc03, - 0x2f88c3, - 0x30f848, - 0x35e143, - 0x32e244, - 0x202742, - 0x260403, + 0x241648, + 0x27c083, + 0x3c5583, + 0x22c243, + 0x232c43, + 0x2234c3, + 0x2420c3, + 0x284ac3, + 0x3313c3, + 0x28c603, + 0x20d643, + 0x38c105, + 0x24e984, + 0x24f307, + 0x2b12c2, + 0x252d83, + 0x256cc6, + 0x258283, + 0x258e03, + 0x277e03, + 0x2be4c3, + 0x3440c3, + 0x297e47, + 0xca28b03, + 0x2530c3, + 0x3d9e83, + 0x204f43, + 0x214383, + 0x2157c3, + 0x3c3345, + 0x372f03, + 0x200e09, + 0x201503, + 0x30b703, + 0xce35c03, + 0x2c9343, + 0x219a08, + 0x2aacc6, + 0x2be286, + 0x2b1306, + 0x388d07, + 0x228503, + 0x238cc3, + 0x211543, + 0x289a86, + 0x21fdc2, + 0x28f543, + 0x33a385, + 0x20a803, + 0x316d07, + 0x160ca43, + 0x26f9c3, + 0x204343, + 0x230743, + 0x21d283, + 0x216603, + 0x20dc46, + 0x3b9d86, + 0x37a8c3, + 0x2ef183, + 0x216103, + 0x2275c3, + 0x310d03, + 0x2fd203, + 0x302203, + 0x3973c5, + 0x236bc3, + 0x236bc6, + 0x211f08, + 0x212983, + 0x212989, + 0x33f908, + 0x216f88, + 0x221105, + 0x22ceca, + 0x22e04a, + 0x237acb, + 0x23a5c8, + 0x2ed803, + 0x38cf03, + 0x2f9503, + 0x30e208, + 0x3606c3, + 0x2520c4, + 0x207442, + 0x25c283, 0x2007c3, - 0x229343, - 0x2572c3, - 0x204283, - 0x2195c2, - 0x227d43, - 0x239d03, - 0x317503, - 0x318c44, - 0x231784, - 0x228c83, - 0xa14c8, + 0x228803, + 0x250d43, + 0x20f803, + 0x20ff42, + 0x229543, + 0x237843, + 0x313603, + 0x315504, + 0x241b04, + 0x3ced43, + 0x9fe08, 0x2000c2, - 0x200b02, - 0x2017c2, - 0x2020c2, + 0x200ac2, + 0x203582, + 0x202542, 0x200202, - 0x201942, - 0x258542, - 0x201242, + 0x201ec2, + 0x25a902, + 0x201bc2, 0x200382, - 0x201442, - 0x25e5c2, - 0x200e82, - 0x26cec2, - 0x201002, - 0x2ea5c2, - 0x202142, - 0x203d42, - 0x213c42, - 0x2b0942, - 0x206382, + 0x200c42, + 0x252742, + 0x205a02, + 0x26bf42, + 0x200a82, + 0x2e5382, + 0x2161c2, + 0x201c82, + 0x216102, + 0x228702, + 0x204d42, 0x200682, - 0x214582, - 0x202542, - 0x202002, - 0x201bc2, - 0x236082, - 0x202b42, + 0x216c82, + 0x202442, + 0x209482, + 0x202e42, + 0x2411c2, + 0x201942, 0xc2, - 0xb02, - 0x17c2, - 0x20c2, + 0xac2, + 0x3582, + 0x2542, 0x202, - 0x1942, - 0x58542, - 0x1242, + 0x1ec2, + 0x5a902, + 0x1bc2, 0x382, - 0x1442, - 0x5e5c2, - 0xe82, - 0x6cec2, - 0x1002, - 0xea5c2, - 0x2142, - 0x3d42, - 0x13c42, - 0xb0942, - 0x6382, + 0xc42, + 0x52742, + 0x5a02, + 0x6bf42, + 0xa82, + 0xe5382, + 0x161c2, + 0x1c82, + 0x16102, + 0x28702, + 0x4d42, 0x682, - 0x14582, - 0x2542, - 0x2002, - 0x1bc2, - 0x36082, - 0x2b42, - 0x22d7c3, - 0x233743, - 0x220583, - 0x206b43, - 0x23cf83, - 0x1ec2, - 0x22d7c3, - 0x233743, - 0x220583, - 0x206b43, - 0x23cf83, - 0x2782, - 0x202782, - 0x23cf83, - 0xde2d7c3, - 0x220583, - 0x205e03, - 0x6df83, - 0x22ebc2, - 0xa14c8, - 0x22d7c3, - 0x233743, - 0x220583, - 0x206b43, - 0x6df83, - 0x23cf83, - 0xa842, + 0x16c82, + 0x2442, + 0x9482, + 0x2e42, + 0x411c2, + 0x1942, + 0x22c0c3, + 0x232c43, + 0x228b03, + 0x20a803, + 0x216603, + 0x5b02, + 0x22c0c3, + 0x232c43, + 0x228b03, + 0x20a803, + 0x216603, + 0xc302, + 0x20c302, + 0x216603, + 0xe62c0c3, + 0x228b03, + 0x211543, + 0x6d9c3, + 0x22d7c2, + 0x9fe08, + 0x22c0c3, + 0x232c43, + 0x228b03, + 0x20a803, + 0x6d9c3, + 0x216603, + 0x57c2, 0x2001c2, - 0x1445d45, - 0x12dac5, - 0x20b342, - 0xa14c8, - 0x2782, - 0x234f42, - 0x202282, - 0x201c42, - 0x205d42, - 0x24fd42, - 0x45585, - 0x201fc2, - 0x201642, - 0x21a682, - 0x202b82, - 0x202142, - 0x3a1602, - 0x203842, - 0x295a82, - 0xef0b404, + 0x154da85, + 0x12eb85, + 0x208602, + 0x9fe08, + 0xc302, + 0x234482, + 0x204b02, + 0x21bb02, + 0x211482, + 0x239242, + 0x175305, + 0x2016c2, + 0x201e02, + 0x218d42, + 0x201dc2, + 0x2161c2, + 0x23d182, + 0x201782, + 0x296542, + 0xf73f344, 0x142, - 0x14c47, - 0x1a108d, - 0xe3509, - 0xaea4b, - 0xe80c8, - 0x71f49, - 0x10f346, - 0x220583, - 0xa14c8, - 0x109744, - 0x3283, - 0x131905, - 0xa14c8, - 0xdffc7, - 0x59706, - 0x131949, - 0x14a0e, - 0x137987, + 0x176c87, + 0x1266cd, + 0xe11c9, + 0x11214b, + 0xe8188, + 0x643c9, + 0x10c246, + 0x228b03, + 0x9fe08, + 0x9c4, + 0x11c3, + 0x2b05, + 0x9fe08, + 0xddc47, + 0x54c46, + 0x2b49, + 0x7b0e, + 0x14a647, 0x2000c2, - 0x241844, - 0x202782, - 0x22d7c3, - 0x203dc2, - 0x233743, - 0x19d03, + 0x242244, + 0x20c302, + 0x22c0c3, + 0x201d02, + 0x232c43, + 0x14403, 0x200382, - 0x2dd2c4, - 0x219e43, - 0x24ab82, - 0x206b43, + 0x2db1c4, + 0x214543, + 0x244502, + 0x20a803, 0x2003c2, - 0x23cf83, - 0x239606, - 0x3343cf, + 0x216603, + 0x240986, + 0x332b0f, 0x602, - 0x7094c3, - 0xa14c8, - 0x202782, - 0x228843, - 0x220583, - 0x205e03, - 0x13c3, - 0x14a08, - 0x14d5b8b, - 0x153f50a, - 0x148e24a, - 0x14726c7, - 0xa3bcb, - 0x15e1c5, - 0x11a7c9, - 0x12dac5, - 0x14c47, - 0xf5744, - 0x202782, - 0x22d7c3, - 0x220583, - 0x206b43, + 0x6be683, + 0x9fe08, + 0x20c302, + 0x212483, + 0x228b03, + 0x211543, + 0xca43, + 0x7b08, + 0x15c2c4b, + 0x15642ca, + 0xf5009, + 0x15c534a, + 0x150bb87, + 0xa4b0b, + 0x160745, + 0x116a49, + 0x12eb85, + 0x176c87, + 0xf3644, + 0x20c302, + 0x22c0c3, + 0x228b03, + 0x20a803, 0x2000c2, - 0x201cc2, - 0x33b5c2, - 0x1222d7c3, - 0x23c842, - 0x233743, - 0x203582, - 0x20a1c2, - 0x220583, - 0x2068c2, - 0x272142, - 0x2ab1c2, - 0x202082, - 0x291a82, + 0x200c82, + 0x338dc2, + 0x12a2c0c3, + 0x23b182, + 0x232c43, + 0x2014c2, + 0x26bc02, + 0x228b03, + 0x220482, + 0x288542, + 0x22a402, + 0x200cc2, + 0x291482, 0x200802, - 0x2012c2, - 0x207102, - 0x27a482, - 0x201d02, - 0x18c3cc, - 0x2b1402, - 0x2efdc2, - 0x21d882, - 0x241442, - 0x205e03, - 0x200c02, - 0x206b43, - 0x209b42, - 0x2d43c2, - 0x23cf83, - 0x23ea82, - 0x202002, - 0x200ec2, - 0x201282, - 0x215042, - 0x2e9d02, - 0x219f82, - 0x25b8c2, - 0x220d02, - 0x323aca, - 0x3660ca, - 0x39858a, - 0x3dce42, - 0x218b42, - 0x3b4cc2, - 0x12644509, - 0x12b63a0a, - 0x142e5c7, - 0x12e04d82, - 0x140abc3, - 0x2e82, - 0x163a0a, - 0x1878ce, - 0x24ec04, - 0x5bd85, - 0x1362d7c3, - 0x3d4c3, - 0x233743, - 0x251184, - 0x1c1f46, - 0x220583, - 0x222884, - 0x219e43, - 0x13ee09, - 0x157646, - 0x205e03, - 0xe9644, - 0x10a4c3, - 0x206b43, - 0xfc85, - 0x2013c3, - 0x23cf83, - 0x14e60c4, - 0x25b583, - 0x6a04, - 0x207b83, - 0xa14c8, - 0x109406, - 0x15089c4, - 0x132605, - 0x13774a, - 0x12b382, - 0x1a7b46, - 0x48fd1, - 0x13e44509, - 0x132688, - 0x50308, - 0x1c6547, - 0x2442, - 0xe834e, - 0x12dacb, - 0x132e0b, - 0x19018a, - 0x89a4a, - 0x2afc7, - 0xa14c8, - 0x11d0c8, - 0x7947, - 0x1a81414b, - 0x1b047, - 0x1c742, - 0x7dc87, - 0xd4b8a, - 0x48a4f, - 0x4604f, - 0xd5e42, - 0x2782, - 0xa5f48, - 0xe1f0a, - 0xdfaca, - 0x54a4a, - 0x6ba48, - 0xe188, - 0x5d448, - 0xdff88, - 0x173088, - 0x2942, - 0x45dcf, - 0xa0d8b, - 0x6c648, - 0x3fbc7, - 0x374a, - 0x19ee0b, - 0x80b89, - 0x4aac7, - 0xe088, - 0x19dc4c, - 0x1a0047, - 0x6644a, - 0x18b08, - 0x29f4e, - 0x2a70e, - 0x2ae0b, - 0x3850b, - 0xde14b, - 0xe4b09, - 0xe518b, - 0xebb0d, - 0x10138b, - 0x110d0d, - 0x11108d, - 0x103c8a, - 0x315cb, - 0x3d54b, - 0x18af05, - 0x1ac24b50, - 0x168cf, - 0x10b5cf, - 0xe558d, - 0x13efd0, - 0x758c2, - 0x1b21e488, - 0x5d88, - 0x6e4d0, - 0x11e60e, - 0x1b7675c5, - 0x5010b, - 0x13df10, - 0x57d48, - 0xe28a, - 0x386c9, - 0x64b87, - 0x64ec7, + 0x200d82, + 0x2033c2, + 0x21efc2, + 0x217d82, + 0xe550c, + 0x2b2182, + 0x2f10c2, + 0x215982, + 0x2450c2, + 0x211543, + 0x200bc2, + 0x20a803, + 0x228c42, + 0x25b002, + 0x216603, + 0x301b82, + 0x209482, + 0x216002, + 0x203382, + 0x210342, + 0x2e8f82, + 0x214682, + 0x22b902, + 0x21e202, + 0x32370a, + 0x366b8a, + 0x39914a, + 0x3de682, + 0x20e6c2, + 0x3c3302, + 0x12fda689, + 0x1328caca, + 0x142d1c7, + 0x136049c2, + 0x14bd543, + 0x2482, + 0x8caca, + 0x15d14e, + 0x249f84, + 0xf04c5, + 0x13e2c0c3, + 0x3b903, + 0x232c43, + 0x24b304, + 0x228b03, + 0x224e44, + 0x214543, + 0x13bfc9, + 0x8f7c6, + 0x211543, + 0xe88c4, + 0x2143, + 0x20a803, + 0x12abc5, + 0x20ca43, + 0x216603, + 0x1429b04, + 0x236bc3, + 0x10cbc4, + 0x205b03, + 0x9fe08, + 0xbe5c6, + 0x14bdb84, + 0x146045, + 0x14a40a, + 0x12c5c2, + 0x1454114d, + 0x1a36c6, + 0x8f11, + 0x14bda689, + 0x1460c8, + 0x4aa08, + 0x1b584807, + 0x2282, + 0x1da807, + 0xe840e, + 0x12eb8b, + 0x13390b, + 0x1a3f4a, + 0x8824a, + 0x6bb47, + 0x9fe08, + 0x11a9c8, + 0x58c7, + 0x1b81684b, + 0x1ae07, + 0x9582, + 0x2b80d, + 0x13e387, + 0x14ebca, + 0x1ce74f, + 0x1732cf, + 0x8cac2, + 0xc302, + 0x84a08, + 0x1bcfdc4c, + 0xe1cca, + 0xdd74a, + 0x4f08a, + 0x1894c8, + 0xd948, + 0x59748, + 0xddc08, + 0xe7688, + 0x81c2, + 0x14db0f, + 0xa24cb, + 0x18a0c8, + 0x67607, + 0x168a, + 0x11404b, + 0x330c9, + 0x44447, + 0xd848, + 0x2e20c, + 0x16c307, + 0x5674a, + 0xe688, + 0x6aace, + 0x6b28e, + 0x6b98b, + 0x1d2e8b, + 0x1cb64b, + 0xe3089, + 0xead0b, + 0x3934d, + 0x3b98b, + 0x3c10d, + 0x3c48d, + 0x3de4a, + 0x4194b, + 0x461cb, + 0x44845, + 0x1c026590, + 0x19794f, + 0x13f50f, + 0x6a44d, + 0x13c190, + 0x9802, + 0x1c7d0408, + 0x114c8, + 0x93110, + 0x11d30e, + 0x1cb67ac5, + 0x4a80b, + 0x13b0d0, + 0x515c8, + 0xda4a, + 0x1d3049, + 0x60907, + 0x60c47, + 0x60e07, + 0x61787, + 0x62b87, + 0x63107, + 0x63b87, + 0x640c7, + 0x64d07, 0x65087, - 0x659c7, - 0x66b87, - 0x67107, - 0x67807, - 0x67d47, - 0x68287, - 0x68607, - 0x68cc7, - 0x68e87, - 0x69047, - 0x69207, - 0x69947, - 0x69cc7, - 0x6a787, - 0x6ab47, - 0x6b107, - 0x6b3c7, - 0x6b587, - 0x6c8c7, + 0x65747, + 0x65907, + 0x65ac7, + 0x65c87, + 0x664c7, + 0x67907, + 0x688c7, + 0x68c87, + 0x692c7, + 0x69587, + 0x69747, + 0x69a47, + 0x6be07, + 0x6c007, 0x6cd87, - 0x6cf87, - 0x6d347, - 0x6d507, - 0x6d6c7, - 0x6ee07, - 0x70247, - 0x70647, - 0x70e07, - 0x710c7, - 0x71447, - 0x71607, - 0x71a07, - 0x72f87, - 0x739c7, - 0x73f47, - 0x74107, - 0x742c7, - 0x75b07, - 0x76587, - 0x76ac7, - 0x770c7, - 0x77287, - 0x77607, - 0x77b47, - 0x37482, - 0x5d54a, - 0xe9787, - 0x8b705, - 0x9a3d1, - 0x1d21c6, - 0xf2f0a, - 0xa5dca, - 0x59706, - 0x15578b, + 0x6cf47, + 0x6d107, + 0x6f6c7, + 0x70a87, + 0x70f07, + 0x71647, + 0x71907, + 0x71c87, + 0x71e47, + 0x72247, + 0x72687, + 0x72a87, + 0x73007, + 0x731c7, + 0x73387, + 0x73c47, + 0x746c7, + 0x74c07, + 0x75207, + 0x753c7, + 0x75747, + 0x76847, + 0x4c02, + 0x5984a, + 0x13488, + 0x11a007, + 0x8a005, + 0xa7791, + 0x4886, + 0xfadca, + 0x8488a, + 0x54c46, + 0xacd8b, 0x642, - 0x2fad1, - 0xb3dc9, - 0x967c9, - 0x7102, - 0x8898a, - 0xa8549, - 0xa8c8f, - 0xa928e, - 0xaa8c8, - 0x373c2, - 0x108f09, - 0x19774e, - 0x1c848c, - 0xeaa8f, - 0x1b174e, - 0x8284c, - 0xe4e09, - 0xe6711, - 0xe6cc8, - 0x19e052, - 0x19f60d, - 0x6eacd, - 0x16f00b, - 0x4da95, - 0x504c9, - 0x5c44a, - 0x73109, - 0x82c50, - 0x8700b, - 0x16e18f, - 0x1ca50b, - 0x916cc, - 0x93b50, - 0xa4cca, - 0xa620d, - 0xac4ce, - 0xae70a, - 0xaf0cc, - 0x150094, - 0xb3a51, - 0xb7f0b, - 0xb8f0f, - 0xb9d0d, - 0xba58e, - 0xbed8c, - 0xc1d8c, - 0xc304b, - 0xc3a0e, - 0xc42d0, - 0xc548b, - 0x134c0d, - 0x14288f, - 0xcfc0c, - 0xd0dce, - 0xd2d11, - 0xda08c, - 0xf5587, - 0xfc78d, - 0x11274c, - 0x1cf090, - 0x102dcd, - 0x11ac07, - 0x15c2d0, - 0x16f588, - 0x184ccb, - 0xb018f, - 0x17f8c8, - 0xf310d, - 0x107d10, - 0x175889, - 0x1bab22c6, - 0xb3143, - 0xba245, - 0x53a42, - 0x3bc9, - 0x5a34a, - 0x1bf9e506, - 0x1c27de84, - 0x5acc6, - 0x1d3ca, - 0xe5d0d, - 0x1c5313c9, - 0x19a03, - 0x114e0a, - 0xde5d1, - 0xdea09, - 0xdfa47, - 0xe0808, - 0xe0e07, - 0xe9848, - 0x45ecb, - 0x12d8c9, - 0xe9fd0, - 0xea48c, - 0xeaf48, - 0xeb3c5, - 0x1b9288, - 0x1bcd8a, - 0x19ac7, - 0x12e547, - 0x13c2, - 0x13ec0a, - 0x147488, - 0x1c3689, - 0x78505, - 0x11a90a, - 0x8f40f, - 0x12a2cb, - 0x1b4dcc, - 0x15c812, - 0x78845, - 0xed2c8, - 0x51c0a, - 0x1caf7605, - 0x17770c, - 0x13b403, - 0x1a1602, - 0x10004a, - 0x15003cc, - 0x1a03c8, - 0x110ec8, - 0x1cf47506, - 0x18c8c7, - 0x16f82, - 0x9482, - 0x4ecd0, - 0x72847, - 0x2f0cf, - 0x5bac6, - 0x7c64e, - 0x1592cb, - 0x49f88, - 0x80f49, - 0x1991d2, - 0x11570d, - 0x115f88, - 0xae909, - 0xd8f4d, - 0x18be89, - 0x19628b, - 0x1d1c08, - 0x7c988, - 0x7ec48, - 0x7f089, - 0x7f28a, - 0x7ff4c, - 0xea74a, - 0x1c20c7, - 0x55c8d, - 0xe6fd1, - 0x1d2ba886, - 0x1b068b, - 0x12bf0c, - 0x10448, - 0x48589, - 0x17c5cd, - 0x1a7d50, - 0xd2c2, - 0x14500d, - 0x7d82, - 0x1a6c2, - 0x1c200a, - 0x10c20a, - 0xf2e0a, - 0xf3c8b, - 0x2a98c, - 0x11c8cc, - 0x11cbca, - 0x11ce4e, - 0x1dc80d, - 0x1d5dcd05, - 0x136288, - 0xa842, - 0x1430c68e, - 0x14a0750e, - 0x152046ca, - 0x15b322ce, - 0x16202f4e, - 0x16b7350c, - 0x142e5c7, - 0x142e5c9, - 0x140abc3, - 0x173cd68c, - 0x17a758c9, - 0x18329b09, - 0x18b37549, - 0x2e82, - 0x10c5d1, - 0x7451, - 0x460d, - 0x132211, - 0x2e91, - 0x17344f, - 0x1cd5cf, - 0x7580c, - 0x129a4c, - 0x13748c, - 0x14364d, - 0x202d5, - 0x581cc, - 0x6964c, - 0x133510, - 0x17910c, - 0x18954c, - 0x199c99, - 0x1a9299, - 0x1b2559, - 0x1c0f94, - 0x1c3c94, - 0x7ad4, - 0x8554, - 0x8ad4, - 0x19258289, - 0x19807d89, - 0x1a269709, - 0x146e6ec9, - 0x2e82, - 0x14ee6ec9, - 0x2e82, - 0x7aca, - 0x2e82, - 0x156e6ec9, - 0x2e82, - 0x7aca, - 0x2e82, - 0x15ee6ec9, - 0x2e82, - 0x166e6ec9, - 0x2e82, - 0x16ee6ec9, - 0x2e82, - 0x7aca, - 0x2e82, - 0x176e6ec9, - 0x2e82, - 0x7aca, - 0x2e82, - 0x17ee6ec9, - 0x2e82, - 0x186e6ec9, - 0x2e82, - 0x7aca, - 0x2e82, - 0x18ee6ec9, - 0x2e82, - 0x7aca, - 0x2e82, - 0x196e6ec9, - 0x2e82, - 0x19ee6ec9, - 0x2e82, - 0x1a6e6ec9, - 0x2e82, - 0x7aca, - 0x2e82, - 0x48fc5, - 0x190184, - 0x10c68e, - 0x750e, - 0x79d4e, - 0x46ca, - 0x1322ce, - 0x2f4e, - 0x17350c, - 0x1cd68c, - 0x758c9, - 0x129b09, - 0x137549, - 0x58289, - 0x7d89, - 0x69709, - 0x204cd, - 0x8809, - 0x8d89, - 0x141e44, - 0x1d5f44, - 0x18d184, - 0x149c84, - 0xa3e84, - 0x2c684, - 0x36a04, - 0x52644, - 0x103a04, - 0x159da03, - 0x31b07, - 0x3484c, - 0x20c3, - 0x758c2, - 0x1dc803, - 0x20c3, - 0x35e03, - 0x148702, - 0x1da608, - 0x12d947, - 0x2942, + 0x2f451, + 0xb6fc9, + 0x97249, + 0x33c2, + 0x198c0a, + 0xaa289, + 0xaa9cf, + 0xaafce, + 0xac0c8, + 0x4742, + 0xbe0c9, + 0x1b0ece, + 0xea24c, + 0xf4d0f, + 0x1aeece, + 0x26ccc, + 0xe3389, + 0xe3911, + 0xe3ec8, + 0x2e612, + 0x17f34d, + 0x1a054d, + 0x4abcb, + 0x58415, + 0x6dc89, + 0x7280a, + 0x7a089, + 0x80510, + 0x16ff8b, + 0x1a798f, + 0x9110b, + 0x9494c, + 0x99310, + 0xa9a4a, + 0xadccd, + 0xaf68e, + 0xafdca, + 0xc4a8c, + 0xb42d4, + 0xb6c51, + 0xb8e0b, + 0xb9f0f, + 0xbb38d, + 0xbf5ce, + 0xc22cc, + 0xc3e0c, + 0xc478b, + 0xc558e, + 0xc6110, + 0xc7dcb, + 0x11c78d, + 0x141d4f, + 0x16d38c, + 0xcf38e, + 0xd1151, + 0xd564c, + 0xde6c7, + 0xf2b0d, + 0xfc10c, + 0x110450, + 0x1cc44d, + 0x105687, + 0x147410, + 0x166dc8, + 0x1710cb, + 0xb0d8f, + 0x1432c8, + 0xfafcd, + 0x10a190, + 0x176b89, + 0x1ceb2d46, + 0xb3cc3, + 0xb90c5, + 0x4e082, + 0x1b09, + 0x5590a, + 0x1d22eac6, + 0x1d73e584, + 0x56286, + 0x1dc4a, + 0x6f0cd, + 0x1d9b9b89, + 0x17c03, + 0x11594a, + 0xdb911, + 0xdbd49, + 0xdd6c7, + 0xde408, + 0xde887, + 0x11a0c8, + 0x908b, + 0x12e989, + 0xe9250, + 0xe970c, + 0xea548, + 0xea8c5, + 0x79148, + 0x10eaca, + 0xc7c07, + 0x523c7, + 0x2f42, + 0x1de46bd5, + 0x13bdca, + 0x3d888, + 0x98b89, + 0x2efc5, + 0x116b8a, + 0x8d04f, + 0x12b98b, + 0x1c340c, + 0x147952, + 0x78005, + 0x1966c8, + 0x4b60a, + 0x1e2f5b85, + 0x183acc, + 0x138c03, + 0x190ec6, + 0x3d182, + 0x10238b, + 0x102dca, + 0x150314c, + 0x11848, + 0x3c2c8, + 0x1e63d906, + 0x12fec7, + 0xa982, + 0x4e82, + 0x4bdd0, + 0x66647, + 0x2dccf, + 0x13686, + 0x15c7ce, + 0x9588b, + 0x45948, + 0x33489, + 0xfe992, + 0x190f8d, + 0x111788, + 0x112009, + 0x17ab8d, + 0x1964c9, + 0x1d714b, + 0x69bc8, + 0x7ea48, + 0x80908, + 0x80d49, + 0x80f4a, + 0x8730c, + 0x4648a, + 0xec2ca, + 0x110d47, + 0x9f70a, + 0x13670d, + 0xe41d1, + 0x1eabf8c6, + 0x1ab70b, + 0x12cfcc, + 0x37908, + 0x61249, + 0x15b14d, + 0x1a38d0, + 0x17b8cd, + 0x14302, + 0x5cd8d, + 0x5402, + 0x18d82, + 0x110c8a, + 0x1d4ca, + 0xfacca, + 0x11998b, + 0x6b50c, + 0x11a4ca, + 0x11a74e, + 0x1b318d, + 0x1edde545, + 0x1dae88, + 0x57c2, + 0x14e85c3, + 0x14ebec0e, + 0x156037ce, + 0x15e0254a, + 0x16745d0e, + 0x16e8f9ce, + 0x1772b10c, + 0x142d1c7, + 0x142d1c9, + 0x14bd543, + 0x17f6ae8c, + 0x186e7b09, + 0x18ef8849, + 0x1974a209, + 0x2482, + 0xbeb51, + 0x3711, + 0x248d, + 0x145c51, + 0x8f911, + 0x12b04f, + 0x16adcf, + 0xe7a4c, + 0xf878c, + 0x14a14c, + 0x1dc00d, + 0x1015d5, + 0x661cc, + 0x7394c, + 0x1bad50, + 0x130d4c, + 0x133fcc, + 0x155a59, + 0x162919, + 0x199999, + 0x1b67d4, + 0x1c41d4, + 0x1d09d4, + 0x5a54, + 0x6b54, + 0x19e66289, + 0x1a5d0c89, + 0x1ae73a09, + 0x152e40c9, + 0x2482, + 0x15ae40c9, + 0x2482, + 0x5a4a, + 0x2482, + 0x162e40c9, + 0x2482, + 0x5a4a, + 0x2482, + 0x16ae40c9, + 0x2482, + 0x172e40c9, + 0x2482, + 0x17ae40c9, + 0x2482, + 0x5a4a, + 0x2482, + 0x182e40c9, + 0x2482, + 0x5a4a, + 0x2482, + 0x18ae40c9, + 0x2482, + 0x192e40c9, + 0x2482, + 0x5a4a, + 0x2482, + 0x19ae40c9, + 0x2482, + 0x5a4a, + 0x2482, + 0x1a2e40c9, + 0x2482, + 0x1aae40c9, + 0x2482, + 0x1b2e40c9, + 0x2482, + 0x5a4a, + 0x2482, + 0x1400401, + 0x8f05, + 0x1a3f44, + 0x1442303, + 0x15b08c3, + 0x14ef043, + 0xbec0e, + 0x37ce, + 0x7984e, + 0x254a, + 0x145d0e, + 0x8f9ce, + 0x12b10c, + 0x16ae8c, + 0xe7b09, + 0xf8849, + 0x14a209, + 0x66289, + 0x1d0c89, + 0x73a09, + 0x1017cd, + 0x5d09, + 0x6e09, + 0x14c004, + 0x1a5104, + 0x1b3644, + 0x1b5344, + 0xa4dc4, + 0x1a82c4, + 0x35e04, + 0x50fc4, + 0x13584, + 0x1587c03, + 0xbe9c7, + 0x33d8c, + 0x13583, + 0x9802, + 0x10bb86, + 0x1b3183, + 0x13583, + 0x9bb83, + 0x3f02, + 0x3f08, + 0xdff47, + 0x12ea07, + 0x81c2, 0x2000c2, - 0x202782, - 0x203dc2, - 0x219d02, + 0x20c302, + 0x201d02, + 0x20c202, 0x200382, 0x2003c2, - 0x209482, - 0x22d7c3, - 0x233743, - 0x220583, - 0x219c83, - 0x206b43, - 0x23cf83, - 0xa14c8, - 0x22d7c3, - 0x233743, - 0x206b43, - 0x23cf83, - 0xb243, - 0x220583, - 0x22884, + 0x204e82, + 0x22c0c3, + 0x232c43, + 0x228b03, + 0x214383, + 0x20a803, + 0x216603, + 0x9fe08, + 0x22c0c3, + 0x232c43, + 0x20a803, + 0x216603, + 0x8503, + 0x228b03, + 0x24e44, 0x2000c2, - 0x24ce83, - 0x1fa2d7c3, - 0x38abc7, - 0x220583, - 0x214903, - 0x205184, - 0x206b43, - 0x23cf83, - 0x21d60a, - 0x239605, - 0x213c43, - 0x21be02, - 0xa14c8, - 0xa14c8, - 0x2782, - 0x1392c2, - 0x2033114b, - 0x2062da44, - 0x7ddc5, - 0x5f85, - 0x1d9c46, - 0x20a05f85, - 0x57243, - 0x1080c3, - 0x109744, - 0x3283, - 0x131905, - 0x12dac5, - 0xa14c8, - 0x1b047, - 0x2d7c3, - 0x2123a4c7, - 0x3686, - 0x21573345, - 0x3a5c7, - 0xbb4a, - 0xba08, - 0xea47, - 0x679ca, - 0x183548, - 0x33c87, - 0x1a618f, - 0x3e047, - 0x52446, - 0x13df10, - 0xf43cf, - 0x12789, - 0x5ad44, - 0x2183a68e, - 0x50949, - 0x69346, - 0x1071c9, - 0x18bb06, - 0x1c4d06, - 0x6c40c, - 0x19f00a, - 0x80d07, - 0x1cd10a, - 0x160a49, - 0xef0cc, - 0x1b4a8a, - 0x60c0a, - 0x131949, - 0x5acc6, - 0x80dca, - 0x11658a, - 0x9cf0a, - 0x11a349, - 0xdce88, - 0xdd106, - 0xe3a0d, - 0xbacc5, - 0x21f4df8c, - 0x137987, - 0x1051c9, - 0xb4147, - 0x10cad4, - 0x10cfcb, - 0x3fa0a, - 0x19904a, - 0xa65cd, - 0x14f3e89, - 0x1154cc, - 0x115d8b, - 0x18b03, - 0x18b03, - 0x29f46, - 0x18b03, - 0x1d9c48, - 0x1cd543, - 0x150c443, - 0x54389, - 0x14cfe83, - 0x82ec7, - 0x22dc6409, - 0x12a06, - 0x1081c9, - 0x4ce83, - 0xa14c8, - 0x2782, - 0x51184, - 0x88dc3, - 0x1da885, - 0x22d7c3, - 0x233743, - 0x220583, - 0x206b43, - 0x23cf83, - 0x20a683, - 0x22d7c3, - 0x233743, - 0x228843, - 0x220583, - 0x205e03, - 0x206b43, - 0x23cf83, - 0x296983, - 0x207b83, - 0x20a683, - 0x241844, - 0x22d7c3, - 0x233743, - 0x220583, - 0x206b43, - 0x23cf83, - 0x204f03, - 0x249c6505, - 0x142c183, - 0x22d7c3, - 0x233743, - 0x219d03, - 0x228843, - 0x220583, - 0x222884, - 0x37fa83, - 0x22a243, - 0x205e03, - 0x206b43, - 0x23cf83, - 0x213c43, - 0x2561dac3, - 0x15c709, - 0x2782, - 0x2097c3, - 0x2622d7c3, - 0x233743, - 0x24adc3, - 0x220583, - 0x217343, - 0x22a243, - 0x23cf83, - 0x21c3c3, - 0x369444, - 0xa14c8, - 0x26a2d7c3, - 0x233743, - 0x2aa983, - 0x220583, - 0x205e03, - 0x205184, - 0x206b43, - 0x23cf83, - 0x22ec43, - 0xa14c8, - 0x2722d7c3, - 0x233743, - 0x228843, - 0x2013c3, - 0x23cf83, - 0xa14c8, - 0x142e5c7, - 0x24ce83, - 0x22d7c3, - 0x233743, - 0x220583, - 0x222884, - 0x205184, - 0x206b43, - 0x23cf83, - 0x12dac5, - 0x14c47, - 0x10cd0b, - 0xdee04, - 0xbacc5, - 0x144b148, - 0xaafcd, - 0x286e75c5, - 0x9a544, - 0x2782, - 0x1083, - 0x175785, - 0x2ebc2, - 0x2b82, - 0x3cc145, - 0xa14c8, - 0x18b02, - 0x1d003, - 0x16240f, - 0x2782, - 0xfd346, - 0x2ebc2, - 0x32c608, - 0x241844, - 0x340cc6, - 0x343506, - 0xa14c8, - 0x301983, - 0x2c6689, - 0x359a95, - 0x159a9f, - 0x22d7c3, - 0x3c0b52, - 0x16ed46, - 0x17fe05, - 0xe28a, - 0x386c9, - 0x3c090f, - 0x2dd2c4, - 0x25e605, - 0x30e590, - 0x2449c7, - 0x2013c3, - 0x2fb908, - 0x10b906, - 0x27ee0a, - 0x206f84, - 0x2f7043, - 0x21be02, - 0x2f060b, - 0x13c3, - 0x19c3c4, - 0x22d7c3, - 0x233743, - 0x220583, - 0x205e03, - 0x206b43, - 0x13c3, - 0x23cf83, - 0x2fe843, - 0x202782, - 0xe16c3, - 0xf984, - 0x206b43, - 0x23cf83, - 0x22d7c3, - 0x233743, - 0x220583, - 0x205e03, - 0x23cf83, - 0x22d7c3, - 0x233743, - 0x220583, - 0x214903, - 0x226243, - 0x23cf83, - 0x4ce83, - 0x202782, - 0x22d7c3, - 0x233743, - 0x206b43, - 0x13c3, - 0x23cf83, + 0x248343, + 0x2122c0c3, + 0x38c507, + 0x228b03, + 0x20e403, + 0x217b84, + 0x20a803, + 0x216603, + 0x21de8a, + 0x240985, + 0x216103, + 0x219f82, + 0x9fe08, + 0x9fe08, + 0xc302, + 0x135f02, + 0x21bb990b, + 0x21e2c344, + 0x13e4c5, + 0x7d45, + 0xfdc46, + 0x22207d45, + 0x50cc3, + 0x93003, + 0x9c4, + 0x11c3, + 0x2b05, + 0x12eb85, + 0x9fe08, + 0x1ae07, + 0x2c0c3, + 0x2c28d, + 0x22a380c7, + 0x15c6, + 0x22ce7945, + 0x1a9012, + 0x381c7, + 0xa0ca, + 0x9f88, + 0xe207, + 0x63d4a, + 0x18aec8, + 0x62607, + 0x18098f, + 0x43dc7, + 0x50dc6, + 0x13b0d0, + 0xc9fcf, + 0x20f09, + 0x56304, + 0x2303828e, + 0x11fb09, + 0x65dc6, + 0x109649, + 0x18ce06, + 0x1ba306, + 0x189e8c, + 0x11424a, + 0x33247, + 0x129b8a, + 0x143889, + 0xed38c, + 0x1ceb0a, + 0x7e54a, + 0x2b49, + 0x56286, + 0x3330a, + 0x11268a, + 0xa0d4a, + 0x127149, + 0xdad88, + 0xdb006, + 0xe208d, + 0xb9545, + 0x23754d4c, + 0x14a647, + 0x107849, + 0xa8c07, + 0x10a594, + 0x10aa8b, + 0x6744a, + 0xfe80a, + 0xa6d8d, + 0x1519b89, + 0x11154c, + 0x111e0b, + 0xe683, + 0xe683, + 0x39346, + 0xe683, + 0xfdc48, + 0x1581c3, + 0x33445, + 0x141d703, + 0x4e9c9, + 0x156d603, + 0x1439887, + 0x80787, + 0x245846c9, + 0xa6c6, + 0xbd389, + 0x48343, + 0x9fe08, + 0xc302, + 0x4b304, + 0x4243, + 0x4185, + 0x22c0c3, + 0x232c43, + 0x228b03, + 0x20a803, + 0x216603, + 0x225843, + 0x22c0c3, + 0x232c43, + 0x212483, + 0x228b03, + 0x211543, + 0x20a803, + 0x216603, + 0x297403, + 0x205b03, + 0x225843, + 0x242244, + 0x22c0c3, + 0x232c43, + 0x228b03, + 0x20a803, + 0x216603, + 0x21d0c3, + 0x261847c5, + 0x142bd43, + 0x22c0c3, + 0x232c43, + 0x214403, + 0x212483, + 0x228b03, + 0x224e44, + 0x201143, + 0x238cc3, + 0x211543, + 0x20a803, + 0x6d9c3, + 0x216603, + 0x216103, + 0x26e20643, + 0x147849, + 0xc302, + 0x2ff843, + 0x27a2c0c3, + 0x232c43, + 0x244743, + 0x228b03, + 0x217203, + 0x238cc3, + 0x216603, + 0x2f5cc3, + 0x3a4e04, + 0x9fe08, + 0x2822c0c3, + 0x232c43, + 0x2ac183, + 0x228b03, + 0x211543, + 0x217b84, + 0x20a803, + 0x216603, + 0x22d843, + 0x9fe08, + 0x28a2c0c3, + 0x232c43, + 0x212483, + 0x20ca43, + 0x216603, + 0x9fe08, + 0x142d1c7, + 0x248343, + 0x22c0c3, + 0x232c43, + 0x228b03, + 0x224e44, + 0x217b84, + 0x20a803, + 0x216603, + 0x12eb85, + 0x176c87, + 0x10a7cb, + 0xdc144, + 0xb9545, + 0x14470c8, + 0x2a20d, + 0x29e352c5, + 0x46e44, + 0xc302, + 0x8303, + 0x176a85, + 0x2d7c2, + 0x1dc2, + 0x2e7585, + 0x9fe08, + 0x7e42, + 0xeec3, + 0x16368f, + 0xc302, + 0xfcac6, 0x2000c2, - 0x22d7c3, - 0x233743, - 0x220583, - 0x206b43, - 0x23cf83, - 0x5f85, - 0x241844, - 0x22d7c3, - 0x233743, - 0x3216c4, - 0x206b43, - 0x23cf83, - 0xa14c8, - 0x22d7c3, - 0x233743, - 0x220583, - 0x206b43, - 0x6df83, - 0x23cf83, - 0x137249, - 0x22d7c3, - 0x233743, - 0x228843, - 0x209a03, - 0x205e03, - 0x206b43, - 0x13c3, - 0x23cf83, - 0x22d7c3, - 0x233743, - 0x220583, - 0x32ef44, - 0x222884, - 0x206b43, - 0x23cf83, - 0x207b83, - 0x202782, - 0x22d7c3, - 0x233743, - 0x220583, - 0x206b43, - 0x6df83, - 0x23cf83, - 0xa14c8, - 0x22d7c3, - 0x233743, - 0x220583, - 0x2067c3, - 0x44b03, - 0x14903, - 0x206b43, - 0x23cf83, - 0x323aca, - 0x345349, - 0x35c04b, - 0x35d44a, - 0x3660ca, - 0x376b8b, - 0x38b8ca, - 0x391f8a, - 0x39858a, - 0x39880b, - 0x3bcac9, - 0x3c94ca, - 0x3c9c8b, - 0x3d680b, - 0x3db74a, - 0x22d7c3, - 0x233743, - 0x228843, - 0x205e03, - 0x206b43, - 0x13c3, - 0x23cf83, - 0x17830b, - 0x5e148, - 0xd9084, - 0x46006, - 0xec149, - 0xa14c8, - 0x22d7c3, - 0xe284, - 0x264b84, - 0x20d142, - 0x205184, - 0x331e45, - 0x20a683, - 0x241844, - 0x22d7c3, - 0x236204, - 0x233743, - 0x251184, - 0x2dd2c4, - 0x222884, - 0x22a243, - 0x206b43, - 0x23cf83, - 0x3451c5, - 0x204f03, - 0x213c43, - 0x210f43, - 0x23d804, - 0x309384, - 0x308485, - 0xa14c8, - 0x2010c4, - 0x3c4e86, - 0x331a84, - 0x202782, - 0x35cc07, - 0x249587, - 0x24e444, - 0x25bec5, - 0x302fc5, - 0x22e1c5, - 0x222884, - 0x3883c8, - 0x239006, - 0x34c488, - 0x27a4c5, - 0x2e43c5, - 0x235fc4, - 0x23cf83, - 0x2f7dc4, - 0x3751c6, - 0x239703, - 0x23d804, - 0x243185, - 0x203b44, - 0x255ac4, - 0x21be02, - 0x39f906, - 0x3aec06, - 0x313d05, + 0x248343, + 0x22c0c3, + 0x228b03, + 0x224e44, + 0x211543, + 0x217b84, + 0x20a803, + 0x216603, + 0x216103, + 0x2d7c2, + 0x32d6c8, + 0x242244, + 0x342bc6, + 0x34a006, + 0x9fe08, + 0x31f443, + 0x20f509, + 0x3046d5, + 0x1046df, + 0x22c0c3, + 0x11d07, + 0x330912, + 0x170a46, + 0x17f0c5, + 0xda4a, + 0x1d3049, + 0x3306cf, + 0x2db1c4, + 0x28ed85, + 0x30b4d0, + 0x322e47, + 0x20ca43, + 0x31b008, + 0xf6f86, + 0x280aca, + 0x224d04, + 0x2f55c3, + 0x219f82, + 0x2eec0b, + 0xca43, + 0x17d404, + 0x22c0c3, + 0x232c43, + 0x228b03, + 0x211543, + 0x20a803, + 0xca43, + 0x216603, + 0x2fd643, + 0x20c302, + 0x12aec3, + 0x12a8c4, + 0x20a803, + 0x216603, + 0x22c0c3, + 0x232c43, + 0x228b03, + 0x211543, + 0x216603, + 0x22c0c3, + 0x232c43, + 0x228b03, + 0x20e403, + 0x22b0c3, + 0x216603, + 0x48343, + 0x20c302, + 0x22c0c3, + 0x232c43, + 0x20a803, + 0xca43, + 0x216603, 0x2000c2, - 0x24ce83, - 0x30a02782, - 0x21e604, + 0x22c0c3, + 0x232c43, + 0x228b03, + 0x20a803, + 0x216603, + 0x7d45, + 0x242244, + 0x22c0c3, + 0x232c43, + 0x303f84, + 0x20a803, + 0x216603, + 0x9fe08, + 0x22c0c3, + 0x232c43, + 0x228b03, + 0x20a803, + 0x6d9c3, + 0x216603, + 0x133d89, + 0x22c0c3, + 0x232c43, + 0x212483, + 0x204f43, + 0x211543, + 0x20a803, + 0xca43, + 0x216603, + 0x22c0c3, + 0x232c43, + 0x228b03, + 0x329144, + 0x224e44, + 0x20a803, + 0x216603, + 0x205b03, + 0x20c302, + 0x22c0c3, + 0x232c43, + 0x228b03, + 0x20a803, + 0x6d9c3, + 0x216603, + 0x9fe08, + 0x22c0c3, + 0x232c43, + 0x228b03, + 0x220383, + 0x63f43, + 0xe403, + 0x20a803, + 0x6d9c3, + 0x216603, + 0x32370a, + 0x3484c9, + 0x35f2cb, + 0x35f9ca, + 0x366b8a, + 0x378e4b, + 0x38cbca, + 0x39278a, + 0x39914a, + 0x3993cb, + 0x3b8049, + 0x3c840a, + 0x3c894b, + 0x3d5fcb, + 0x3dc90a, + 0x22c0c3, + 0x232c43, + 0x212483, + 0x211543, + 0x20a803, + 0xca43, + 0x216603, + 0x920b, + 0x5a448, + 0x17acc4, + 0x91c6, + 0x3e109, + 0x9fe08, + 0x22c0c3, + 0xda44, + 0x260904, + 0x20aa02, + 0x217b84, + 0x203045, + 0x225843, + 0x242244, + 0x22c0c3, + 0x235604, + 0x232c43, + 0x24b304, + 0x2db1c4, + 0x224e44, + 0x238cc3, + 0x20a803, + 0x216603, + 0x25cf45, + 0x21d0c3, + 0x216103, + 0x24f1c3, + 0x246484, + 0x2be544, + 0x2bd645, + 0x9fe08, + 0x344b04, + 0x3ba486, + 0x202c84, + 0x20c302, + 0x347d47, + 0x243647, + 0x249204, + 0x238a05, + 0x3cc645, + 0x22cd85, + 0x224e44, + 0x388dc8, + 0x3db706, + 0x32bec8, + 0x27c8c5, + 0x2e2a45, + 0x340644, + 0x216603, + 0x2f61c4, + 0x377bc6, + 0x240a83, + 0x246484, + 0x2411c5, + 0x201a84, + 0x336544, + 0x219f82, + 0x322706, + 0x3ab5c6, + 0x30df85, + 0x2000c2, + 0x248343, + 0x3260c302, + 0x3d0584, 0x200382, - 0x205e03, - 0x245ec2, - 0x206b43, + 0x211543, + 0x209082, + 0x20a803, 0x2003c2, - 0x2f4786, - 0x202003, - 0x207b83, - 0xab204, - 0xa14c8, - 0xa14c8, - 0x220583, - 0x6df83, + 0x2f1d06, + 0x20c603, + 0x205b03, + 0x9fe08, + 0x9fe08, + 0x228b03, + 0x6d9c3, 0x2000c2, - 0x31602782, - 0x220583, - 0x268fc3, - 0x37fa83, - 0x22da44, - 0x206b43, - 0x23cf83, - 0xa14c8, + 0x3320c302, + 0x228b03, + 0x2623c3, + 0x201143, + 0x22c344, + 0x20a803, + 0x216603, + 0x9fe08, 0x2000c2, - 0x31e02782, - 0x22d7c3, - 0x206b43, - 0x13c3, - 0x23cf83, + 0x33a0c302, + 0x22c0c3, + 0x20a803, + 0xca43, + 0x216603, 0x682, - 0x2062c2, - 0x2195c2, - 0x214903, - 0x2ef083, + 0x206902, + 0x20ff42, + 0x20e403, + 0x2ed343, 0x2000c2, - 0x12dac5, - 0xa14c8, - 0x14c47, - 0x202782, - 0x233743, - 0x251184, - 0x204183, - 0x220583, - 0x209a03, - 0x205e03, - 0x206b43, - 0x212203, - 0x23cf83, - 0x234703, - 0x1cb6d3, - 0x127714, - 0x12dac5, - 0x14c47, - 0x114486, - 0x111b4b, - 0x29f46, - 0x58587, - 0x5bec6, + 0x12eb85, + 0x9fe08, + 0x176c87, + 0x20c302, + 0x232c43, + 0x24b304, + 0x2020c3, + 0x228b03, + 0x204f43, + 0x211543, + 0x20a803, + 0x213dc3, + 0x216603, + 0x233c43, + 0x1b8a13, + 0x127c94, + 0x12eb85, + 0x176c87, + 0x10f246, + 0x11b7cb, + 0x39346, + 0x531c7, + 0x38a06, 0x649, - 0x10408a, - 0x8af4d, - 0x1a0d8c, - 0x116f0a, - 0xf9708, - 0x45585, - 0xbb88, - 0x5bac6, - 0x1be646, - 0xec046, + 0x160d4a, + 0x8984d, + 0x1263cc, + 0x11300a, + 0x45c88, + 0x175305, + 0xa108, + 0x13686, + 0x1be2c6, + 0x3e006, 0x602, - 0x2758c2, - 0x7844, - 0x9b106, - 0x178050, - 0x83a0e, - 0x49c6, - 0x177e0c, - 0x336488cb, - 0x12dac5, - 0x1407cb, - 0x33bbe584, - 0x190347, - 0x23ed1, - 0x10388a, - 0x22d7c3, - 0x67945, - 0x160308, - 0x16f44, - 0x5a545, - 0x33d10886, - 0x9a3c6, - 0xbc406, - 0x91d4a, - 0x198ac3, - 0x34242584, - 0x54389, - 0x1784a, - 0x14cea89, + 0x209802, + 0x3b04, + 0x9bb86, + 0x184410, + 0x8170e, + 0x2846, + 0x1841cc, + 0x3537314b, + 0x12eb85, + 0x1426cb, + 0x357be204, + 0x1a4107, + 0x25191, + 0x11f54a, + 0x22c0c3, + 0x63cc5, + 0x1bd708, + 0x12704, + 0x55b05, + 0x3588c906, + 0xa7786, + 0xc14c6, + 0x9174a, + 0x1a8883, + 0x35e0bfc4, + 0x4e9c9, + 0x12c047, + 0x1770a, + 0x14ce3c9, 0x605, - 0x110c83, - 0x3479e587, - 0xfc85, - 0x1563046, - 0x15584c, - 0xfac48, - 0xf084b, - 0xdf44b, - 0x34a4b78c, - 0x140c0c3, - 0xbbf88, - 0xf0ac5, - 0xa0c09, - 0xf3f88, - 0x141d306, - 0x89947, - 0x34f7c5c9, - 0x12b3c7, - 0x15e1ca, - 0x115a4d, - 0x140fc8, - 0x20c3, - 0x108943, - 0x1d9c48, - 0x103a04, - 0x129285, - 0xe8507, - 0x35245dc3, - 0x3575fec6, - 0x35af8644, - 0x35f00207, - 0x1d9c44, - 0x1d9c44, - 0x1d9c44, - 0x1d9c44, - 0x22d7c3, - 0x233743, - 0x220583, - 0x205e03, - 0x206b43, - 0x23cf83, + 0xeac83, + 0x3622eb47, + 0x12abc5, + 0x153c6c6, + 0x153f846, + 0xace4c, + 0xfa308, + 0x3643d183, + 0xeee4b, + 0x118a4b, + 0x36a4528c, + 0x14070c3, + 0xbb048, + 0xef0c5, + 0xa2349, + 0x119c88, + 0x141db86, + 0x88147, + 0x36f5b149, + 0x117787, + 0x16074a, + 0x111acd, + 0x8148, + 0x13583, + 0xbdb03, + 0xfdc48, + 0x13584, + 0x1224c5, + 0x148d103, + 0xe85c7, + 0x372e85c3, + 0x377afc46, + 0x37af67c4, + 0x37f02f87, + 0xfdc44, + 0xfdc44, + 0xfdc44, + 0xfdc44, + 0x22c0c3, + 0x232c43, + 0x228b03, + 0x211543, + 0x20a803, + 0x216603, 0x2000c2, - 0x202782, - 0x220583, - 0x2067c2, - 0x206b43, - 0x23cf83, - 0x202003, - 0x38054f, - 0x38090e, - 0xa14c8, - 0x22d7c3, - 0x43447, - 0x233743, - 0x220583, - 0x219e43, - 0x206b43, - 0x23cf83, - 0x4904, - 0x33c4, - 0xa04, - 0x21cd03, - 0x30a807, - 0x201842, - 0x2c9689, - 0x200b02, - 0x24efcb, - 0x2a52ca, - 0x2e2689, + 0x20c302, + 0x228b03, + 0x203dc2, + 0x20a803, + 0x216603, + 0x20c603, + 0x37fe4f, + 0x38020e, + 0x9fe08, + 0x22c0c3, + 0x41487, + 0x232c43, + 0x228b03, + 0x214543, + 0x20a803, + 0x216603, + 0x2784, + 0x1304, + 0x144444, + 0x21c0c3, + 0x374247, + 0x206082, + 0x26c3c9, + 0x200ac2, + 0x24c0cb, + 0x29d88a, + 0x29e589, 0x200542, - 0x2750c6, - 0x3ac995, - 0x24f115, - 0x230313, - 0x24f693, - 0x220f02, - 0x220f05, - 0x360e4c, - 0x27680b, - 0x296e05, - 0x2020c2, - 0x2ffe82, - 0x38f886, - 0x202442, - 0x260646, - 0x20e50d, - 0x20fa0c, - 0x224bc4, + 0x212ac6, + 0x38d7d5, + 0x24c215, + 0x231e53, + 0x24c793, + 0x212082, + 0x21e405, + 0x369e0c, + 0x27494b, + 0x297885, + 0x202542, + 0x299082, + 0x37bf46, + 0x202282, + 0x37bb46, + 0x20dccd, + 0x32a94c, + 0x226604, 0x200882, - 0x20c882, - 0x39e408, + 0x20be02, + 0x22e9c8, 0x200202, - 0x30f9c6, - 0x30f9cf, - 0x393e90, - 0x3a39c4, - 0x3acb55, - 0x230493, - 0x204dc3, - 0x34320a, - 0x20ee07, - 0x35f709, - 0x217707, - 0x225a42, + 0x30e386, + 0x30e38f, + 0x393f90, + 0x21f204, + 0x38d995, + 0x231fd3, + 0x21cf83, + 0x349d0a, + 0x208b87, + 0x369349, + 0x2175c7, + 0x227682, 0x200282, - 0x3b2246, - 0x207942, - 0xa14c8, - 0x201a42, - 0x2010c2, - 0x209247, - 0x341247, - 0x341251, - 0x218105, - 0x21810e, - 0x21860f, - 0x21c742, - 0x394547, - 0x21cd48, - 0x207c02, - 0x325802, - 0x2a9746, - 0x3418cf, - 0x2a9750, - 0x22b882, - 0x205cc2, - 0x32f488, - 0x212283, - 0x288f88, - 0x30bd8d, - 0x23af03, - 0x3723c8, - 0x23af0f, - 0x23b2ce, - 0x398d0a, - 0x226e51, - 0x2272d0, - 0x2bd68d, - 0x2bd9cc, - 0x3c2447, - 0x343387, - 0x340d89, - 0x224cc2, - 0x201942, - 0x259e0c, - 0x25a10b, - 0x2014c2, - 0x2c3206, - 0x22ec82, + 0x3b4e46, + 0x203c02, + 0x9fe08, + 0x208082, + 0x208342, + 0x21e9c7, + 0x330307, + 0x330311, + 0x218585, + 0x21858e, + 0x21968f, + 0x209582, + 0x373907, + 0x21c708, + 0x205b82, + 0x2c1142, + 0x21bb46, + 0x21bb4f, + 0x269f10, + 0x22a8c2, + 0x204042, + 0x251c88, + 0x204043, + 0x25c6c8, + 0x2db50d, + 0x2094c3, + 0x3bc3c8, + 0x27f40f, + 0x27f7ce, + 0x2fe4ca, + 0x2da0d1, + 0x2da550, + 0x2dc90d, + 0x2dcc4c, + 0x2ff6c7, + 0x349e87, + 0x342c89, + 0x226702, + 0x201ec2, + 0x2553cc, + 0x2556cb, + 0x200d42, + 0x2c4946, + 0x202c82, 0x200482, - 0x2d5e42, - 0x202782, - 0x22dbc4, - 0x23a187, - 0x22bdc2, - 0x23e4c7, - 0x240787, - 0x220282, - 0x22eec2, - 0x243305, - 0x237982, - 0x2e920e, - 0x38288d, - 0x233743, - 0x397d0e, - 0x2b628d, - 0x341643, - 0x201602, - 0x286d04, - 0x265582, - 0x2029c2, - 0x39b945, - 0x39d087, - 0x24a442, - 0x219d02, - 0x250d87, - 0x254708, - 0x2b06c2, - 0x2788c6, - 0x259c8c, - 0x259fcb, - 0x20e282, - 0x260e8f, - 0x261250, - 0x26164f, - 0x261a15, - 0x261f54, - 0x26244e, - 0x2627ce, - 0x262b4f, - 0x262f0e, - 0x263294, - 0x263793, - 0x263c4d, - 0x277d09, - 0x28cc43, - 0x204182, - 0x28dc85, - 0x3c70c6, + 0x28cac2, + 0x20c302, + 0x22c784, + 0x237d87, + 0x22ae02, + 0x23cbc7, + 0x23ed47, + 0x22e002, + 0x22dac2, + 0x241345, + 0x259dc2, + 0x382a4e, + 0x3c91cd, + 0x232c43, + 0x28658e, + 0x3d234d, + 0x32fe43, + 0x202102, + 0x284744, + 0x24a542, + 0x2253c2, + 0x39b645, + 0x39ce07, + 0x243f82, + 0x20c202, + 0x24af07, + 0x24ed48, + 0x2b12c2, + 0x278086, + 0x25524c, + 0x25558b, + 0x203d42, + 0x25d0cf, + 0x25d490, + 0x25d88f, + 0x25dc55, + 0x25e194, + 0x25e68e, + 0x25ea0e, + 0x25ed8f, + 0x25f14e, + 0x25f4d4, + 0x25f9d3, + 0x25fe8d, + 0x276a09, + 0x28b243, + 0x2020c2, + 0x35c2c5, + 0x3cfd46, 0x200382, - 0x367207, - 0x220583, + 0x3776c7, + 0x228b03, 0x200642, - 0x232548, - 0x227091, - 0x2274d0, - 0x200bc2, - 0x28ba87, - 0x201b82, - 0x309a07, - 0x253a42, - 0x37ed89, - 0x38f847, - 0x318008, - 0x3106c6, - 0x2eef83, - 0x3cbdc5, - 0x2339c2, + 0x231448, + 0x2da311, + 0x2da750, + 0x202b82, + 0x28a387, + 0x201742, + 0x247f07, + 0x24e082, + 0x328c49, + 0x37bf07, + 0x296c48, + 0x28c746, + 0x28f303, + 0x28f305, + 0x21d702, 0x2004c2, - 0x3d5e45, - 0x377b85, - 0x200f82, - 0x21c583, - 0x340b47, - 0x218447, - 0x204042, - 0x204044, - 0x218983, - 0x348009, - 0x218988, - 0x200b42, - 0x208002, - 0x22cec7, - 0x235d05, - 0x363388, - 0x246a07, - 0x209b83, - 0x29af86, - 0x2bd50d, - 0x2bd88c, - 0x2da786, - 0x202282, - 0x2df302, - 0x2024c2, - 0x23ad8f, - 0x23b18e, - 0x303047, - 0x205e02, - 0x3200c5, - 0x3200c6, - 0x202dc2, - 0x200c02, - 0x29f506, - 0x210203, - 0x309946, - 0x2ccec5, - 0x2ccecd, - 0x2cd515, - 0x2cdf4c, - 0x2ce2cd, - 0x2ce612, - 0x200e82, - 0x26cec2, - 0x201342, - 0x329906, - 0x3c8346, - 0x2013c2, - 0x3c7146, - 0x21a682, - 0x2c71c5, - 0x200d42, - 0x2e9349, - 0x222ecc, - 0x22320b, + 0x3b5245, + 0x383f45, + 0x201b02, + 0x22aec3, + 0x342a47, + 0x20c907, + 0x201f82, + 0x201f84, + 0x20e503, + 0x2ebf89, + 0x20e508, + 0x203102, + 0x205f82, + 0x2eb887, + 0x3dd285, + 0x33fb88, + 0x34e347, + 0x21a7c3, + 0x29ba06, + 0x2dc78d, + 0x2dcb0c, + 0x2d5d46, + 0x204b02, + 0x21fc02, + 0x206a42, + 0x27f28f, + 0x27f68e, + 0x3cc6c7, + 0x206702, + 0x295d05, + 0x295d06, + 0x21d902, + 0x200bc2, + 0x28d746, + 0x2062c3, + 0x206586, + 0x2cc185, + 0x2cc18d, + 0x2cc7d5, + 0x2cd88c, + 0x2cdc0d, + 0x2cdf52, + 0x205a02, + 0x26bf42, + 0x2050c2, + 0x3dbec6, + 0x3b0d86, + 0x202f42, + 0x3cfdc6, + 0x218d42, + 0x374a45, + 0x202f82, + 0x382b89, + 0x22330c, + 0x22364b, 0x2003c2, - 0x2550c8, - 0x2039c2, - 0x201002, - 0x271746, - 0x2e6e45, - 0x309807, - 0x226ac5, - 0x25bc05, - 0x2434c2, - 0x20bc42, - 0x202142, - 0x2ead87, - 0x2f484d, - 0x2f4bcc, - 0x3abf47, - 0x278842, - 0x203d42, - 0x20cb48, - 0x203d48, - 0x2e7c08, - 0x2f30c4, - 0x2c3c87, - 0x27df03, - 0x223802, - 0x204f02, - 0x2f5849, - 0x22a347, - 0x213c42, - 0x271b45, - 0x241f42, - 0x21f4c2, - 0x3bfe83, - 0x3bfe86, - 0x2fe542, - 0x2ffa82, + 0x24f708, + 0x201902, + 0x200a82, + 0x271f86, + 0x2e4045, + 0x200a87, + 0x228445, + 0x2563c5, + 0x2091c2, + 0x20a1c2, + 0x2161c2, + 0x3a7c87, + 0x2f1dcd, + 0x2f214c, + 0x243047, + 0x278002, + 0x201c82, + 0x3c63c8, + 0x201c88, + 0x32c1c8, + 0x2faf84, + 0x2c5807, + 0x33e603, + 0x223c42, + 0x212842, + 0x2f3749, + 0x26aec7, + 0x216102, + 0x272385, + 0x220082, + 0x20b182, + 0x2fd083, + 0x2fd086, + 0x2fd202, + 0x301b02, 0x200402, - 0x27ea46, - 0x2ddb07, - 0x213a42, + 0x36c686, + 0x2aba07, + 0x215f02, 0x200902, - 0x288dcf, - 0x397b4d, - 0x3d364e, - 0x2b610c, - 0x202342, - 0x204482, - 0x310505, - 0x3220c6, - 0x202482, - 0x206382, + 0x25c50f, + 0x2863cd, + 0x3b12ce, + 0x3d21cc, + 0x204bc2, + 0x203d82, + 0x28c585, + 0x320886, + 0x200b82, + 0x204d42, 0x200682, - 0x246984, - 0x2fee04, - 0x355686, - 0x209482, - 0x27b0c7, - 0x233ec3, - 0x233ec8, - 0x23ba08, - 0x36ee87, - 0x253cc6, - 0x2037c2, - 0x2398c3, - 0x2b7387, - 0x287c86, - 0x2e3705, - 0x2f3448, - 0x203002, - 0x274e87, - 0x236082, - 0x308102, - 0x21bac2, - 0x218789, - 0x241542, - 0xc2148, - 0x201182, - 0x24fac3, - 0x331fc7, - 0x201202, - 0x22304c, - 0x22334b, - 0x2da806, - 0x310bc5, - 0x243982, - 0x202b42, - 0x2be3c6, - 0x267343, - 0x32ecc7, - 0x288782, + 0x286744, + 0x2db384, + 0x359786, + 0x204e82, + 0x286e87, + 0x23bc03, + 0x23bc08, + 0x23f748, + 0x37f1c7, + 0x24e306, + 0x201702, + 0x2183c3, + 0x2183c7, + 0x314946, + 0x2e7e85, + 0x2fb308, + 0x202602, + 0x3a9687, + 0x2411c2, + 0x293042, + 0x209442, + 0x219809, + 0x201082, + 0xc41c8, + 0x2021c2, + 0x2432c3, + 0x202247, + 0x205c42, + 0x22348c, + 0x22378b, + 0x2d5dc6, + 0x2eabc5, + 0x247c82, + 0x201942, + 0x2bf146, + 0x236483, + 0x328ec7, + 0x235282, 0x2008c2, - 0x3ac815, - 0x24f2d5, - 0x2301d3, - 0x24f813, - 0x38a2c7, - 0x25fad1, - 0x266d10, - 0x276c52, - 0x27b891, - 0x29a7c8, - 0x29a7d0, - 0x2a168f, - 0x2a5093, - 0x384f52, - 0x3bc3d0, - 0x2b240f, - 0x2c0dd2, - 0x3a2291, - 0x2cca13, - 0x2d7212, - 0x2db24f, - 0x2dc04e, - 0x2e0392, - 0x2e2491, - 0x2ec80f, - 0x2fe1ce, - 0x2f0fd1, - 0x2fae10, - 0x2fbc92, - 0x2fe8d1, - 0x33c390, - 0x354d0f, - 0x3bd1d1, - 0x3c9890, - 0x31b8c6, - 0x33bf87, - 0x215907, - 0x203b02, - 0x2847c5, - 0x30e307, - 0x2195c2, - 0x206042, - 0x227d45, - 0x202243, - 0x308e06, - 0x2f4a0d, - 0x2f4d4c, - 0x206842, - 0x360ccb, - 0x2766ca, - 0x220dca, - 0x2bce09, - 0x2f284b, - 0x246b4d, - 0x30ea0c, - 0x27250a, - 0x2707cc, - 0x27778b, - 0x296c4c, - 0x2b464e, - 0x3560cb, - 0x2b588c, - 0x2e4083, - 0x38bd86, - 0x3bf082, - 0x2fc182, - 0x20f203, - 0x214f82, - 0x21e4c3, - 0x32ae06, - 0x261bc7, - 0x2d3b06, - 0x2e20c8, - 0x3409c8, - 0x31e8c6, - 0x20a342, - 0x3136cd, - 0x313a0c, - 0x2df607, - 0x316d47, - 0x2351c2, - 0x213e42, - 0x276c02, - 0x279b42, - 0x3388d6, - 0x33d315, - 0x340296, - 0x343993, - 0x344052, - 0x353a93, - 0x354012, - 0x3adb0f, - 0x3bdfd8, - 0x3beb57, - 0x3c0019, - 0x3c1498, - 0x3c2e18, - 0x3c4197, - 0x3c5a17, - 0x3c6816, - 0x3ce1d3, - 0x3ce8d5, - 0x3cf792, - 0x3cfc13, - 0x202782, - 0x206b43, - 0x23cf83, - 0x22d7c3, - 0x233743, - 0x220583, - 0x205e03, - 0x205184, - 0x206b43, - 0x23cf83, - 0x202003, + 0x38d655, + 0x24c3d5, + 0x231d13, + 0x24c913, + 0x37f647, + 0x25b951, + 0x262d10, + 0x274d92, + 0x2779d1, + 0x284bc8, + 0x284bd0, + 0x2d7c8f, + 0x29d653, + 0x29e352, + 0x29ffd0, + 0x2a7b8f, + 0x2a9e12, + 0x305811, + 0x371353, + 0x3b78d2, + 0x2b2e8f, + 0x2cbe0e, + 0x2cd412, + 0x2d3c51, + 0x2d430f, + 0x2d830e, + 0x2d9791, + 0x2de010, + 0x2df0d2, + 0x2e8a91, + 0x2ef5d0, + 0x2fa4cf, + 0x2fd6d1, + 0x3029d0, + 0x31bb46, + 0x3adfc7, + 0x20ce47, + 0x201a42, + 0x2824c5, + 0x30b247, + 0x20ff42, + 0x207e02, + 0x229545, + 0x220883, + 0x2bdfc6, + 0x2f1f8d, + 0x2f22cc, + 0x217042, + 0x369c8b, + 0x27480a, + 0x21e2ca, + 0x2bc0c9, + 0x2f0c0b, + 0x34e48d, + 0x30b94c, + 0x25b3ca, + 0x27108c, + 0x2758cb, + 0x2976cc, + 0x31ce0e, + 0x36710b, + 0x2b1d4c, + 0x2e2703, + 0x37aa86, + 0x3bcb02, + 0x2fbb02, + 0x25a083, + 0x20ff82, + 0x233b03, + 0x324b86, + 0x25de07, + 0x2e0e06, + 0x2e1e88, + 0x3428c8, + 0x31d5c6, + 0x200f02, + 0x30d94d, + 0x30dc8c, + 0x318c07, + 0x312e47, + 0x229942, + 0x216302, + 0x218342, + 0x279642, + 0x335056, + 0x33a4d5, + 0x33d6d6, + 0x346693, + 0x346d52, + 0x357d53, + 0x358492, + 0x3aa4cf, + 0x3bbb18, + 0x3bc5d7, + 0x3bdc19, + 0x3be7d8, + 0x3bf698, + 0x3c46d7, + 0x3c57d7, + 0x3c7016, + 0x3ca6d3, + 0x3cbc95, + 0x3cc992, + 0x3cce13, + 0x20c302, + 0x20a803, + 0x216603, + 0x22c0c3, + 0x232c43, + 0x228b03, + 0x211543, + 0x217b84, + 0x20a803, + 0x216603, + 0x20c603, 0x2000c2, - 0x206702, - 0x37e938c5, - 0x3828a305, - 0x3867e706, - 0xa14c8, - 0x38ab2985, - 0x202782, - 0x203dc2, - 0x38f2f1c5, - 0x39282b45, - 0x39683f47, - 0x39a84c49, - 0x39e37284, + 0x203042, + 0x39e946c5, + 0x3a219305, + 0x3a675c06, + 0x9fe08, + 0x3aab3405, + 0x20c302, + 0x201d02, + 0x3aefedc5, + 0x3b280405, + 0x3b681c47, + 0x3ba82949, + 0x3bf064c4, 0x200382, 0x200642, - 0x3a24d8c5, - 0x3a698349, - 0x3ab37f88, - 0x3aeaef45, - 0x3b317887, - 0x3b613148, - 0x3baed185, - 0x3be45a86, - 0x3c2496c9, - 0x3c6d3388, - 0x3cac3848, - 0x3ce9898a, - 0x3d2e1804, - 0x3d60d685, - 0x3dabf848, - 0x3de03945, - 0x212302, - 0x3e237f83, - 0x3e6a5746, - 0x3eae6548, - 0x3efb8806, - 0x3f209388, - 0x3f727d86, - 0x3fa3dbc4, - 0x3fe02642, - 0x40301b47, - 0x406ab6c4, - 0x40a7a1c7, - 0x40f2f7c7, + 0x3c25aec5, + 0x3c6998c9, + 0x3cb34708, + 0x3ceafc45, + 0x3d313987, + 0x3d622508, + 0x3db11985, + 0x3de9a406, + 0x3e243789, + 0x3e6d1dc8, + 0x3eac45c8, + 0x3ee99f0a, + 0x3f277244, + 0x3f605285, + 0x3fac0b08, + 0x3fe01885, + 0x213ec2, + 0x40242a83, + 0x406a64c6, + 0x40b4f408, + 0x40e1f986, + 0x412dd348, + 0x41779b06, + 0x41a3f204, + 0x41e05642, + 0x427315c7, + 0x42aacb84, + 0x42e79cc7, + 0x433c4d87, 0x2003c2, - 0x4129dbc5, - 0x41644704, - 0x41ad29c7, - 0x41e31c87, - 0x42286b46, - 0x42683785, - 0x42a98447, - 0x42ed3208, - 0x4328e007, - 0x437cf549, - 0x43ad6385, - 0x43f125c7, - 0x44292f06, - 0x9a54b, - 0x44606548, - 0x22824d, - 0x27e1c9, - 0x2a874b, - 0x2aaa8b, - 0x3199cb, - 0x31758b, - 0x3222cb, - 0x32258b, - 0x322ac9, - 0x323d4b, - 0x32400b, - 0x3245cb, - 0x3256ca, - 0x325c0a, - 0x32620c, - 0x32a58b, - 0x32b18a, - 0x34240a, - 0x34ad8e, - 0x34bece, - 0x34c24a, - 0x34dd4a, - 0x34eb0b, - 0x34edcb, - 0x34fa4b, - 0x36bc8b, - 0x36c28a, - 0x36cf4b, - 0x36d20a, - 0x36d48a, - 0x36d70a, - 0x38d78b, - 0x392f8b, - 0x39588e, - 0x395c0b, - 0x39d24b, - 0x3a198b, - 0x3a51ca, - 0x3a5449, - 0x3a568a, - 0x3a764a, - 0x3bd9cb, - 0x3c9f4b, - 0x3ca7ca, - 0x3cdc0b, - 0x3d39cb, - 0x3db18b, - 0x44a854c8, - 0x44e8a6c9, - 0x452a0a89, - 0x456e7748, - 0x355405, - 0x2017c3, - 0x27fac4, - 0x2be185, - 0x236fc6, - 0x245805, - 0x289d84, - 0x367108, - 0x31c2c5, - 0x294c44, - 0x3c2887, - 0x2a000a, - 0x381e0a, - 0x303147, - 0x21a647, - 0x2e0947, - 0x27cfc7, - 0x35b445, - 0x211d46, - 0x39f487, - 0x360704, - 0x2b5186, - 0x2f1b86, - 0x3bf885, - 0x34a344, - 0x2999c6, - 0x29ecc7, - 0x238186, - 0x301747, - 0x228883, - 0x3d3c86, - 0x2ff6c5, - 0x284047, - 0x269e8a, - 0x232644, - 0x212508, - 0x312a09, - 0x2cd2c7, - 0x393846, - 0x255348, - 0x3b8f49, - 0x32af04, - 0x3a8c84, - 0x2d8045, - 0x2823c8, - 0x2ca0c7, - 0x2c4949, - 0x229a08, - 0x318dc6, - 0x2e6006, - 0x29ae08, - 0x370586, - 0x28a305, - 0x286c06, - 0x27aa48, - 0x3a8d06, - 0x23eacb, - 0x2b1046, - 0x29c80d, - 0x3bf405, - 0x2ab586, - 0x213205, - 0x349189, - 0x247e07, - 0x3badc8, - 0x3666c6, - 0x29b949, - 0x3cb146, - 0x269e05, - 0x2a2dc6, - 0x2704c6, - 0x2cf6c9, - 0x2bb246, - 0x29fd07, - 0x2a3445, - 0x21b203, - 0x223885, - 0x29cac7, - 0x3614c6, - 0x3bf309, - 0x27e706, - 0x286e46, - 0x211a09, - 0x286609, - 0x2a39c7, - 0x384748, - 0x29a209, - 0x284448, - 0x36bb06, - 0x2dcc45, - 0x31ef0a, - 0x286ec6, - 0x204c46, - 0x2d3e45, - 0x256488, - 0x357487, - 0x22f8ca, - 0x251a06, - 0x2f36c5, - 0x2ffd46, - 0x2d5607, - 0x393707, - 0x21b385, - 0x269fc5, - 0x2a95c6, - 0x2b6806, - 0x2d4686, - 0x2bfd04, - 0x285b89, - 0x28b846, - 0x2d03ca, - 0x225c88, - 0x3122c8, - 0x381e0a, - 0x223a45, - 0x29ec05, - 0x2311c8, - 0x2baf48, - 0x239f47, - 0x2b7dc6, - 0x33af48, + 0x4369e985, + 0x43a88bc4, + 0x43ed0e07, + 0x4423b747, + 0x44684586, + 0x44a81485, + 0x44e999c7, + 0x452d1c48, + 0x457c5107, + 0x45b48289, + 0x45ed3985, + 0x463102c7, + 0x46693d06, + 0x46e4b, + 0x46a7b288, + 0x2221cd, + 0x27d049, + 0x28858b, + 0x2aa48b, + 0x2b734b, + 0x31368b, + 0x320a8b, + 0x320d4b, + 0x321b89, + 0x32398b, + 0x323c4b, + 0x32430b, + 0x32548a, + 0x3259ca, + 0x325fcc, + 0x32bc4b, + 0x32c3ca, + 0x3419ca, + 0x34d0ce, + 0x35024e, + 0x3505ca, + 0x3521ca, + 0x352bcb, + 0x352e8b, + 0x353b0b, + 0x36d78b, + 0x36dd8a, + 0x36ea4b, + 0x36ed0a, + 0x36ef8a, + 0x36f20a, + 0x38decb, + 0x39360b, + 0x395ace, + 0x395e4b, + 0x39cfcb, + 0x39de8b, + 0x3a124a, + 0x3a14c9, + 0x3a170a, + 0x3a31ca, + 0x3bb50b, + 0x3c8c0b, + 0x3c960a, + 0x3ca10b, + 0x3d38cb, + 0x3dc34b, + 0x46e82f08, + 0x47288fc9, + 0x476a21c9, + 0x47ae4d08, + 0x359505, + 0x218e03, + 0x27e244, + 0x2abc05, + 0x306206, + 0x34d545, + 0x288844, + 0x3775c8, + 0x3197c5, + 0x295604, + 0x3c17c7, + 0x2a154a, + 0x381fca, + 0x3cc7c7, 0x218d07, - 0x2838c8, - 0x2b9bc6, - 0x287608, - 0x297986, - 0x27a647, - 0x36fe46, - 0x2999c6, - 0x281f8a, - 0x2da906, - 0x2dcc49, - 0x368146, - 0x371d8a, - 0x23dbc9, - 0x2f5206, - 0x2bba04, - 0x28dd4d, - 0x28a947, - 0x28e8c6, - 0x2c3705, - 0x3cb1c5, - 0x38ef06, - 0x2d2809, - 0x2eda47, - 0x27bfc6, - 0x2cbcc6, - 0x289e09, - 0x28a244, - 0x241304, - 0x201688, - 0x35fb86, - 0x2a2ec8, - 0x2fd948, - 0x3b9d47, - 0x3b8209, - 0x3b44c7, - 0x2b284a, - 0x2f630f, - 0x2ec3ca, - 0x310305, - 0x27ac85, - 0x2108c5, - 0x3b7807, - 0x23f643, - 0x384948, - 0x27d606, - 0x27d709, - 0x2eb646, - 0x2cf507, - 0x29b709, - 0x3bacc8, - 0x2d3f07, - 0x31fe43, - 0x355485, - 0x2d5145, - 0x2bfb4b, - 0x203a04, - 0x306384, - 0x278ec6, - 0x3204c7, - 0x39aeca, - 0x238007, - 0x209887, - 0x282b45, - 0x3c0645, - 0x292189, - 0x2999c6, - 0x237e8d, - 0x3632c5, - 0x2b5dc3, - 0x226783, - 0x21e685, - 0x35b0c5, - 0x255348, - 0x27cc87, - 0x241086, - 0x2a0706, - 0x2288c5, - 0x233a07, - 0x3b9847, - 0x238ec7, - 0x20d70a, - 0x3d3d48, - 0x2bfd04, - 0x280887, - 0x2805c7, - 0x34f046, - 0x297007, - 0x2c8608, - 0x304248, - 0x247d06, - 0x21a888, - 0x2bb2c4, - 0x39f486, - 0x2656c6, - 0x390946, - 0x201b06, - 0x21bb44, - 0x27d086, - 0x2c2346, - 0x299d86, - 0x20fd86, - 0x3c7586, - 0x244446, - 0x240f88, - 0x2b5008, - 0x2d9608, - 0x245a08, - 0x231146, - 0x20c245, - 0x223846, - 0x2aefc5, - 0x391647, - 0x229ac5, - 0x20c503, - 0x3c4785, - 0x22ccc4, - 0x3c76c5, - 0x2039c3, - 0x3a3547, - 0x3426c8, - 0x301806, - 0x36694d, - 0x27ac46, - 0x299345, - 0x218783, - 0x2bf209, - 0x28a3c6, - 0x295746, - 0x288904, - 0x2ec347, - 0x39fec6, - 0x2edd05, - 0x20fd43, - 0x3d1ac4, - 0x280786, - 0x211e44, - 0x2657c8, - 0x3bb109, - 0x306d89, - 0x2a2cca, - 0x29270d, - 0x2329c7, - 0x3c4bc6, - 0x20bc84, - 0x284c49, - 0x289388, - 0x28a546, - 0x235606, - 0x297007, - 0x2bc186, - 0x2266c6, - 0x336886, - 0x32f84a, - 0x213148, - 0x2a9e45, - 0x372a49, - 0x2ca84a, - 0x3029c8, - 0x29e408, - 0x2956c8, - 0x2a034c, - 0x34ff85, - 0x2a0988, - 0x2b7b46, - 0x344ec6, - 0x3a1c07, - 0x237f05, - 0x286d85, - 0x306c49, - 0x3dc3c7, - 0x27d6c5, - 0x228707, - 0x226783, - 0x2cad05, - 0x21ea48, - 0x285907, - 0x29e2c9, - 0x2dcb05, - 0x3b0b44, - 0x2a4248, - 0x301c87, - 0x2d40c8, - 0x3b5c08, - 0x2ac3c5, - 0x3b7bc6, - 0x248186, - 0x2d8409, - 0x2b1847, - 0x2af786, - 0x21e147, - 0x202183, - 0x237284, - 0x2d0a85, - 0x280b04, - 0x24ba44, - 0x25e7c7, - 0x268747, - 0x27c184, - 0x29e110, - 0x372c47, - 0x3c0645, - 0x3308cc, - 0x20f384, - 0x35d248, - 0x27a549, - 0x383dc6, - 0x2f40c8, - 0x246544, - 0x2791c8, - 0x302346, - 0x281e08, - 0x29cd86, - 0x39800b, - 0x32cd85, - 0x2d0908, - 0x211444, - 0x3bb54a, - 0x29e2c9, - 0x36fd46, - 0x319348, - 0x2a6105, - 0x2be9c4, - 0x35d146, - 0x238d88, - 0x2854c8, - 0x33b7c6, - 0x21fe04, - 0x31ee86, - 0x3b4547, - 0x27a0c7, - 0x29700f, - 0x32de07, - 0x2f52c7, - 0x31ff85, - 0x374345, - 0x2a3689, - 0x2e8ac6, - 0x26b885, - 0x286907, - 0x3a1e88, - 0x2fca45, - 0x36fe46, - 0x225ac8, - 0x3b880a, - 0x238a88, - 0x28fa87, - 0x2f6746, - 0x372a06, + 0x2de547, + 0x282bc7, + 0x35e6c5, + 0x3b0106, + 0x3b0347, + 0x3bdb04, + 0x2f1246, + 0x2f1146, + 0x3b06c5, + 0x355784, + 0x29af46, + 0x2a0607, + 0x26a746, + 0x31f207, + 0x27e303, + 0x39c446, + 0x251ec5, + 0x281d47, + 0x267aca, + 0x231544, + 0x220c88, + 0x310809, + 0x2cc587, + 0x38f346, + 0x28ee48, + 0x2200c9, + 0x369504, + 0x35c644, + 0x2d5085, + 0x225d48, + 0x2ca407, + 0x2f3249, + 0x228ec8, + 0x315686, + 0x229a46, + 0x29b888, + 0x371b06, + 0x219305, + 0x284646, + 0x27a648, + 0x27f186, + 0x25440b, + 0x292ec6, + 0x29d1cd, + 0x3c12c5, + 0x2aca46, + 0x210985, + 0x3b91c9, + 0x249507, + 0x3a4a48, + 0x314486, + 0x29c489, + 0x3b8486, + 0x267a45, + 0x215146, + 0x2c9006, + 0x2cee49, + 0x2b9b06, + 0x2a1247, + 0x2a4385, + 0x207683, + 0x223cc5, + 0x2affc7, + 0x36a486, + 0x3c11c9, + 0x275c06, + 0x279ec6, + 0x21a549, + 0x284049, + 0x2a4907, + 0x344e08, + 0x2a75c9, + 0x282148, + 0x3929c6, + 0x2dab45, + 0x278eca, + 0x279f46, + 0x21ce06, + 0x2d28c5, + 0x24ff08, + 0x2eb407, + 0x22f24a, + 0x24bb06, + 0x2f4745, + 0x302086, + 0x328687, + 0x38f207, + 0x21b145, + 0x267c05, + 0x269d86, + 0x26e4c6, + 0x27fdc6, + 0x226384, + 0x2835c9, + 0x28a146, + 0x2fd3ca, + 0x2278c8, + 0x30ffc8, + 0x381fca, + 0x223fc5, + 0x2a0545, + 0x3c1e08, + 0x2bcc08, + 0x266e07, + 0x226b86, + 0x338748, + 0x20e887, + 0x2815c8, + 0x2b8cc6, + 0x285308, + 0x298406, + 0x27ca47, + 0x3229c6, + 0x29af46, + 0x26ed4a, + 0x2d5ec6, + 0x2dab49, + 0x368506, + 0x21eb0a, + 0x23f209, + 0x2f2786, + 0x2baac4, + 0x35c38d, + 0x289247, + 0x2e6186, + 0x2c4485, + 0x3b8505, + 0x38fe46, + 0x2d0c49, + 0x2b7907, + 0x27bb46, + 0x2c9e46, + 0x2888c9, + 0x359a44, + 0x244f84, + 0x340e88, + 0x236846, + 0x2a3e08, + 0x2150c8, + 0x219447, + 0x3b5b89, + 0x27ffc7, + 0x2b32ca, + 0x2f420f, + 0x26f44a, + 0x28c385, + 0x27a885, + 0x214f05, + 0x21f147, + 0x267083, + 0x345008, + 0x20ef06, + 0x20f009, + 0x3cb186, + 0x2d0487, + 0x29c249, + 0x3a4948, + 0x2d2987, + 0x31da43, + 0x359585, + 0x3281c5, + 0x2261cb, + 0x201944, + 0x308804, + 0x278686, + 0x31dc07, + 0x39abca, + 0x242b07, + 0x2ff907, + 0x280405, + 0x3bfc85, + 0x26de89, + 0x29af46, + 0x24298d, + 0x33fac5, + 0x2b6243, + 0x23ffc3, + 0x3d0605, + 0x35e345, + 0x28ee48, + 0x27c487, + 0x244d06, + 0x2a1e46, + 0x229e05, + 0x232f07, + 0x2e6d07, + 0x3db5c7, + 0x20530a, + 0x39c508, + 0x226384, + 0x27ef07, + 0x27ec47, + 0x353106, + 0x297a87, + 0x2e0388, + 0x360f08, + 0x249406, + 0x218f48, + 0x2b9b84, + 0x3b0346, + 0x238786, + 0x3aa006, + 0x345606, + 0x219cc4, + 0x282c86, + 0x2c3106, + 0x29b306, + 0x22f846, + 0x3c6986, + 0x2e01c6, + 0x244c08, + 0x2b4d08, + 0x2d6848, + 0x34d748, + 0x3c1d86, + 0x209a85, + 0x223c86, + 0x2afcc5, + 0x391e47, + 0x228f85, + 0x20ba83, + 0x20ca85, + 0x230fc4, + 0x3c6ac5, + 0x201903, + 0x393907, + 0x36d1c8, + 0x31f2c6, + 0x376e0d, + 0x27a846, + 0x29a8c5, + 0x219803, + 0x2c04c9, + 0x359bc6, + 0x296206, + 0x398b84, + 0x26f3c7, + 0x36c186, + 0x2b7bc5, + 0x242943, + 0x3d7004, + 0x27ee06, + 0x238884, + 0x2e9f88, + 0x3befc9, + 0x309209, + 0x2a3c0a, + 0x2a54cd, + 0x2318c7, + 0x3ba1c6, + 0x20a204, + 0x282949, + 0x287b88, + 0x288e46, + 0x234b46, + 0x297a87, + 0x2c1246, + 0x34fc46, + 0x2ffa86, + 0x3c4e0a, + 0x222508, + 0x2e3805, + 0x33e9c9, + 0x2cab8a, + 0x305288, + 0x29f1c8, + 0x296188, + 0x2e710c, + 0x350805, + 0x2a20c8, + 0x2b5006, + 0x317646, + 0x3d8287, + 0x242a05, + 0x2847c5, + 0x3090c9, + 0x20ac07, + 0x20efc5, + 0x237187, + 0x23ffc3, + 0x2cb045, + 0x21ac08, + 0x283347, + 0x29f089, + 0x2dedc5, + 0x3ae2c4, + 0x2a5188, + 0x331707, + 0x2d2b48, + 0x3d36c8, + 0x2adbc5, + 0x21f506, + 0x249886, + 0x2d5449, + 0x2b3f47, + 0x2b0386, + 0x3d00c7, + 0x205083, + 0x3064c4, + 0x2d8c85, + 0x233044, + 0x248d84, + 0x3890c7, + 0x2651c7, + 0x27bd04, + 0x29eed0, + 0x33ebc7, + 0x3bfc85, + 0x2f764c, + 0x32a2c4, + 0x2b2b48, + 0x27c949, + 0x385146, + 0x319dc8, + 0x270d84, + 0x278988, + 0x331dc6, + 0x26ebc8, + 0x2a0bc6, + 0x2d004b, + 0x32de45, + 0x2d8b08, + 0x213304, + 0x3bf40a, + 0x29f089, + 0x3228c6, + 0x225fc8, + 0x258305, + 0x2bfd44, + 0x2b2a46, + 0x3db488, + 0x282f08, + 0x338fc6, + 0x301104, + 0x278e46, + 0x280047, + 0x279bc7, + 0x297a8f, + 0x32eec7, + 0x2f2847, + 0x295bc5, + 0x376185, + 0x2a45c9, + 0x2d7886, + 0x389305, + 0x284347, + 0x2cd008, + 0x2f9c05, + 0x3229c6, + 0x227708, + 0x21f98a, + 0x3db188, + 0x28d4c7, + 0x2f4646, + 0x33e986, 0x2003c3, - 0x20ecc3, - 0x2caa09, - 0x29a089, - 0x35d046, - 0x2dcb05, - 0x21ab08, - 0x319348, - 0x370708, - 0x33690b, - 0x366b87, - 0x2fb749, - 0x297288, - 0x35e8c4, - 0x390588, - 0x291209, - 0x2afa85, - 0x3b7707, - 0x237305, - 0x2853c8, - 0x29374b, - 0x298190, - 0x2ab305, - 0x21138c, - 0x241245, - 0x282bc3, - 0x2b4446, - 0x2c1244, - 0x370106, - 0x29ecc7, - 0x225b44, - 0x241fc8, - 0x38480d, - 0x319205, - 0x232a04, - 0x2a2544, - 0x2a2549, - 0x2acbc8, - 0x32d247, - 0x3023c8, - 0x285c48, - 0x27c2c5, - 0x205987, - 0x27c247, - 0x2c6447, - 0x269fc9, - 0x3365c9, - 0x20b646, - 0x2bdbc6, - 0x2869c6, - 0x34d6c5, - 0x3a83c4, - 0x3ba3c6, - 0x3bf0c6, - 0x27c308, - 0x2d52cb, - 0x267287, - 0x20bc84, - 0x39fe06, - 0x2c8947, - 0x244045, + 0x208a43, + 0x2cad49, + 0x2a7449, + 0x2b2946, + 0x2dedc5, + 0x2191c8, + 0x225fc8, + 0x371c88, + 0x2ffb0b, + 0x377047, + 0x31ae49, + 0x297d08, + 0x351c84, + 0x3a9c48, + 0x290cc9, + 0x2b0685, + 0x21f047, + 0x306545, + 0x282e08, + 0x29454b, + 0x299710, + 0x2ac685, + 0x21324c, + 0x244ec5, + 0x280483, + 0x31cc06, + 0x2c2644, + 0x288cc6, + 0x2a0607, + 0x212bc4, + 0x23ffc8, + 0x344ecd, + 0x31c485, + 0x231904, + 0x2a3484, + 0x2a3489, + 0x2af088, + 0x32e307, + 0x331e48, + 0x283688, + 0x27be45, + 0x2110c7, + 0x27bdc7, + 0x20f2c7, + 0x267c09, + 0x2e6809, + 0x3c3b86, + 0x2dce46, + 0x284406, + 0x323fc5, + 0x3af9c4, + 0x3bcb46, + 0x3bed86, + 0x27be88, + 0x32834b, + 0x2363c7, + 0x20a204, + 0x36c0c6, + 0x2e06c7, + 0x3da1c5, + 0x374cc5, + 0x227c84, + 0x2e6786, + 0x3bcbc8, + 0x282949, + 0x264806, + 0x287988, + 0x2b7c86, + 0x35d948, + 0x32170c, + 0x27bd06, + 0x29a58d, + 0x29aa0b, + 0x2a1305, + 0x2e6e47, + 0x2b9c06, + 0x38f0c8, + 0x3c3c09, + 0x307e48, + 0x3bfc85, + 0x3bd847, + 0x282248, + 0x3c0bc9, + 0x36be06, + 0x26470a, + 0x38ee48, + 0x307c8b, + 0x22278c, + 0x278a88, + 0x27e846, + 0x210ac8, + 0x21f607, + 0x21ca09, + 0x3983cd, + 0x29ae46, + 0x267048, + 0x2b4bc9, + 0x2c0f48, + 0x285408, + 0x2c3b4c, + 0x2c5107, + 0x2c5bc7, + 0x267a45, + 0x2c0d87, + 0x2ccec8, + 0x2b2ac6, + 0x2934cc, + 0x2f9688, + 0x2d1588, + 0x234d86, + 0x34ef07, + 0x3c3d84, + 0x34d748, + 0x28688c, + 0x289b8c, + 0x28c405, + 0x3b0747, + 0x301086, + 0x34ee86, + 0x3b9388, + 0x21c984, + 0x26a74b, + 0x286fcb, + 0x2f4646, + 0x344d47, + 0x28f405, + 0x271a45, + 0x26a886, + 0x2582c5, + 0x201905, + 0x2cec87, + 0x20afc9, + 0x26e684, + 0x258e45, + 0x2fcfc5, + 0x2e9d08, + 0x28b9c5, + 0x2bd109, + 0x2b3947, + 0x2b394b, + 0x2f24c6, + 0x244949, + 0x3556c8, + 0x291005, + 0x20f3c8, + 0x2e6848, + 0x261fc7, + 0x331bc7, + 0x389149, + 0x26eb07, + 0x29cf89, + 0x2fc3cc, + 0x348188, + 0x2b9649, + 0x2bb207, + 0x283749, + 0x2ff287, + 0x222888, + 0x3b5d45, + 0x3b02c6, + 0x2c44c8, + 0x2d7148, + 0x2caa49, + 0x201947, + 0x272445, + 0x336b09, + 0x2d3206, + 0x293d04, + 0x31bf86, + 0x34f288, + 0x3cbac7, + 0x328548, + 0x219009, + 0x2f8107, + 0x2a1706, + 0x2e6f04, + 0x20cb09, + 0x210f48, + 0x234c47, + 0x36b6c6, + 0x328286, + 0x21cd84, + 0x2f5206, + 0x20f0c3, + 0x32d9c9, + 0x32de06, + 0x2accc5, + 0x2a1e46, + 0x2cf205, + 0x2826c8, + 0x20edc7, + 0x238ec6, + 0x2fee06, + 0x30ffc8, + 0x2a4747, + 0x29ae85, + 0x29ecc8, + 0x3a77c8, + 0x38ee48, + 0x244d85, + 0x3b0346, + 0x308fc9, + 0x2d52c4, + 0x2cf08b, + 0x34f94b, + 0x2e3709, + 0x23ffc3, + 0x256085, + 0x2e48c6, + 0x245b08, + 0x304204, + 0x31f2c6, + 0x205449, + 0x2c2f05, + 0x2cebc6, + 0x331706, + 0x2191c4, + 0x29f34a, + 0x2acc08, + 0x2d7146, + 0x3c2785, + 0x344bc7, + 0x35e587, + 0x21f504, + 0x34fb87, + 0x228f44, + 0x228f46, + 0x20eb03, + 0x267c05, + 0x2b1045, + 0x32f108, + 0x27f0c5, + 0x27ba49, + 0x2a62c7, + 0x34d58b, + 0x2a62cc, + 0x2a68ca, + 0x313987, + 0x20cc43, + 0x3897c8, 0x244f45, - 0x2ae104, - 0x336546, - 0x3ba448, - 0x284c49, - 0x25f446, - 0x289188, - 0x2eddc6, - 0x35a6c8, - 0x2b340c, - 0x27c186, - 0x29900d, - 0x29948b, - 0x29fdc5, - 0x3b9987, - 0x2bb346, - 0x3935c8, - 0x20b6c9, - 0x3057c8, - 0x3c0645, - 0x360447, - 0x284548, - 0x2ff109, - 0x39fb46, - 0x25f34a, - 0x393348, - 0x30560b, - 0x2133cc, - 0x2792c8, - 0x27fd46, - 0x205388, - 0x3b8487, - 0x209509, - 0x3179cd, - 0x2998c6, - 0x23f608, + 0x2f9c85, + 0x359644, + 0x222786, + 0x27c946, + 0x2f5247, + 0x33608b, + 0x219cc4, + 0x3ac004, + 0x2c9a44, + 0x2ce986, + 0x212bc4, + 0x225e48, + 0x359445, + 0x21afc5, + 0x371bc7, + 0x2e6f49, + 0x35e345, + 0x38fe4a, + 0x2a4289, + 0x2ae38a, + 0x3c4f49, + 0x352404, + 0x2c9f05, + 0x2c1348, + 0x2d0ecb, + 0x2d5085, + 0x215246, + 0x209744, + 0x27bf86, + 0x2f7f89, + 0x2e07c7, + 0x275dc8, + 0x2a5846, + 0x27ffc7, + 0x282f08, + 0x3903c6, + 0x3bd204, + 0x380547, + 0x36fe85, + 0x382607, + 0x29a404, + 0x2b9b86, + 0x304f88, + 0x29abc8, + 0x2f1887, + 0x31d6c8, + 0x2984c5, + 0x240004, + 0x381ec8, + 0x295e04, + 0x214e85, + 0x305184, + 0x20e987, + 0x28a207, + 0x283888, + 0x2d2cc6, + 0x27f045, + 0x27b848, + 0x248e88, + 0x2a3b49, + 0x34fc46, + 0x22f2c8, + 0x3bf28a, + 0x3da248, + 0x311985, + 0x223e86, + 0x2a4148, + 0x3bd90a, + 0x20d487, + 0x287fc5, + 0x293f08, + 0x2ab804, + 0x24ff86, + 0x2c5f48, + 0x3c6986, + 0x3c9c88, + 0x254747, + 0x3c16c6, + 0x2baac4, + 0x266847, + 0x2b5684, + 0x2f7f47, + 0x36bacd, + 0x266e85, + 0x2d0a4b, + 0x289e06, + 0x24f808, + 0x23ff84, + 0x3c1f86, + 0x27ee06, + 0x210e07, + 0x29a24d, + 0x2fbf87, + 0x2b6188, + 0x285585, + 0x26e048, + 0x2ca386, + 0x298548, + 0x22e4c6, + 0x2f73c7, + 0x283c09, + 0x35a447, + 0x289108, + 0x273d85, + 0x229e88, + 0x34edc5, + 0x26b045, + 0x34c4c5, + 0x215183, + 0x2846c4, + 0x294105, + 0x243789, + 0x36b5c6, + 0x2e0488, + 0x331985, + 0x2b7f47, + 0x3171ca, + 0x2ceb09, + 0x2c8f0a, + 0x2d68c8, + 0x236fcc, + 0x2843cd, + 0x30ad03, + 0x3c9b88, + 0x3d6fc5, + 0x21f746, + 0x3a47c6, + 0x35c045, + 0x3d01c9, + 0x28e9c5, + 0x27b848, + 0x257506, + 0x360146, + 0x2a5049, + 0x3a6787, + 0x294806, + 0x317148, + 0x3a9f08, + 0x2e4f07, + 0x2c328e, + 0x2ca5c5, + 0x3c0ac5, + 0x3c6888, + 0x31a307, + 0x200e42, + 0x2c36c4, + 0x288bca, + 0x234d08, + 0x2e6986, + 0x29c388, + 0x249886, + 0x36a0c8, + 0x2b0388, + 0x26b004, + 0x2b8705, + 0x602c84, + 0x602c84, + 0x602c84, + 0x204ec3, + 0x328106, + 0x27bd06, + 0x2a0fcc, + 0x202f03, + 0x2cab86, + 0x21a9c4, + 0x359b48, + 0x205285, + 0x288cc6, + 0x2c0c08, + 0x2d8046, + 0x238e46, + 0x212bc8, + 0x2d8d07, + 0x26e8c9, + 0x32044a, + 0x2052c4, + 0x228f85, + 0x2f3205, + 0x3598c6, + 0x231906, + 0x2a1b06, + 0x3cc306, + 0x26ea04, + 0x26ea0b, + 0x228d44, + 0x244ac5, + 0x2af585, + 0x219506, + 0x3c6e08, + 0x284287, + 0x32dd84, + 0x25a2c3, + 0x2ab305, + 0x31be47, + 0x28418b, + 0x32f007, + 0x2c0b08, + 0x2bf447, + 0x269406, + 0x27d308, + 0x292a0b, + 0x2abb46, + 0x213a89, + 0x292b85, + 0x31da43, + 0x2cebc6, + 0x254648, + 0x214303, + 0x27d903, + 0x27b386, + 0x249886, + 0x37880a, + 0x27e885, + 0x27ec4b, + 0x2a1d8b, + 0x244043, + 0x206743, + 0x2b3244, + 0x249647, + 0x2546c4, + 0x219344, + 0x2b4e84, + 0x3da548, + 0x3c26c8, + 0x2089c9, + 0x2d3a08, + 0x34c747, + 0x22f846, + 0x2e00cf, + 0x2ca706, + 0x2d6044, + 0x3c250a, + 0x31bd47, + 0x2b5786, + 0x293d49, + 0x208945, + 0x32f245, + 0x208a86, + 0x229fc3, + 0x2ab849, + 0x222686, + 0x218dc9, + 0x39abc6, + 0x267c05, + 0x28c805, + 0x206643, + 0x249788, + 0x32e4c7, + 0x20ef04, + 0x3599c8, + 0x3173c4, + 0x356506, + 0x31cc06, + 0x23b486, + 0x2d89c9, + 0x2f9c05, + 0x29af46, + 0x247d89, + 0x2c9646, + 0x2e01c6, + 0x39f786, + 0x212185, + 0x305186, + 0x2f73c4, + 0x3b5d45, + 0x2c44c4, + 0x2b6b06, + 0x33fa84, + 0x201a43, + 0x287c45, + 0x233c08, + 0x3d2cc7, + 0x304289, + 0x287ec8, + 0x29b651, + 0x33178a, + 0x2f4587, + 0x254886, + 0x21a9c4, + 0x2c45c8, + 0x2b5c48, + 0x29b80a, + 0x2bcecd, + 0x215146, + 0x212cc6, + 0x266906, + 0x21afc7, + 0x2b6245, + 0x251907, + 0x344ec5, + 0x2b3a84, + 0x206686, + 0x2269c7, + 0x2ab54d, + 0x2a4087, + 0x3774c8, + 0x27bb49, + 0x223d86, + 0x36bd85, + 0x23ae44, + 0x34f386, + 0x21f406, + 0x234e86, + 0x29cc08, + 0x223283, + 0x210e03, + 0x343085, + 0x35c6c6, + 0x2b0345, + 0x2a5a48, + 0x2a07ca, + 0x246b04, + 0x359b48, + 0x296188, + 0x219347, + 0x331a49, + 0x2c0808, + 0x2829c7, + 0x2b5106, + 0x3c698a, + 0x34f408, + 0x307009, + 0x2af148, + 0x227f89, + 0x361107, + 0x303505, + 0x2ffd06, + 0x2b2948, + 0x24f988, + 0x313c48, + 0x31c5c8, + 0x244ac5, + 0x200d04, + 0x232588, + 0x23eb84, + 0x3c4d44, + 0x267c05, + 0x295647, + 0x2e6d09, + 0x210c07, + 0x21a5c5, + 0x278886, + 0x368186, + 0x213bc4, + 0x2a5386, + 0x27e044, + 0x292686, + 0x2e6ac6, + 0x214146, + 0x3bfc85, + 0x2a5907, + 0x20cc43, + 0x20a909, + 0x30fdc8, + 0x282844, + 0x28284d, + 0x29acc8, + 0x2f0148, + 0x306f86, + 0x283d09, + 0x2ceb09, + 0x2f7c85, + 0x2a08ca, + 0x26da4a, + 0x270c0c, + 0x270d86, + 0x2794c6, + 0x2caf86, + 0x39b709, + 0x21f986, + 0x222906, + 0x28ea86, + 0x34d748, + 0x31d6c6, + 0x2d4b8b, + 0x2957c5, + 0x21afc5, + 0x279cc5, + 0x340c06, + 0x215103, + 0x23b406, + 0x2a4007, + 0x2c4485, + 0x211e45, + 0x3b8505, + 0x33d006, + 0x2f7d44, + 0x334606, + 0x2a9789, + 0x340a8c, + 0x2b37c8, + 0x2a98c4, + 0x304e86, + 0x289f06, + 0x254648, + 0x225fc8, + 0x340989, + 0x344bc7, + 0x236589, + 0x271b06, + 0x2150c4, + 0x205fc4, + 0x281fc4, + 0x282f08, + 0x2e6b4a, + 0x35e2c6, + 0x36b487, + 0x382887, + 0x244a45, + 0x2f31c4, + 0x290c86, + 0x2b6286, + 0x20eec3, + 0x30fc07, + 0x3d35c8, + 0x2f7dca, + 0x345188, + 0x2dd348, + 0x33fac5, + 0x2a1405, + 0x2364c5, + 0x244e06, + 0x35cb06, + 0x2fe385, + 0x32dc09, + 0x2f2fcc, + 0x35b4c7, + 0x29b888, + 0x276705, + 0x602c84, + 0x229cc4, + 0x283484, + 0x218bc6, + 0x2a2d4e, + 0x32f2c7, + 0x21b1c5, + 0x2d524c, + 0x30af87, + 0x226947, + 0x22bb09, + 0x220d49, + 0x287fc5, + 0x30fdc8, + 0x308fc9, + 0x38ed05, + 0x2c43c8, + 0x2b9886, + 0x382146, + 0x23f204, + 0x28fe08, + 0x223f43, + 0x209284, + 0x2ab385, + 0x394e47, + 0x26bcc5, + 0x3bf149, + 0x2a5f8d, + 0x2c6506, + 0x3c37c4, + 0x226b08, + 0x20ae0a, + 0x21bf47, + 0x36ba05, + 0x2092c3, + 0x2a1f4e, + 0x24988c, + 0x305387, + 0x2a2f07, + 0x4230e9c7, + 0x14f0c6, + 0x46e44, + 0x210d83, + 0x21f9c5, + 0x283485, + 0x29c748, + 0x299d49, + 0x3db306, + 0x2546c4, + 0x2f44c6, + 0x266e0b, + 0x2dc50c, + 0x24b8c7, + 0x2d4e45, + 0x3a76c8, + 0x2e4cc5, + 0x3c2507, + 0x3315c7, + 0x22ee45, + 0x215103, + 0x20fd44, + 0x3cb985, + 0x26e585, + 0x26e586, + 0x2a8f48, + 0x2269c7, + 0x3a4ac6, + 0x21cc86, + 0x34c406, + 0x2671c9, + 0x2111c7, + 0x27e146, + 0x2dc686, + 0x277146, + 0x2acb45, + 0x205746, + 0x383a05, + 0x28ba48, + 0x29528b, + 0x2909c6, + 0x3828c4, + 0x2d5b09, + 0x2a62c4, + 0x2b9808, + 0x31c087, + 0x285304, + 0x2bff48, + 0x2c59c4, + 0x2acb84, + 0x398305, + 0x31c4c6, + 0x3da487, + 0x24e4c3, + 0x2a17c5, + 0x2fb684, + 0x3c0b06, + 0x2f7d08, + 0x3db085, + 0x294f49, + 0x313985, + 0x3736c8, + 0x21a887, + 0x32df08, + 0x2bfb87, + 0x2f2909, + 0x282b06, + 0x341c06, + 0x28ea84, + 0x3abf45, + 0x30d1cc, + 0x279cc7, + 0x27a747, + 0x231548, + 0x2c6506, + 0x2a3f44, + 0x34ab44, + 0x388fc9, + 0x2cb086, + 0x26df07, + 0x210a44, + 0x261606, + 0x3a4405, + 0x2d2807, + 0x2d4b06, + 0x2645c9, + 0x2cfa47, + 0x297a87, + 0x2a4ec6, + 0x261545, + 0x281448, + 0x222508, + 0x22fa46, + 0x3db0c5, + 0x2c7406, + 0x2017c3, + 0x29c5c9, + 0x2a188e, + 0x2bf2c8, + 0x3174c8, + 0x22f84b, + 0x295186, + 0x379b04, + 0x238e44, + 0x2a198a, + 0x213147, + 0x27e205, + 0x213a89, + 0x2c31c5, + 0x3c4d87, + 0x230504, + 0x299187, + 0x214fc8, + 0x2cc646, + 0x2b9d09, + 0x2c090a, + 0x2130c6, + 0x29a806, + 0x2af505, + 0x396405, + 0x34bac7, + 0x242788, + 0x3a4348, + 0x26b006, + 0x28c885, + 0x23168e, + 0x226384, + 0x22f9c5, + 0x278209, + 0x2d7688, + 0x28d406, + 0x29e7cc, + 0x2a03d0, + 0x2a298f, + 0x2a44c8, + 0x313987, + 0x3bfc85, + 0x294105, + 0x3da309, + 0x294109, + 0x278f46, + 0x2d5107, + 0x3abe45, + 0x306a89, + 0x353186, + 0x21f7cd, + 0x281e89, + 0x219344, + 0x2bf048, + 0x232649, + 0x35e486, + 0x3899c5, + 0x341c06, + 0x275c89, + 0x27b108, + 0x209a85, + 0x28fe04, + 0x29e98b, + 0x35e345, + 0x245b86, + 0x284706, + 0x252a06, + 0x2a388b, + 0x295049, + 0x21cbc5, + 0x391d47, + 0x331706, + 0x212dc6, + 0x283208, + 0x2b5209, + 0x37728c, + 0x31bc48, + 0x317f06, + 0x338fc3, + 0x22d046, + 0x2a36c5, + 0x27fb48, + 0x28c286, + 0x2d2a48, + 0x242b85, + 0x292745, + 0x21a9c8, + 0x3a9dc7, + 0x3a4707, + 0x2f5247, + 0x319dc8, + 0x313ac8, + 0x2b5b46, + 0x2b6947, + 0x306387, + 0x2a358a, + 0x206383, + 0x340c06, + 0x231605, + 0x288bc4, + 0x27bb49, + 0x2f2884, + 0x202244, + 0x2a0c44, + 0x2a2f0b, + 0x32e407, + 0x2318c5, + 0x2981c8, + 0x278886, + 0x278888, + 0x27e7c6, + 0x28fd45, + 0x290005, + 0x2915c6, + 0x2937c8, + 0x293c88, + 0x27bd06, + 0x29800f, + 0x29c090, + 0x3c12c5, + 0x20cc43, + 0x22aa85, + 0x31ad88, + 0x294009, + 0x38ee48, + 0x2d4f08, + 0x31f888, + 0x32e4c7, + 0x278549, + 0x2d2c48, + 0x285a84, + 0x2a0ac8, + 0x2e9dc9, + 0x2b7607, + 0x2b0104, + 0x210cc8, + 0x2a56ca, + 0x2fb906, + 0x215146, + 0x34fb09, + 0x2a0607, + 0x2d0308, + 0x230588, + 0x21d348, + 0x37f785, + 0x207685, + 0x21afc5, + 0x283445, + 0x2b4a07, + 0x244bc5, + 0x2c4485, + 0x3cfec6, + 0x38ed87, + 0x2d0e07, + 0x2a59c6, + 0x2d6e05, + 0x245b86, + 0x20ee45, + 0x2bca88, + 0x3abdc4, + 0x2c96c6, + 0x324c84, + 0x2bfd48, + 0x2c97ca, + 0x27c48c, + 0x336285, + 0x21b086, + 0x377446, + 0x28e886, + 0x317f84, + 0x3a4d85, + 0x27dd87, + 0x2a0689, + 0x2cef47, + 0x602c84, + 0x602c84, + 0x32e285, + 0x217684, + 0x29dd4a, + 0x278706, + 0x308dc4, + 0x3b06c5, + 0x2b41c5, + 0x2b6184, + 0x284347, + 0x336c87, + 0x2ce988, + 0x2c7508, + 0x209a89, + 0x295e08, + 0x29df0b, + 0x26f484, + 0x2921c5, + 0x389385, + 0x2f51c9, + 0x2b5209, + 0x2d5a08, + 0x228d48, + 0x219504, + 0x289f45, + 0x218e03, + 0x359885, + 0x29afc6, + 0x299b8c, + 0x210946, + 0x3898c6, + 0x28d685, + 0x33d088, + 0x3d83c6, + 0x254a06, + 0x215146, + 0x26368c, + 0x389444, + 0x34c54a, + 0x28d5c8, + 0x2999c7, + 0x2fb586, + 0x3db3c7, + 0x2f40c5, + 0x36b6c6, + 0x366906, + 0x376047, + 0x2c0604, + 0x20ea85, + 0x278204, + 0x2b3b07, + 0x278448, + 0x27934a, + 0x2820c7, + 0x2ac747, + 0x313907, + 0x2e4e09, + 0x299b8a, + 0x229a03, + 0x3d2c85, + 0x214183, 0x2b4ec9, - 0x2bfe08, - 0x287708, - 0x2c2d8c, - 0x2c3e47, - 0x2c4f47, - 0x269e05, - 0x2b89c7, - 0x3a1d48, - 0x35d1c6, - 0x36b18c, - 0x2cb288, - 0x2d1f48, - 0x2ff406, - 0x2d4ec7, - 0x20b844, - 0x245a08, - 0x31e9cc, - 0x28b28c, - 0x310385, - 0x3bf907, - 0x21fd86, - 0x2d4e46, - 0x349348, - 0x21cfc4, - 0x23818b, - 0x27b20b, - 0x2f6746, - 0x384687, - 0x3ccdc5, - 0x271205, - 0x2382c6, - 0x2a60c5, - 0x2039c5, - 0x2cdd87, - 0x3bfcc9, - 0x2b69c4, - 0x25ca05, - 0x3ac2c5, - 0x3b7f88, - 0x28d3c5, - 0x26e249, - 0x375e47, - 0x375e4b, - 0x2f4f46, - 0x240cc9, - 0x34a288, - 0x288405, - 0x2c6548, - 0x336608, - 0x273547, - 0x302147, - 0x25e849, - 0x281d47, - 0x295309, - 0x334f0c, - 0x3cf448, - 0x2b84c9, - 0x2ba407, - 0x285d09, - 0x3617c7, - 0x2134c8, - 0x3b83c5, - 0x39f406, - 0x2c3748, - 0x2f6848, - 0x2ca709, - 0x203a07, - 0x271c05, - 0x256089, - 0x2d8746, - 0x292f04, - 0x31bd06, - 0x2e63c8, - 0x2ff8c7, - 0x2d54c8, - 0x21a949, - 0x3286c7, - 0x2a01c6, - 0x3b9a44, - 0x3c4809, - 0x205808, - 0x2ff2c7, - 0x237c86, - 0x2d5206, - 0x204bc4, + 0x361248, + 0x295bc7, + 0x38ef49, + 0x222606, + 0x3b5e08, + 0x393885, + 0x248f8a, + 0x3b0a49, + 0x2492c9, + 0x3d8287, + 0x2b5d49, + 0x214048, 0x36a2c6, - 0x23a303, - 0x32c909, - 0x32cd46, - 0x2ab805, - 0x2a0706, - 0x2cfa85, - 0x2849c8, - 0x368547, - 0x2ddcc6, - 0x32f206, - 0x3122c8, - 0x2a3807, - 0x299905, - 0x29df08, - 0x3ca348, - 0x393348, - 0x241105, - 0x39f486, - 0x306b49, - 0x2d8284, - 0x2cf90b, - 0x2263cb, - 0x2a9d49, - 0x226783, - 0x25aac5, - 0x301606, - 0x241c88, - 0x2b6cc4, - 0x301806, - 0x20d849, - 0x31e385, - 0x2cdcc6, - 0x301c86, - 0x210984, - 0x29e58a, - 0x2ab748, - 0x2f6846, - 0x243e85, - 0x3ccc47, - 0x35b307, - 0x3b7bc4, - 0x226607, - 0x229a84, - 0x229a86, - 0x205dc3, - 0x269fc5, - 0x2b0445, - 0x368788, - 0x280a45, - 0x27bec9, - 0x245847, - 0x24584b, - 0x2a554c, - 0x2a5b4a, - 0x317887, - 0x201303, - 0x26bd48, - 0x2412c5, - 0x2fcac5, - 0x355544, - 0x2133c6, - 0x27a546, - 0x36a307, - 0x25560b, - 0x21bb44, - 0x3008c4, - 0x2c9284, - 0x2cf386, - 0x225b44, - 0x2824c8, - 0x355345, - 0x21b205, - 0x370647, - 0x3b9a89, - 0x35b0c5, - 0x38ef0a, - 0x2a3349, - 0x2a82ca, - 0x32f989, - 0x338e44, - 0x2cbd85, - 0x2bc288, - 0x2d2a8b, - 0x2d8045, - 0x2fdac6, - 0x240844, - 0x27c406, - 0x328549, - 0x2c8a47, - 0x27e8c8, - 0x292a86, - 0x3b44c7, - 0x2854c8, - 0x38f486, - 0x3b9544, - 0x380c47, - 0x36e085, - 0x382447, - 0x245a84, - 0x2bb2c6, - 0x3026c8, - 0x299648, - 0x2fa2c7, - 0x3294c8, - 0x297a45, - 0x226504, - 0x381d08, - 0x3201c4, - 0x210845, - 0x3028c4, - 0x218e07, - 0x28b907, - 0x285e48, - 0x2d4246, - 0x2809c5, - 0x27bcc8, - 0x24bb48, - 0x2a2c09, - 0x2266c6, - 0x22f948, - 0x3bb3ca, - 0x2440c8, - 0x2ed185, - 0x215686, - 0x2a3208, - 0x36050a, - 0x357887, - 0x2897c5, - 0x293108, - 0x2dd904, - 0x256506, - 0x2c52c8, - 0x3c7586, - 0x30a648, - 0x2d6947, - 0x3c2786, - 0x2bba04, - 0x281487, - 0x2b5484, - 0x328507, - 0x36fa8d, - 0x239fc5, - 0x2d260b, - 0x28b506, - 0x2551c8, - 0x241f84, - 0x231346, - 0x280786, - 0x2056c7, - 0x298ccd, - 0x2fc607, - 0x2b5d08, - 0x284e05, - 0x36a448, - 0x2ca046, - 0x297ac8, - 0x39df06, - 0x330647, - 0x2861c9, - 0x36a9c7, - 0x28a808, - 0x275c45, - 0x228948, - 0x2d4d85, - 0x22a4c5, - 0x32fc05, - 0x251e03, - 0x201b84, - 0x244185, - 0x2496c9, - 0x36a0c6, - 0x2c8708, - 0x301f05, - 0x2b8887, - 0x344a4a, - 0x2cdc09, - 0x2703ca, - 0x2d9688, - 0x22854c, - 0x28698d, - 0x30d243, - 0x30a548, - 0x3d1a85, - 0x3b85c6, - 0x3bab46, - 0x359205, - 0x21e249, - 0x361605, - 0x27bcc8, - 0x2590c6, - 0x35dbc6, - 0x2a4109, - 0x3aae47, - 0x293a06, - 0x3449c8, - 0x390848, - 0x2e7947, - 0x2c24ce, - 0x2ca285, - 0x2ff005, - 0x3c7488, - 0x2e9a87, - 0x204c42, - 0x2c2904, - 0x37000a, - 0x2ff388, - 0x336746, - 0x29b848, - 0x248186, - 0x361108, - 0x2af788, - 0x22a484, - 0x2b8c45, - 0x731a84, - 0x731a84, - 0x731a84, - 0x2094c3, - 0x2d5086, - 0x27c186, - 0x29fa8c, - 0x20d8c3, - 0x246446, - 0x2133c4, - 0x28a348, - 0x20d685, - 0x370106, - 0x2bf948, - 0x2daf86, - 0x2ddc46, - 0x3a88c8, - 0x2d0b07, - 0x281b09, - 0x3114ca, - 0x20d6c4, - 0x229ac5, - 0x2c4905, - 0x2d65c6, - 0x232a06, - 0x29f406, - 0x3cef46, - 0x281c44, - 0x281c4b, - 0x229884, - 0x240e45, - 0x2ae605, - 0x3b9e06, - 0x3c2c08, - 0x286847, - 0x32ccc4, - 0x25dfc3, - 0x2dd405, - 0x31bbc7, - 0x28674b, - 0x368687, - 0x2bf848, - 0x2b8d87, - 0x26b246, - 0x27e488, - 0x25364b, - 0x2be0c6, - 0x20c249, - 0x2537c5, - 0x31fe43, - 0x2cdcc6, - 0x2d6848, - 0x20d2c3, - 0x2ad643, - 0x2854c6, - 0x248186, - 0x37654a, - 0x27fd85, - 0x2805cb, - 0x2a064b, - 0x244e03, - 0x202603, - 0x2b27c4, - 0x247f47, - 0x2792c4, - 0x28a344, - 0x2b79c4, - 0x2443c8, - 0x243dc8, - 0x20ec49, - 0x2d6408, - 0x32fe87, - 0x20fd86, - 0x2c834f, - 0x2ca3c6, - 0x2d8b84, - 0x243c0a, - 0x31bac7, - 0x2b5586, - 0x292f49, - 0x20ebc5, - 0x3688c5, - 0x20ed06, - 0x228a83, - 0x2dd949, - 0x2132c6, - 0x21a709, - 0x39aec6, - 0x269fc5, - 0x310785, - 0x201b83, - 0x248088, - 0x32d407, - 0x27d604, - 0x28a1c8, - 0x344c44, - 0x304b46, - 0x2b4446, - 0x23cb46, - 0x2d07c9, - 0x2fca45, - 0x2999c6, - 0x22fec9, - 0x2c8e86, - 0x244446, - 0x3a3946, - 0x22b5c5, - 0x3028c6, - 0x330644, - 0x3b83c5, - 0x2c3744, - 0x2b78c6, - 0x363284, - 0x203b03, - 0x289445, - 0x2346c8, - 0x2e4947, - 0x2b6d49, - 0x2896c8, - 0x29abd1, - 0x301d0a, - 0x2f6687, - 0x304586, - 0x2133c4, - 0x2c3848, - 0x3698c8, - 0x29ad8a, - 0x26e00d, - 0x2a2dc6, - 0x3a89c6, - 0x281546, - 0x21b207, - 0x2b5dc5, - 0x275187, - 0x28a285, - 0x375f84, - 0x2aa746, - 0x39f2c7, - 0x2dd64d, - 0x2a3147, - 0x367008, - 0x27bfc9, - 0x215586, - 0x39fac5, - 0x231a84, - 0x2e64c6, - 0x3b7ac6, - 0x2ff506, - 0x29c0c8, - 0x222e43, - 0x2056c3, - 0x37f685, - 0x251386, - 0x2af745, - 0x292c88, - 0x29ee8a, - 0x3b7cc4, - 0x28a348, - 0x2956c8, - 0x3b9c47, - 0x301fc9, - 0x2bf548, - 0x284cc7, - 0x2b7c46, - 0x3c758a, - 0x2e6548, - 0x30d849, - 0x2acc88, - 0x21ae09, - 0x304447, - 0x2f9505, - 0x336b06, - 0x35d048, - 0x3885c8, - 0x39ea08, - 0x210988, - 0x240e45, - 0x201484, - 0x233088, - 0x21f304, - 0x32f784, - 0x269fc5, - 0x294c87, - 0x3b9849, - 0x2054c7, - 0x211a85, - 0x2790c6, - 0x367dc6, - 0x20c384, - 0x2a4446, - 0x27f8c4, - 0x28c286, - 0x3b9606, - 0x20d106, - 0x3c0645, - 0x292b47, - 0x201303, - 0x272d49, - 0x3120c8, - 0x284b44, - 0x284b4d, - 0x299748, - 0x2efe48, - 0x30d7c6, - 0x2862c9, - 0x2cdc09, - 0x328245, - 0x29ef8a, - 0x26e88a, - 0x24e50c, - 0x24e686, - 0x2799c6, - 0x2cac46, - 0x26b6c9, - 0x3b8806, - 0x213546, - 0x3616c6, - 0x245a08, - 0x238a86, - 0x2d7b4b, - 0x294e05, - 0x21b205, - 0x27a1c5, - 0x201406, - 0x226543, - 0x23cac6, - 0x2a30c7, - 0x2c3705, - 0x25c345, - 0x3cb1c5, - 0x37a286, - 0x328304, - 0x337e86, - 0x2a4a09, - 0x20128c, - 0x375cc8, - 0x238d04, - 0x3025c6, - 0x28b606, - 0x2d6848, - 0x319348, - 0x201189, - 0x3ccc47, - 0x35f8c9, - 0x2712c6, - 0x22b984, - 0x208044, - 0x2842c4, - 0x2854c8, - 0x3b968a, - 0x35b046, - 0x369f87, - 0x3826c7, - 0x240dc5, - 0x2c48c4, - 0x2911c6, - 0x2b5e06, - 0x21d003, - 0x311f07, - 0x3b5b08, - 0x32838a, - 0x22b688, - 0x209388, - 0x3632c5, - 0x29fec5, - 0x267385, - 0x241186, - 0x38b006, - 0x398bc5, - 0x32cb49, - 0x2c46cc, - 0x267447, - 0x29ae08, - 0x2b1185, - 0x731a84, - 0x22c344, - 0x285a44, - 0x21a506, - 0x2a1e0e, - 0x368947, - 0x21b405, - 0x2d820c, - 0x30e047, - 0x39f247, - 0x235a09, - 0x2125c9, - 0x2897c5, - 0x3120c8, - 0x306b49, - 0x393205, - 0x2c3648, - 0x2b8706, - 0x381f86, - 0x23dbc4, - 0x290008, - 0x215743, - 0x378384, - 0x2dd485, - 0x394c07, - 0x2de485, - 0x3bb289, - 0x29608d, - 0x2adc06, - 0x3c2344, - 0x2b7d48, - 0x3bfb0a, - 0x224887, - 0x3cc385, - 0x280a03, - 0x2a080e, - 0x24818c, - 0x302ac7, - 0x2a1fc7, - 0x109d86, - 0x205643, - 0x3b8845, - 0x285a45, - 0x29bc08, - 0x2987c9, - 0x238c06, - 0x2792c4, - 0x2f65c6, - 0x23f3cb, - 0x2bd28c, - 0x251ec7, - 0x2d7e05, - 0x3ca248, - 0x2e7705, - 0x243c07, - 0x301b47, - 0x39e885, - 0x226543, - 0x2193c4, - 0x2e6285, - 0x2b68c5, - 0x2b68c6, - 0x29c608, - 0x39f2c7, - 0x3bae46, - 0x204ac6, - 0x32fb46, - 0x23f789, - 0x205a87, - 0x27f9c6, - 0x2bd406, - 0x2e1706, - 0x2ab685, - 0x20a7c6, - 0x377645, - 0x28d448, - 0x29458b, - 0x290f06, - 0x382704, - 0x2da549, - 0x245844, - 0x2b8688, - 0x31be07, - 0x287604, - 0x2bebc8, - 0x2c4d44, - 0x2ab6c4, - 0x28a105, - 0x319246, - 0x244307, - 0x2166c3, - 0x2a0285, - 0x2f4344, - 0x2ff046, - 0x3282c8, - 0x3293c5, - 0x294249, - 0x256285, - 0x246448, - 0x358447, - 0x32ce48, - 0x2be807, - 0x2f5389, - 0x27cf06, - 0x334ac6, - 0x29a344, - 0x300805, - 0x312f4c, - 0x27a1c7, - 0x27ab47, - 0x232648, - 0x2adc06, - 0x2a3004, - 0x37af04, - 0x25e6c9, - 0x2cad46, - 0x292207, - 0x205304, - 0x2a4546, - 0x348c85, - 0x2d3d87, - 0x2d7ac6, - 0x25f209, - 0x2e8cc7, - 0x297007, - 0x2a3f86, - 0x237bc5, - 0x283748, - 0x213148, - 0x20ff86, - 0x329405, - 0x2c5e86, - 0x203883, - 0x29ba89, - 0x29f18e, - 0x2be548, - 0x344d48, - 0x20fd8b, - 0x294486, - 0x327d84, - 0x286584, - 0x29f28a, - 0x211287, - 0x27fa85, - 0x20c249, - 0x2c2405, - 0x32f7c7, - 0x2310c4, - 0x291547, - 0x2fd848, - 0x2cd386, - 0x2bb449, - 0x2bf64a, - 0x211206, - 0x299286, - 0x2ae585, - 0x3961c5, - 0x38cc47, - 0x2479c8, - 0x348bc8, - 0x22a486, - 0x310805, - 0x23278e, - 0x2bfd04, - 0x20ff05, - 0x278a49, - 0x2e88c8, - 0x28f9c6, - 0x29da0c, - 0x29ea90, - 0x2a1a4f, - 0x2a3588, - 0x317887, - 0x3c0645, - 0x244185, - 0x244189, - 0x293309, - 0x31ef86, - 0x2d80c7, - 0x300705, - 0x239f49, - 0x34f0c6, - 0x3b864d, - 0x284189, - 0x28a344, - 0x2be2c8, - 0x233149, - 0x35b206, - 0x26bf45, - 0x334ac6, - 0x27e789, - 0x2063c8, - 0x20c245, - 0x290004, - 0x29dbcb, - 0x35b0c5, - 0x241d06, - 0x286cc6, - 0x206dc6, - 0x2a294b, - 0x294349, - 0x2096c5, - 0x391547, - 0x301c86, - 0x3a8ac6, - 0x2857c8, - 0x282649, - 0x366dcc, - 0x31b9c8, - 0x31b4c6, - 0x33b7c3, - 0x37cd86, - 0x2a2785, - 0x281188, - 0x310206, - 0x2d3fc8, - 0x238085, - 0x3882c5, - 0x358588, - 0x390707, - 0x3baa87, - 0x36a307, - 0x2f40c8, - 0x2d66c8, - 0x2d1886, - 0x2b7707, - 0x237147, - 0x2a264a, - 0x246603, - 0x201406, - 0x232705, - 0x244704, - 0x27bfc9, - 0x2f5304, - 0x2b9f84, - 0x29ce04, - 0x2a1fcb, - 0x32d347, - 0x2329c5, - 0x297748, - 0x2790c6, - 0x2790c8, - 0x27fcc6, - 0x28ff45, - 0x290205, - 0x291bc6, - 0x292548, - 0x292e88, - 0x27c186, - 0x29758f, - 0x29b550, - 0x3bf405, - 0x201303, - 0x22ba45, - 0x2fb688, - 0x293209, - 0x393348, - 0x2d7ec8, - 0x2506c8, - 0x32d407, - 0x278d89, - 0x2d41c8, - 0x2fcf84, - 0x29cc88, - 0x3b8049, - 0x2b81c7, - 0x29cc04, - 0x205588, - 0x29290a, - 0x2cc046, - 0x2a2dc6, - 0x226589, - 0x29ecc7, - 0x2d0648, - 0x20a408, - 0x205188, - 0x38a405, - 0x396f85, + 0x21b248, + 0x212187, + 0x26eb07, + 0x2a4287, + 0x2d1c48, + 0x3cd4c6, + 0x2a5485, + 0x27dd87, + 0x29a308, + 0x34c384, + 0x2fd284, + 0x294707, + 0x2b0707, + 0x308e4a, + 0x36a246, + 0x32f70a, + 0x2c3607, + 0x226147, + 0x20eb44, + 0x29d044, + 0x2d2706, + 0x36c404, + 0x36c40c, + 0x308d05, + 0x214e09, + 0x2b3644, + 0x2b6245, + 0x20ad88, + 0x293d45, + 0x38fe46, + 0x294244, + 0x2ad88a, + 0x2b3e46, + 0x293a0a, + 0x3c5107, + 0x2d0145, + 0x229fc5, + 0x244a8a, + 0x293945, + 0x2a3c06, + 0x23eb84, + 0x2b33c6, + 0x34bb85, + 0x28c346, + 0x2f188c, + 0x26390a, + 0x26db44, + 0x22f846, + 0x2a0607, + 0x2d4a84, + 0x34d748, + 0x2e7f46, + 0x382709, + 0x2c20c9, + 0x348289, + 0x2cf246, + 0x212286, + 0x21b387, + 0x32db48, + 0x212089, + 0x32e407, + 0x298346, + 0x280047, + 0x2667c5, + 0x226384, + 0x21af47, + 0x306545, + 0x288b05, + 0x200cc7, + 0x22ed08, + 0x3a7646, + 0x29b14d, + 0x29c94f, + 0x2a1d8d, + 0x205484, + 0x233d06, + 0x2d9448, + 0x28ea45, + 0x2a3748, + 0x261e8a, + 0x219344, + 0x2b53c6, + 0x2d60c7, + 0x219cc7, + 0x2d8dc9, 0x21b205, - 0x285a05, - 0x2b4d07, - 0x226545, - 0x2c3705, - 0x3c2646, - 0x393287, - 0x2d29c7, - 0x292c06, - 0x2d9bc5, - 0x241d06, - 0x26be05, - 0x2badc8, - 0x300684, - 0x2c8f06, - 0x348ac4, - 0x2be9c8, - 0x2c900a, - 0x27cc8c, - 0x255805, - 0x21b2c6, - 0x366f86, - 0x37f546, - 0x2fb884, - 0x3693c5, - 0x27f607, - 0x29ed49, - 0x2cf7c7, - 0x731a84, - 0x731a84, - 0x32d1c5, - 0x2177c4, - 0x29d3ca, - 0x278f46, - 0x306944, - 0x3bf885, - 0x2b3945, - 0x2b5d04, - 0x286907, - 0x256207, - 0x2cf388, - 0x2c5f88, - 0x3c8009, - 0x3201c8, - 0x29d58b, - 0x2442c4, - 0x3a8bc5, - 0x26b905, - 0x36a289, - 0x282649, - 0x2da448, - 0x229888, - 0x2dea44, - 0x28b645, - 0x2017c3, - 0x2d6585, - 0x299a46, - 0x29860c, - 0x2131c6, - 0x26be46, - 0x28fc45, - 0x37a308, - 0x3194c6, - 0x304706, - 0x2a2dc6, - 0x22b40c, - 0x26b9c4, - 0x32fc8a, - 0x28fb88, - 0x298447, - 0x2f4246, - 0x238cc7, - 0x2f61c5, - 0x237c86, - 0x365e46, - 0x374207, - 0x2bf344, - 0x218f05, - 0x278a44, - 0x376007, - 0x278c88, - 0x27984a, - 0x2843c7, - 0x2ab8c7, - 0x317807, - 0x2e7849, - 0x29860a, - 0x20ff83, - 0x2e4905, - 0x20d143, - 0x2b7a09, - 0x2d6a88, - 0x31ff87, - 0x393449, - 0x213246, - 0x32df48, - 0x3a34c5, - 0x24bc4a, - 0x384ac9, - 0x247bc9, - 0x3a1c07, - 0x3699c9, - 0x20d008, - 0x361306, - 0x21b488, - 0x3c1c47, - 0x281d47, - 0x2a3347, - 0x2d3208, - 0x3d02c6, - 0x2926c5, - 0x27f607, - 0x298d88, - 0x348a44, - 0x2d0284, - 0x293907, - 0x2afb07, - 0x3069ca, - 0x361286, - 0x3696ca, - 0x2c2847, - 0x2bfac7, - 0x218fc4, - 0x2953c4, - 0x2d3c86, - 0x3a0144, - 0x3a014c, - 0x306885, - 0x2107c9, - 0x2465c4, - 0x2b5dc5, - 0x3bfa88, - 0x28ea85, - 0x38ef06, - 0x293444, - 0x2a6c8a, - 0x2b1746, - 0x23ed0a, - 0x28e007, - 0x2d5605, - 0x228a85, - 0x240e0a, - 0x39e945, - 0x244146, - 0x21f304, - 0x2b2946, - 0x38cd05, - 0x3102c6, - 0x2fa2cc, - 0x2db94a, - 0x26e984, - 0x20fd86, - 0x29ecc7, - 0x2d7a44, - 0x245a08, - 0x2e37c6, - 0x382549, - 0x2c1b89, - 0x3cf549, - 0x2cfac6, - 0x3c1d46, - 0x21b5c7, - 0x32ca88, - 0x3c1b49, - 0x32d347, - 0x2978c6, - 0x3b4547, - 0x281405, - 0x2bfd04, - 0x21b187, - 0x237305, - 0x28a045, - 0x2f9e47, - 0x39e748, - 0x3ca1c6, - 0x299bcd, - 0x29be0f, - 0x2a064d, - 0x20d884, - 0x2347c6, - 0x2dbd08, - 0x361685, - 0x2a2808, - 0x27340a, - 0x28a344, - 0x2f1c86, - 0x2d8c07, - 0x21bb47, - 0x2d0bc9, - 0x21b445, - 0x2b5d04, - 0x2b8b8a, - 0x2bf109, - 0x369ac7, - 0x299e86, - 0x35b206, - 0x28b586, - 0x380d06, - 0x2db60f, - 0x2dbbc9, - 0x238a86, - 0x388206, - 0x32c149, - 0x2b7807, - 0x21a003, - 0x22b586, - 0x20ecc3, - 0x3590c8, - 0x2d4747, - 0x2a3789, - 0x2b42c8, - 0x3babc8, - 0x361906, - 0x30c049, - 0x37c885, - 0x2b78c4, - 0x2f95c7, - 0x26b745, - 0x20d884, - 0x232a88, - 0x211544, - 0x2b7547, - 0x342646, - 0x2a9685, - 0x2acc88, - 0x35b0cb, - 0x3125c7, - 0x241086, - 0x2ca444, - 0x327d06, - 0x269fc5, - 0x237305, - 0x2834c9, - 0x286509, - 0x281d84, - 0x281dc5, - 0x20fdc5, - 0x24bac6, - 0x3121c8, - 0x2c1646, - 0x3b594b, - 0x383c4a, - 0x2be905, - 0x290286, - 0x27d305, - 0x3c2585, - 0x295847, - 0x201688, - 0x2925c4, - 0x265cc6, - 0x292f06, - 0x20d1c7, - 0x31fe04, - 0x280786, - 0x3b7905, - 0x3b7909, - 0x2dc984, - 0x2c4a49, - 0x27c186, - 0x2c3f08, - 0x20fdc5, - 0x3827c5, - 0x3102c6, - 0x366cc9, - 0x2125c9, - 0x26bec6, - 0x2e89c8, - 0x2961c8, - 0x27d2c4, - 0x2b99c4, - 0x2b99c8, - 0x28e9c8, - 0x35f9c9, - 0x2999c6, - 0x2a2dc6, - 0x33ae0d, - 0x301806, - 0x2b32c9, - 0x223945, - 0x20ed06, - 0x206548, - 0x337dc5, - 0x237184, - 0x269fc5, - 0x286048, - 0x29d189, - 0x278b04, - 0x2bb2c6, - 0x30da0a, - 0x3029c8, - 0x306b49, - 0x26a8ca, - 0x3933c6, - 0x29bfc8, - 0x2439c5, - 0x29f608, - 0x2f6245, - 0x213109, - 0x33d7c9, - 0x219482, - 0x2537c5, - 0x270f46, - 0x27c0c7, - 0x244705, - 0x2f35c6, - 0x316b48, - 0x2adc06, - 0x2bc149, - 0x27ac46, - 0x285648, - 0x26c285, - 0x34b8c6, - 0x330748, - 0x2854c8, - 0x304348, - 0x318e48, - 0x20a7c4, - 0x250c83, - 0x2bc384, - 0x2845c6, - 0x281444, - 0x344c87, - 0x304609, - 0x2c9285, - 0x20a406, - 0x22b586, - 0x29c44b, - 0x2b54c6, - 0x363506, - 0x2cda88, - 0x2e6006, - 0x26e303, - 0x3da583, - 0x2bfd04, - 0x22f845, - 0x2edc07, - 0x278c88, - 0x278c8f, - 0x27f50b, - 0x311fc8, - 0x2bb346, - 0x3122ce, - 0x241243, - 0x2edb84, - 0x2b5445, - 0x2b5b86, - 0x2912cb, - 0x294d46, - 0x225b49, - 0x2a9685, - 0x253dc8, - 0x3c7cc8, - 0x21248c, - 0x2a2006, - 0x2d65c6, - 0x2dcb05, - 0x28a5c8, - 0x27cc85, - 0x35e8c8, - 0x29dd8a, - 0x2a0a89, - 0x731a84, + 0x2b6184, + 0x2b864a, + 0x2c03c9, + 0x2b5e47, + 0x2f2dc6, + 0x35e486, + 0x289e86, + 0x380606, + 0x2d868f, + 0x2d9309, + 0x31d6c6, + 0x388c06, + 0x32d209, + 0x2b6a47, + 0x214703, + 0x243846, + 0x208a43, + 0x35bf08, + 0x27fe87, + 0x2a46c9, + 0x31ca88, + 0x3a4848, + 0x2ff3c6, + 0x210889, + 0x35b405, + 0x22cf84, + 0x3035c7, + 0x39b785, + 0x205484, + 0x231988, + 0x20f104, + 0x2b6787, + 0x36d146, + 0x269e45, + 0x2af148, + 0x35e34b, + 0x3102c7, + 0x244d06, + 0x2ca784, + 0x379a86, + 0x267c05, + 0x306545, + 0x2811c9, + 0x283f49, + 0x26eb44, + 0x26eb85, + 0x22f885, + 0x248e06, + 0x30fec8, + 0x2c29c6, + 0x3d340b, + 0x384fca, + 0x2bfc85, + 0x290086, + 0x246805, + 0x2db7c5, + 0x296307, + 0x340e88, + 0x236584, + 0x261a86, + 0x293d06, + 0x214207, + 0x31da04, + 0x27ee06, + 0x21f245, + 0x21f249, + 0x212484, + 0x2f3349, + 0x27bd06, + 0x2c51c8, + 0x22f885, + 0x382985, + 0x28c346, + 0x377189, + 0x220d49, + 0x389946, + 0x2d7788, + 0x2a60c8, + 0x2467c4, + 0x2b8ac4, + 0x2b8ac8, + 0x2e6288, + 0x236689, + 0x29af46, + 0x215146, + 0x33860d, + 0x31f2c6, + 0x3215c9, + 0x202945, + 0x208a86, + 0x27b288, + 0x334545, + 0x3063c4, + 0x267c05, + 0x283a88, + 0x29db09, + 0x2782c4, + 0x2b9b86, + 0x3071ca, + 0x305288, + 0x308fc9, + 0x268a0a, + 0x38eec6, + 0x29cb08, + 0x3c22c5, + 0x28d848, + 0x2f4145, + 0x2224c9, + 0x33a989, + 0x20fe02, + 0x292b85, + 0x271786, + 0x27bc47, + 0x322b85, + 0x2fb486, + 0x312c48, + 0x2c6506, + 0x2c1209, + 0x27a846, + 0x283088, + 0x389d05, + 0x3ddc06, + 0x2f74c8, + 0x282f08, + 0x361008, + 0x315708, + 0x205744, + 0x21f543, + 0x2c1444, + 0x2822c6, + 0x266804, + 0x317407, + 0x254909, + 0x2c9a45, + 0x230586, + 0x243846, + 0x2a8d8b, + 0x2b56c6, + 0x33fd06, + 0x2ccd48, + 0x229a46, + 0x2bd1c3, + 0x203e83, + 0x226384, + 0x22f1c5, + 0x2b7ac7, + 0x278448, + 0x27844f, + 0x27dc8b, + 0x30fcc8, + 0x2b9c06, + 0x30ffce, + 0x244ec3, + 0x2b7a44, + 0x2b5645, + 0x2b6006, + 0x290d8b, + 0x295706, + 0x227789, + 0x269e45, + 0x24e408, + 0x204d88, + 0x220c0c, + 0x2a2f46, + 0x3598c6, + 0x2dedc5, + 0x288ec8, + 0x27c485, + 0x351c88, + 0x29eb4a, + 0x2a21c9, + 0x602c84, 0x2000c2, - 0x45e02782, + 0x4820c302, 0x200382, - 0x222884, - 0x2024c2, - 0x3216c4, - 0x202642, - 0x13c3, + 0x224e44, + 0x206a42, + 0x303f84, + 0x205642, + 0xca43, 0x2003c2, - 0x202002, - 0xa14c8, - 0x22d7c3, - 0x233743, - 0x220583, - 0x205e03, - 0x206b43, - 0x23cf83, - 0x24ce83, - 0x22d7c3, - 0x233743, - 0x220583, - 0x222884, - 0x206b43, - 0x23cf83, - 0x240b03, - 0x241844, - 0x22d7c3, - 0x236204, - 0x233743, - 0x2dd2c4, - 0x220583, - 0x2449c7, - 0x205e03, - 0x2013c3, - 0x2fb908, - 0x23cf83, - 0x27ee0b, - 0x2f7043, - 0x239606, - 0x21be02, - 0x2f060b, - 0x233743, - 0x220583, - 0x206b43, - 0x23cf83, - 0x22d7c3, - 0x233743, - 0x220583, - 0x23cf83, - 0x206a03, - 0x217583, + 0x209482, + 0x9fe08, + 0x22c0c3, + 0x232c43, + 0x228b03, + 0x211543, + 0x20a803, + 0x216603, + 0x248343, + 0x22c0c3, + 0x232c43, + 0x228b03, + 0x224e44, + 0x20a803, + 0x216603, + 0x234c83, + 0x242244, + 0x22c0c3, + 0x235604, + 0x232c43, + 0x2db1c4, + 0x228b03, + 0x322e47, + 0x211543, + 0x20ca43, + 0x31b008, + 0x216603, + 0x280acb, + 0x2f55c3, + 0x240986, + 0x219f82, + 0x2eec0b, + 0x232c43, + 0x228b03, + 0x20a803, + 0x216603, + 0x22c0c3, + 0x232c43, + 0x228b03, + 0x216603, + 0x221003, + 0x204383, 0x2000c2, - 0xa14c8, - 0x216685, - 0x237388, - 0x300ec8, - 0x202782, - 0x32ee85, - 0x3b4687, - 0x201242, - 0x2421c7, + 0x9fe08, + 0x397705, + 0x3065c8, + 0x2e2bc8, + 0x20c302, + 0x329085, + 0x3bfd47, + 0x201bc2, + 0x2401c7, 0x200382, - 0x25d047, - 0x308789, - 0x2c99c8, - 0x205009, - 0x20b2c2, - 0x3c7e87, - 0x36b004, - 0x3b4747, - 0x383b47, - 0x25d602, - 0x205e03, - 0x200e82, - 0x202642, + 0x254f47, + 0x2bd949, + 0x26c708, + 0x21d1c9, + 0x208582, + 0x3b04c7, + 0x3880c4, + 0x3bfe07, + 0x384ec7, + 0x259902, + 0x211543, + 0x205a02, + 0x205642, 0x2003c2, - 0x202142, + 0x2161c2, 0x200902, - 0x202002, - 0x2abec5, - 0x2a9785, - 0x2782, - 0x33743, - 0x22d7c3, - 0x233743, - 0x2053c3, - 0x220583, - 0x209a03, - 0x206b43, - 0x23cf83, - 0x22d7c3, - 0x233743, - 0x220583, - 0x206b43, - 0x23cf83, - 0x22d7c3, - 0x233743, - 0x220583, - 0x205e03, - 0x206b43, - 0x6df83, - 0x23cf83, - 0xaec3, + 0x209482, + 0x2d6405, + 0x21bb85, + 0xc302, + 0x32c43, + 0x22c0c3, + 0x232c43, + 0x210b03, + 0x228b03, + 0x204f43, + 0x20a803, + 0x216603, + 0x22c0c3, + 0x232c43, + 0x228b03, + 0x20a803, + 0x216603, + 0x22c0c3, + 0x232c43, + 0x228b03, + 0x211543, + 0x20a803, + 0x6d9c3, + 0x216603, + 0x8083, 0x101, - 0x22d7c3, - 0x233743, - 0x220583, - 0x222884, - 0x219e43, - 0x206b43, - 0x6df83, - 0x23cf83, - 0x214703, - 0x490726c6, - 0x45dc3, - 0xca685, - 0x22d7c3, - 0x233743, - 0x220583, - 0x206b43, - 0x23cf83, - 0x202782, - 0x22d7c3, - 0x233743, - 0x220583, - 0x206b43, - 0x6df83, - 0x23cf83, - 0x6942, - 0xa14c8, - 0x12bd03, - 0x13c3, - 0x6df83, - 0x47984, - 0x1421d04, - 0xe7b05, + 0x22c0c3, + 0x232c43, + 0x228b03, + 0x224e44, + 0x214543, + 0x20a803, + 0x6d9c3, + 0x216603, + 0x216e03, + 0x4b50bb86, + 0xe85c3, + 0xca9c5, + 0x22c0c3, + 0x232c43, + 0x228b03, + 0x20a803, + 0x216603, + 0x20c302, + 0x22c0c3, + 0x232c43, + 0x228b03, + 0x20a803, + 0x6d9c3, + 0x216603, + 0x82c2, + 0x9fe08, + 0x12cdc3, + 0xca43, + 0x6d9c3, + 0x42744, + 0x142a744, + 0xe50c5, 0x2000c2, - 0x391904, - 0x22d7c3, - 0x233743, - 0x220583, - 0x23d9c3, - 0x22e1c5, - 0x219e43, - 0x214903, - 0x206b43, - 0x251ac3, - 0x23cf83, - 0x202003, - 0x2418c3, - 0x207b83, + 0x392104, + 0x22c0c3, + 0x232c43, + 0x228b03, + 0x241f43, + 0x22cd85, + 0x214543, + 0x20e403, + 0x20a803, + 0x24bbc3, + 0x216603, + 0x20c603, + 0x2422c3, + 0x205b03, 0x5c2, - 0x2ebc2, - 0x22d7c3, - 0x233743, - 0x220583, - 0x206b43, - 0x23cf83, + 0x2d7c2, + 0x22c0c3, + 0x232c43, + 0x228b03, + 0x20a803, + 0x216603, 0x2000c2, - 0x24ce83, - 0x202782, - 0x233743, - 0x220583, - 0x222884, - 0x206b43, - 0x23cf83, - 0x202002, - 0xa14c8, - 0x220583, - 0x6df83, - 0xa14c8, - 0x6df83, - 0x26f283, - 0x22d7c3, - 0x230944, - 0x233743, - 0x220583, - 0x2067c2, - 0x205e03, - 0x206b43, - 0x23cf83, - 0x22d7c3, - 0x233743, - 0x220583, - 0x2067c2, - 0x22a243, - 0x206b43, - 0x23cf83, - 0x2ef083, - 0x202003, + 0x248343, + 0x20c302, + 0x232c43, + 0x228b03, + 0x224e44, + 0x20a803, + 0x216603, + 0x209482, + 0x9fe08, + 0x228b03, + 0x6d9c3, + 0x9fe08, + 0x6d9c3, + 0x26fb43, + 0x22c0c3, + 0x22fd84, + 0x232c43, + 0x228b03, + 0x203dc2, + 0x211543, + 0x20a803, + 0x216603, + 0x22c0c3, + 0x232c43, + 0x228b03, + 0x203dc2, + 0x238cc3, + 0x20a803, + 0x216603, + 0x2ed343, + 0x20c603, 0x2000c2, - 0x202782, - 0x220583, - 0x206b43, - 0x23cf83, - 0x239605, - 0x11a406, - 0x241844, - 0x21be02, - 0xa14c8, + 0x20c302, + 0x228b03, + 0x20a803, + 0x216603, + 0x240985, + 0x127206, + 0x242244, + 0x219f82, + 0x9fe08, 0x2000c2, - 0x12dac5, - 0x1cb48, - 0x161c03, - 0x202782, - 0x4d8947c6, - 0xe184, - 0x10cd0b, - 0x35246, - 0x5f07, - 0x233743, - 0x4c108, - 0x4c10b, - 0x4c58b, - 0x4cc0b, - 0x4cf4b, - 0x4d20b, - 0x4d64b, - 0x9d86, - 0x220583, - 0x1b8e85, - 0x131844, - 0x218dc3, - 0x118c87, - 0xe1284, - 0x6d0c4, - 0x206b43, - 0x6bfc6, - 0xb2bc4, - 0x6df83, - 0x23cf83, - 0x2f7dc4, - 0x12d947, - 0x11a009, - 0x10cac8, - 0x14a504, - 0xec046, - 0x140fc8, - 0x141185, - 0x1da6c9, - 0x2fe03, - 0x12dac5, - 0x202782, - 0x22d7c3, - 0x233743, - 0x220583, - 0x205e03, - 0x2013c3, - 0x23cf83, - 0x2f7043, - 0x21be02, - 0xa14c8, - 0x22d7c3, - 0x233743, - 0x220583, - 0x219c83, - 0x205184, - 0x206b43, - 0x13c3, - 0x23cf83, - 0x22d7c3, - 0x233743, - 0x2dd2c4, - 0x220583, - 0x206b43, - 0x23cf83, - 0x239606, - 0x233743, - 0x220583, - 0x3d443, - 0x6df83, - 0x23cf83, - 0x22d7c3, - 0x233743, - 0x220583, - 0x206b43, - 0x23cf83, - 0x12dac5, - 0x5f07, - 0xe9c3, - 0x2fe03, - 0xa14c8, - 0x220583, - 0x22d7c3, - 0x233743, - 0x220583, - 0x89003, - 0x206b43, - 0x23cf83, - 0x50e2d7c3, - 0x233743, - 0x206b43, - 0x23cf83, - 0xa14c8, + 0x12eb85, + 0x1c508, + 0x175583, + 0x20c302, + 0x4fd40486, + 0xd944, + 0x10a7cb, + 0x34786, + 0x11647, + 0x1b8dc9, + 0x232c43, + 0x47508, + 0x4750b, + 0x4798b, + 0x480cb, + 0x4840b, + 0x486cb, + 0x48b0b, + 0x7386, + 0x228b03, + 0x20005, + 0x2a44, + 0x20e943, + 0x115547, + 0xded04, + 0x6c144, + 0x20a803, + 0x189a46, + 0x194584, + 0x6d9c3, + 0x216603, + 0x2f61c4, + 0x12ea07, + 0x126e09, + 0x10a588, + 0x52c84, + 0x3e006, + 0x8148, + 0x130245, + 0x3fc9, + 0x2f783, + 0x12eb85, + 0x20c302, + 0x22c0c3, + 0x232c43, + 0x228b03, + 0x211543, + 0x20ca43, + 0x216603, + 0x2f55c3, + 0x219f82, + 0x9fe08, + 0x22c0c3, + 0x232c43, + 0x228b03, + 0x214383, + 0x217b84, + 0x20a803, + 0xca43, + 0x216603, + 0x22c0c3, + 0x232c43, + 0x2db1c4, + 0x228b03, + 0x20a803, + 0x216603, + 0x240986, + 0x232c43, + 0x228b03, + 0x3a183, + 0x6d9c3, + 0x216603, + 0x22c0c3, + 0x232c43, + 0x228b03, + 0x20a803, + 0x216603, + 0x12eb85, + 0x11647, + 0x7883, + 0x2f783, + 0x9fe08, + 0x228b03, + 0x22c0c3, + 0x232c43, + 0x228b03, + 0x5c743, + 0x20a803, + 0x216603, + 0x5322c0c3, + 0x232c43, + 0x20a803, + 0x216603, + 0x9fe08, 0x2000c2, - 0x202782, - 0x22d7c3, - 0x220583, - 0x206b43, + 0x20c302, + 0x22c0c3, + 0x228b03, + 0x20a803, 0x2003c2, - 0x23cf83, - 0x33dd07, - 0x2c67cb, - 0x2165c3, - 0x31ec48, - 0x32c807, - 0x20f286, - 0x215b85, - 0x32efc9, - 0x205b88, - 0x37ab89, - 0x3a5d10, - 0x37ab8b, - 0x2e1d89, - 0x20e9c3, - 0x2f0cc9, - 0x232006, - 0x23200c, - 0x216748, - 0x3d8588, - 0x308c49, - 0x2b948e, - 0x30854b, - 0x336d4c, - 0x20a683, - 0x2802cc, - 0x3c6089, - 0x306487, - 0x23368c, - 0x2b0cca, - 0x24ec04, - 0x305a8d, - 0x280188, - 0x3c544d, - 0x287b86, - 0x24184b, - 0x31a189, - 0x388487, - 0x372586, - 0x274c09, - 0x327eca, - 0x3243c8, - 0x2f6c44, - 0x38dc07, - 0x231447, - 0x201c84, - 0x217444, - 0x200ac9, - 0x371bc9, - 0x28da08, - 0x20ab05, - 0x20b205, - 0x3dc286, - 0x305949, - 0x27368d, - 0x2fdbc8, - 0x3dc187, - 0x215c08, - 0x250a06, - 0x22e3c4, - 0x2850c5, - 0x3c1a46, - 0x3c33c4, - 0x3c5f87, - 0x3d10ca, - 0x20c184, - 0x211146, - 0x212109, - 0x21210f, - 0x212e0d, - 0x2136c6, - 0x21c750, - 0x21cb46, - 0x21d247, - 0x21da87, - 0x21da8f, - 0x21ec49, - 0x224a46, - 0x225087, - 0x225088, - 0x225e89, - 0x3d2008, - 0x2ece07, - 0x216683, - 0x22d646, - 0x3c3ac8, - 0x2b974a, - 0x3785c9, - 0x205cc3, - 0x32ed86, - 0x265b0a, - 0x2f2087, - 0x3062ca, - 0x21f60e, - 0x21ed86, - 0x2df347, - 0x2aa086, - 0x242d46, - 0x396d8b, - 0x21608a, - 0x2c6e0d, - 0x3c1e07, - 0x268908, - 0x268909, - 0x26890f, - 0x2b6ecc, - 0x2729c9, - 0x2e454e, - 0x244aca, - 0x2d5a86, - 0x3d9b86, - 0x3264cc, - 0x33934c, - 0x34b0c8, - 0x36a8c7, - 0x235905, - 0x294b44, - 0x20278e, - 0x2663c4, - 0x329007, - 0x3d6d0a, - 0x22c794, - 0x22d08f, - 0x21dc48, - 0x22d508, - 0x351a8d, - 0x351a8e, - 0x22d989, - 0x22e808, - 0x22e80f, - 0x23338c, - 0x23338f, - 0x234507, - 0x236b0a, - 0x24748b, - 0x239c48, - 0x23ac47, - 0x26014d, - 0x336146, - 0x305c46, - 0x23c949, - 0x25b608, - 0x242b48, - 0x242b4e, - 0x2c68c7, - 0x2fc1c5, - 0x247745, - 0x200f04, - 0x20f546, - 0x28d908, - 0x30ae43, - 0x2cb98e, - 0x260508, - 0x2a688b, - 0x26f447, - 0x22a2c5, - 0x26ec06, - 0x2ad3c7, - 0x347a08, - 0x38ca49, - 0x3cee45, - 0x289488, - 0x221746, - 0x3a7a4a, - 0x202689, - 0x233749, - 0x23374b, - 0x30a308, - 0x201b49, - 0x20abc6, - 0x24998a, - 0x35660a, - 0x236d0c, - 0x335f07, - 0x2c97ca, - 0x346ecb, - 0x346ed9, - 0x32ab08, - 0x239685, - 0x260306, - 0x26aec9, - 0x2c9ec6, - 0x378d0a, - 0x205d86, - 0x202404, - 0x2cc70d, - 0x202407, - 0x221b09, - 0x24adc5, - 0x24b648, - 0x24bec9, - 0x24e444, - 0x24eb07, - 0x24eb08, - 0x24fcc7, - 0x267e88, - 0x254907, - 0x39fd05, - 0x25b10c, - 0x25b809, - 0x2e0b8a, - 0x3aacc9, - 0x2f0dc9, - 0x387fcc, - 0x25de8b, - 0x25f048, - 0x260908, - 0x264044, - 0x2872c8, - 0x288c09, - 0x2b0d87, - 0x212346, - 0x29cfc7, - 0x29b1c9, - 0x3cbb0b, - 0x327b87, - 0x38b307, - 0x28e147, - 0x3c53c4, - 0x3c53c5, - 0x2dcfc5, - 0x354a0b, - 0x3b6784, - 0x3a1308, - 0x2cb60a, - 0x221807, - 0x3d81c7, - 0x290a92, - 0x28c186, - 0x22fac6, - 0x37f0ce, - 0x317f46, - 0x295548, - 0x295b8f, - 0x3c5808, - 0x3979c8, - 0x342b4a, - 0x342b51, - 0x2a46ce, - 0x20434a, - 0x20434c, - 0x22ea07, - 0x22ea10, - 0x3bf148, - 0x2a48c5, - 0x2ad9ca, - 0x3c340c, - 0x297c0d, - 0x209a06, - 0x3c8207, - 0x3c820c, - 0x209a0c, - 0x21c44c, - 0x2af28b, - 0x38a844, - 0x226704, - 0x2b0589, - 0x37af87, - 0x39c749, - 0x356449, - 0x2b0987, - 0x2b0b46, - 0x2b0b49, - 0x2b0f43, - 0x2add0a, - 0x31f807, - 0x372e0b, - 0x2c6c8a, - 0x36b084, - 0x3997c6, - 0x284649, - 0x39ffc4, - 0x2f378a, - 0x241385, - 0x2c03c5, - 0x2c03cd, - 0x2c070e, - 0x2bc4c5, - 0x33c9c6, - 0x239207, - 0x25b38a, - 0x2666c6, - 0x2ee984, - 0x305e07, - 0x2d934b, - 0x267b87, - 0x2503c4, - 0x2b1a46, - 0x2b1a4d, - 0x2dfc0c, - 0x212a06, - 0x2fddca, - 0x2a9b06, - 0x2f7888, - 0x23aa87, - 0x24b30a, - 0x249bc6, - 0x2066c3, - 0x2066c6, - 0x3c3948, - 0x2b070a, - 0x287887, - 0x287888, - 0x2d4344, - 0x291007, - 0x2d87c8, - 0x29f788, - 0x292348, - 0x2d198a, - 0x2e43c5, - 0x30bc87, - 0x3a8e13, - 0x2588c6, - 0x21a048, - 0x222049, - 0x242088, - 0x36198b, - 0x3baf48, - 0x26a304, - 0x358686, - 0x322146, - 0x319089, - 0x3d8747, - 0x25b208, - 0x29f906, - 0x2f9d44, - 0x3a4dc5, - 0x2d00c8, - 0x203e4a, - 0x2cc388, - 0x2d1406, - 0x29c1ca, - 0x2b6a48, - 0x2d7848, - 0x2d8dc8, - 0x2d9886, - 0x2dbf06, - 0x3aa78c, - 0x2dc3d0, - 0x2a6345, - 0x31dfc8, - 0x31dfd0, - 0x3c5610, - 0x3a5b8e, - 0x3aa40e, - 0x3aa414, - 0x3b008f, - 0x3b0446, - 0x204211, - 0x201d53, - 0x2021c8, - 0x360c45, - 0x31f188, - 0x37e385, - 0x33304c, - 0x227989, - 0x294989, - 0x227e07, - 0x235fc9, - 0x3788c7, - 0x35b4c6, - 0x284ec7, - 0x2075c5, - 0x20af03, - 0x30b009, - 0x24c8c9, - 0x23d443, - 0x2192c4, - 0x21ff8d, - 0x38ce0f, - 0x2f9d85, - 0x332f46, - 0x217c47, - 0x2164c7, - 0x3da906, - 0x3da90b, - 0x2a5d05, - 0x25c706, - 0x303647, - 0x254e09, - 0x224446, - 0x384245, - 0x3cc78b, - 0x3b5086, - 0x3c7a05, - 0x23da48, - 0x28bf48, - 0x2a100c, - 0x2a1010, - 0x2a7a49, - 0x2b1e87, - 0x324c8b, - 0x2eb106, - 0x2eccca, - 0x206a8b, - 0x2ee08a, - 0x2ee306, - 0x2eef45, - 0x32c706, - 0x27ae08, - 0x227eca, - 0x35171c, - 0x2f710c, - 0x2f7408, - 0x239605, - 0x38a147, - 0x21f4c6, - 0x3494c5, - 0x215f46, - 0x3daac8, - 0x2bf387, - 0x2b9388, - 0x25898a, - 0x217d4c, - 0x2c7289, - 0x20a587, - 0x246984, - 0x247806, - 0x39754a, - 0x356545, - 0x2170cc, - 0x21bf48, - 0x2aa388, - 0x2d49cc, - 0x3587cc, - 0x36abc9, - 0x36ae07, - 0x24a14c, - 0x228184, - 0x24a60a, - 0x314a4c, - 0x25690b, - 0x256f8b, - 0x259b06, - 0x25ee87, - 0x22ec47, - 0x22ec4f, - 0x307851, - 0x2e2e12, - 0x2641cd, - 0x2641ce, - 0x26450e, - 0x3b0248, - 0x3b0252, - 0x269ac8, - 0x222687, - 0x2528ca, - 0x2a8108, - 0x317f05, - 0x2b4b4a, - 0x21cec7, - 0x2e8684, - 0x203843, - 0x236745, - 0x342dc7, - 0x34e287, - 0x297e0e, - 0x31d5cd, - 0x326a89, - 0x255c85, - 0x352a03, - 0x337986, - 0x25cd05, - 0x2a6ac8, - 0x2bcf89, - 0x260345, - 0x26034f, - 0x2dadc7, - 0x215a05, - 0x26fe0a, - 0x3bf6c6, - 0x2f9889, - 0x37b50c, - 0x3bcfc9, - 0x3d1b06, - 0x2cb40c, - 0x33b8c6, - 0x304fc8, - 0x305fc6, - 0x33f806, - 0x2b5644, - 0x31ddc3, - 0x32358a, - 0x28e451, - 0x2818ca, - 0x27d185, - 0x355ac7, - 0x258d07, - 0x2d88c4, - 0x2d88cb, - 0x204e88, - 0x2be3c6, - 0x2326c5, - 0x32a284, - 0x243089, + 0x216603, + 0x33aec7, + 0x20f64b, + 0x20c003, + 0x278c08, + 0x32d8c7, + 0x32a1c6, + 0x20d0c5, + 0x3291c9, + 0x2112c8, + 0x37b649, + 0x3a1d90, + 0x37b64b, + 0x2e1b49, + 0x207883, + 0x2ef2c9, + 0x230a06, + 0x230a0c, + 0x3977c8, + 0x3d80c8, + 0x2bde09, + 0x2ba48e, + 0x2bd70b, + 0x2fff4c, + 0x225843, + 0x28768c, + 0x3ce3c9, + 0x308907, + 0x232b8c, + 0x2b18ca, + 0x249f84, + 0x30810d, + 0x287548, + 0x3cee4d, + 0x314846, + 0x24224b, + 0x326f89, + 0x388e87, + 0x369a86, + 0x373a89, + 0x2f790a, + 0x3dcf08, + 0x2f4c84, + 0x38e347, + 0x2417c7, + 0x345784, + 0x217304, + 0x344509, + 0x251789, + 0x28c008, + 0x2eda85, + 0x2084c5, + 0x204c46, + 0x307fc9, + 0x26210d, + 0x215348, + 0x204b47, + 0x20d148, + 0x263e46, + 0x237b84, + 0x285845, + 0x3c4c46, + 0x3c5d44, + 0x3ce2c7, + 0x3d558a, + 0x20ab44, + 0x213006, + 0x213cc9, + 0x213ccf, + 0x214b0d, + 0x215b86, + 0x21c110, + 0x21c506, + 0x21dac7, + 0x220607, + 0x22060f, + 0x221349, + 0x226486, + 0x226fc7, + 0x226fc8, + 0x227ac9, + 0x3a8b48, + 0x311007, + 0x20b383, + 0x22bf46, + 0x298fc8, + 0x2ba74a, + 0x2094c9, + 0x211403, + 0x328f86, + 0x2618ca, + 0x23a747, + 0x30874a, + 0x34018e, + 0x221486, + 0x318947, + 0x34f706, + 0x240d86, + 0x20748b, + 0x39710a, + 0x27630d, + 0x212347, + 0x265388, + 0x265389, + 0x26538f, + 0x30440c, + 0x263289, + 0x3d28ce, + 0x322f4a, + 0x3c2b46, + 0x2fdb86, + 0x31ef4c, + 0x32018c, + 0x322208, + 0x35a347, + 0x37c545, + 0x2297c4, + 0x36a6ce, + 0x262584, + 0x329687, + 0x39d78a, + 0x3d3b54, + 0x3d64cf, + 0x2207c8, + 0x22be08, + 0x3625cd, + 0x3625ce, + 0x22c289, + 0x22d408, + 0x22d40f, + 0x23288c, + 0x23288f, + 0x233a47, + 0x235f0a, + 0x23d64b, + 0x237788, + 0x238b87, + 0x25bfcd, + 0x330106, + 0x3082c6, + 0x23b289, + 0x3dbb88, + 0x240b88, + 0x240b8e, + 0x20f747, + 0x2fbb45, + 0x242505, + 0x207a84, + 0x32a486, + 0x28bf08, + 0x374883, + 0x2e16ce, + 0x25c388, + 0x2a704b, + 0x26fd07, + 0x26ae45, + 0x287806, + 0x2aeb47, + 0x31b4c8, + 0x34b8c9, + 0x3cc205, + 0x287c88, + 0x222e86, + 0x3a35ca, + 0x36a5c9, + 0x232c49, + 0x232c4b, + 0x339748, + 0x345649, + 0x2edb46, + 0x28f0ca, + 0x36764a, + 0x23610c, + 0x368807, + 0x26c50a, + 0x2e5b0b, + 0x2e5b19, + 0x324888, + 0x240a05, + 0x25c186, + 0x217d09, + 0x26cc06, + 0x236d8a, + 0x2114c6, + 0x20d644, + 0x2cbb0d, + 0x344147, + 0x20d649, + 0x244745, + 0x245148, + 0x2472c9, + 0x249204, + 0x249e87, + 0x249e88, + 0x24a2c7, + 0x264208, + 0x24ef47, + 0x36bfc5, + 0x256e4c, + 0x257309, + 0x2d908a, + 0x3a6609, + 0x2ef3c9, + 0x3889cc, + 0x25a18b, + 0x25ad08, + 0x25c8c8, + 0x260284, + 0x284fc8, + 0x286209, + 0x2b1987, + 0x213f06, + 0x2a0e07, + 0x29bc49, + 0x20624b, + 0x35cd07, + 0x216687, + 0x3c5247, + 0x3cedc4, + 0x3cedc5, + 0x2daec5, + 0x358e8b, + 0x3b40c4, + 0x326948, + 0x2f9a0a, + 0x222f47, + 0x3c8e87, + 0x290552, + 0x292586, + 0x22f446, + 0x28e40e, + 0x296b86, + 0x296008, + 0x29664f, + 0x3cf208, + 0x3b1148, + 0x34200a, + 0x342011, + 0x2a5c4e, + 0x2536ca, + 0x2536cc, + 0x22d607, + 0x22d610, + 0x3bee08, + 0x2a5e45, + 0x2aee4a, + 0x3c5d8c, + 0x29868d, + 0x3b0c46, + 0x3b0c47, + 0x3b0c4c, + 0x3bd2cc, + 0x36f70c, + 0x2c4c4b, + 0x38c184, + 0x2e5bc4, + 0x2b1189, + 0x34abc7, + 0x37d789, + 0x367489, + 0x2b1587, + 0x2b1746, + 0x2b1749, + 0x2b1b43, + 0x2c660a, + 0x373cc7, + 0x3c05cb, + 0x27618a, + 0x388144, + 0x32fd06, + 0x282349, + 0x36c284, + 0x2f480a, + 0x245005, + 0x2c16c5, + 0x2c16cd, + 0x2c1a0e, + 0x2c1585, + 0x339b86, + 0x240587, + 0x3db90a, + 0x2569c6, + 0x37c044, + 0x30ed87, + 0x2ee38b, + 0x263f07, + 0x24aac4, + 0x27a306, + 0x27a30d, + 0x2dd88c, + 0x20a6c6, + 0x21554a, + 0x229886, + 0x2147c8, + 0x35b747, + 0x2c93ca, + 0x23b006, + 0x212243, + 0x220286, + 0x298e48, + 0x22fb0a, + 0x2d2dc7, + 0x2d2dc8, + 0x25af84, + 0x290ac7, + 0x2d3288, + 0x292788, + 0x2f1b08, + 0x2b808a, + 0x2e2a45, + 0x2db407, + 0x253513, + 0x268f86, + 0x3dabc8, + 0x224609, + 0x240088, + 0x2ff44b, + 0x3a4bc8, + 0x2b92c4, + 0x21aac6, + 0x320906, + 0x31c309, + 0x2c9207, + 0x256f48, + 0x2a1c06, + 0x200bc4, + 0x3a0e45, + 0x2cf888, + 0x201d8a, + 0x2cb788, + 0x2d0846, + 0x29cd0a, + 0x26e708, + 0x2d4888, + 0x2d6288, + 0x2d6ac6, + 0x2d9646, + 0x3a60cc, + 0x2d9bd0, + 0x2ade05, + 0x3b6408, + 0x3b6410, + 0x3cf010, + 0x3a1c0e, + 0x3a5d4e, + 0x3a5d54, + 0x3ad7cf, + 0x3adb86, + 0x345851, + 0x343a93, + 0x343f08, + 0x369c05, + 0x27aa88, + 0x2097c5, + 0x329d8c, + 0x229189, + 0x229609, + 0x3dd547, + 0x340649, + 0x236947, + 0x35e746, + 0x285647, + 0x203885, + 0x2080c3, + 0x23a183, + 0x20fc44, + 0x30128d, + 0x34bc8f, + 0x200c05, + 0x333a46, + 0x212887, + 0x397547, + 0x204206, + 0x20420b, + 0x2a6a85, + 0x258b46, + 0x305f87, + 0x24f449, + 0x2211c6, + 0x3855c5, + 0x3ba74b, + 0x3b0946, + 0x2137c5, + 0x23f088, + 0x291988, + 0x29f94c, + 0x29f950, + 0x2a2749, + 0x2b71c7, + 0x2b22cb, + 0x2c1f86, + 0x310eca, + 0x3da94b, + 0x30cc4a, + 0x2eca86, + 0x2ed205, + 0x32d7c6, + 0x286bc8, + 0x3dd60a, + 0x36225c, + 0x2f568c, + 0x2f5988, + 0x240985, + 0x38b9c7, + 0x2ba0c6, + 0x3b9505, + 0x218086, + 0x2043c8, + 0x2c0647, + 0x2ba388, + 0x26904a, + 0x3a978c, + 0x374b09, + 0x3a9a07, + 0x286744, + 0x2425c6, + 0x300b4a, + 0x367585, + 0x216f8c, + 0x21a0c8, + 0x2e4ac8, + 0x34ea0c, + 0x35a64c, + 0x387c89, + 0x387ec7, + 0x370b8c, + 0x222104, + 0x24a04a, + 0x30f80c, + 0x25038b, + 0x250a0b, + 0x253c46, + 0x256b07, + 0x22d847, + 0x22d84f, + 0x309cd1, + 0x2dfa92, + 0x257bcd, + 0x257bce, + 0x257f0e, + 0x3ad988, + 0x3ad992, + 0x260408, + 0x224c47, + 0x24d44a, + 0x2a95c8, + 0x296b45, + 0x2b484a, + 0x21c887, + 0x2e99c4, + 0x201783, + 0x235b45, + 0x342287, + 0x355047, + 0x29888e, + 0x3355cd, + 0x33c809, + 0x319c85, + 0x358243, + 0x34a646, + 0x259145, + 0x2a7288, + 0x21e489, + 0x25c1c5, + 0x25c1cf, + 0x2d2547, + 0x20cf45, + 0x2706ca, + 0x3c1586, + 0x245e09, + 0x37818c, + 0x3addc9, + 0x3d7046, + 0x2f980c, + 0x3390c6, + 0x307648, + 0x2e5a06, + 0x3645c6, + 0x2b5844, + 0x31c283, + 0x221a4a, + 0x3037d1, + 0x26344a, + 0x246685, + 0x25a5c7, + 0x254047, + 0x2d3384, + 0x2d338b, + 0x21d048, + 0x2bf146, + 0x2315c5, + 0x32b944, + 0x2410c9, 0x2008c4, - 0x242987, - 0x380385, - 0x380387, - 0x37f305, - 0x2535c3, - 0x222548, - 0x31f38a, - 0x2166c3, - 0x2166ca, - 0x27eb06, - 0x2600cf, - 0x3d3489, - 0x2cb910, - 0x2fd448, - 0x2d2049, - 0x298b07, - 0x2b19cf, - 0x393804, - 0x2dd344, - 0x21c9c6, - 0x3ac106, - 0x2ed80a, - 0x2574c6, - 0x394fc7, - 0x3152c8, - 0x3154c7, - 0x316907, - 0x31820a, - 0x31720b, - 0x328805, - 0x2e2a48, - 0x21b2c3, - 0x3ba74c, - 0x351e0f, - 0x23570d, - 0x259307, - 0x326bc9, - 0x225547, - 0x23be88, - 0x22c98c, - 0x26a208, - 0x23d708, - 0x33290e, - 0x345b14, - 0x346024, - 0x35d98a, - 0x37b14b, - 0x378984, - 0x378989, - 0x2f1d08, - 0x2484c5, - 0x30a94a, - 0x260747, - 0x21e744, - 0x24ce83, - 0x22d7c3, - 0x236204, - 0x233743, - 0x220583, - 0x222884, - 0x219e43, - 0x205e03, - 0x2dc3c6, - 0x205184, - 0x206b43, - 0x23cf83, - 0x213c43, + 0x20c3c7, + 0x34cf05, + 0x34cf07, + 0x28e645, + 0x247d03, + 0x224b08, + 0x27ac8a, + 0x24e4c3, + 0x39774a, + 0x36c746, + 0x25bf4f, + 0x3d2009, + 0x2e1650, + 0x2fcbc8, + 0x2d1689, + 0x29a087, + 0x27a28f, + 0x38f304, + 0x2db244, + 0x21c386, + 0x243206, + 0x2ed5ca, + 0x252f86, + 0x395207, + 0x311348, + 0x311547, + 0x312a07, + 0x314aca, + 0x31330b, + 0x251a45, + 0x2df6c8, + 0x20ae83, + 0x3bcd4c, + 0x37c2cf, + 0x3c0d8d, + 0x257747, + 0x33c949, + 0x2312c7, + 0x267e48, + 0x3d3d4c, + 0x2b91c8, + 0x246388, + 0x33104e, + 0x348c94, + 0x3491a4, + 0x35ff0a, + 0x37bccb, + 0x236a04, + 0x236a09, + 0x2b5448, + 0x242d05, + 0x37438a, + 0x285b07, + 0x322c44, + 0x248343, + 0x22c0c3, + 0x235604, + 0x232c43, + 0x228b03, + 0x224e44, + 0x214543, + 0x211543, + 0x2d9bc6, + 0x217b84, + 0x20a803, + 0x216603, + 0x216103, 0x2000c2, - 0x24ce83, - 0x202782, - 0x22d7c3, - 0x236204, - 0x233743, - 0x220583, - 0x219e43, - 0x2dc3c6, - 0x206b43, - 0x23cf83, - 0xa14c8, - 0x22d7c3, - 0x233743, - 0x228843, - 0x206b43, - 0x6df83, - 0x23cf83, - 0xa14c8, - 0x22d7c3, - 0x233743, - 0x220583, - 0x205e03, - 0x205184, - 0x206b43, - 0x23cf83, + 0x248343, + 0x20c302, + 0x22c0c3, + 0x235604, + 0x232c43, + 0x228b03, + 0x214543, + 0x2d9bc6, + 0x20a803, + 0x216603, + 0x9fe08, + 0x22c0c3, + 0x232c43, + 0x212483, + 0x20a803, + 0x6d9c3, + 0x216603, + 0x9fe08, + 0x22c0c3, + 0x232c43, + 0x228b03, + 0x211543, + 0x217b84, + 0x20a803, + 0x216603, 0x2000c2, - 0x24de03, - 0x202782, - 0x233743, - 0x220583, - 0x205e03, - 0x206b43, - 0x23cf83, - 0x205cc2, - 0x235d82, - 0x202782, - 0x22d7c3, - 0x206742, + 0x258783, + 0x20c302, + 0x232c43, + 0x228b03, + 0x211543, + 0x20a803, + 0x216603, + 0x204042, + 0x209382, + 0x20c302, + 0x22c0c3, + 0x207902, 0x2005c2, - 0x222884, - 0x3216c4, - 0x228d42, - 0x205184, + 0x224e44, + 0x303f84, + 0x22b302, + 0x217b84, 0x2003c2, - 0x23cf83, - 0x213c43, - 0x259b06, - 0x2195c2, - 0x207d82, - 0x223f82, - 0x5361f043, - 0x53a04343, - 0x59646, - 0x59646, - 0x241844, - 0x2013c3, - 0x8d78a, - 0x1721cc, - 0x1dca0c, - 0xca48d, - 0x12dac5, - 0x8cf0c, - 0x2afc7, - 0xc946, - 0x13848, - 0x1b047, - 0x20a08, - 0x18930a, - 0x1142c7, - 0x5468d145, - 0xdee89, - 0x34f8b, - 0x17830b, - 0x1c6408, - 0x5f89, - 0x18c58a, - 0x17598e, - 0x8f68d, - 0x1441e8b, - 0xdfaca, - 0xe184, - 0x5c846, - 0x160308, - 0x6c648, - 0x3fbc7, - 0xbb45, - 0x19447, - 0x80b89, - 0x1a0047, - 0x18b08, - 0x29009, - 0x4aec4, - 0x4fe45, - 0x16364e, - 0x6c2cd, - 0x5d88, - 0x54a6e4c6, - 0x55571a08, - 0x76248, - 0x13df10, - 0x5784c, - 0x65247, - 0x66287, - 0x6a407, - 0x70c47, - 0x37482, - 0x13be07, - 0x1c1f46, - 0x1624c, - 0x198c85, - 0x1cc607, - 0xa7906, - 0xa8549, - 0xaa8c8, - 0x373c2, + 0x216603, + 0x216103, + 0x253c46, + 0x20ff42, + 0x205402, + 0x225242, + 0x55a08683, + 0x55e2d603, + 0x54b86, + 0x54b86, + 0x242244, + 0x20ca43, + 0x14114d, + 0x8bd8a, + 0x1bc1cc, + 0x1b338c, + 0xca7cd, + 0x12eb85, + 0x8b50c, + 0x6bb47, + 0xbec6, + 0x15d08, + 0x1ae07, + 0x21ec8, + 0x19974a, + 0x10f087, + 0x56a8b745, + 0xdc1c9, + 0x56c344cb, + 0x920b, + 0x1846c8, + 0x14dd89, + 0x6828a, + 0xe56ce, + 0x7d4d, + 0x2c28d, + 0x143fe8b, + 0xdd74a, + 0xd944, + 0x58c86, + 0x1bd708, + 0x18a0c8, + 0x67607, + 0xa0c5, + 0xfdc7, + 0x330c9, + 0x16c307, + 0xe688, + 0x2b5c9, + 0x4a444, + 0x4d185, + 0x13fe4e, + 0x189d4d, + 0x114c8, + 0x57293106, + 0x57d72f88, + 0x74388, + 0x13b0d0, + 0x510cc, + 0x60fc7, + 0x62447, + 0x68607, + 0x71487, + 0x4c02, + 0x122587, + 0x1972cc, + 0xfe445, + 0x35147, + 0xa8946, + 0xaa289, + 0xac0c8, + 0x4742, 0x5c2, - 0x18bb06, - 0x1c4a0b, - 0x1c4d06, - 0x1091c4, - 0x45647, - 0xe4e09, - 0x504c9, - 0x17f8c8, - 0x4d442, - 0x191789, - 0xc548, - 0xed64a, - 0x6d06, - 0xcea89, - 0xdfa47, - 0xe0189, - 0xe22c8, - 0xe32c7, - 0xe4349, - 0xe9c45, - 0xe9fd0, - 0x178f46, - 0x45585, - 0x1667c7, - 0xebccd, - 0x409c5, - 0xf0bc6, - 0xf1407, - 0xf7dd8, - 0x1a03c8, - 0x10ba8a, - 0x16f82, - 0x56d4a, - 0x6ca4d, - 0x1bc2, - 0x5bac6, - 0x51488, - 0x49f88, - 0x6d8c9, - 0x115f88, - 0x7b54e, - 0x6db08, - 0x137987, - 0x55b08104, - 0x10ec4d, - 0x100185, - 0x109f48, - 0x1abcc8, - 0x10f346, - 0xd2c2, - 0x53844, - 0x33d86, - 0xec046, - 0xa842, + 0x18ce06, + 0x1ba00b, + 0x1ba306, + 0xbe384, + 0x1753c7, + 0xe3389, + 0x6dc89, + 0x1432c8, + 0x48902, + 0x191f89, + 0xbac8, + 0xe9a8a, + 0x38909, + 0x52946, + 0xce3c9, + 0xdd6c7, + 0xdde09, + 0xdef08, + 0xe0f87, + 0xe29c9, + 0xe8ec5, + 0xe9250, + 0x155886, + 0x175305, + 0x114587, + 0x3950d, + 0x3ef85, + 0xef1c6, + 0xef9c7, + 0xf61d8, + 0x11848, + 0xbe7ca, + 0xa982, + 0x507ca, + 0x6284d, + 0x2e42, + 0x13686, + 0x9d488, + 0xabe4a, + 0x45948, + 0x6d309, + 0x111788, + 0x7768e, + 0x6d548, + 0x14a647, + 0x58293044, + 0x14e70d, + 0x102f05, + 0x3148, + 0x42dc8, + 0x10c246, + 0x14302, + 0x92c04, + 0x62706, + 0x3e006, + 0x58532e4b, + 0x57c2, 0x401, - 0x5ed07, - 0x117c83, - 0x54ef8644, - 0x55296943, + 0x81, + 0x5a947, + 0x8d9c3, + 0x576f67c4, + 0x57a973c3, 0xc1, - 0x11746, + 0x1a286, 0xc1, 0x201, - 0x11746, - 0x117c83, - 0x418c3, - 0x9a544, - 0x147da45, - 0x52184, - 0x65387, - 0x2782, - 0x24ec04, - 0x22d7c3, - 0x251184, - 0x222884, - 0x206b43, - 0x221f05, - 0x214703, - 0x25b583, - 0x3da885, - 0x207b83, - 0xe583, - 0x56a2d7c3, - 0x233743, - 0x4183, - 0x220583, + 0x1a286, + 0x8d9c3, + 0x422c3, + 0x46e44, + 0x14947, + 0x5b07, + 0x153e145, + 0x4cec4, + 0x61107, + 0xc302, + 0x249f84, + 0x22c0c3, + 0x24b304, + 0x224e44, + 0x20a803, + 0x2244c5, + 0x216e03, + 0x236bc3, + 0x204185, + 0x205b03, + 0xdd43, + 0x5962c0c3, + 0x232c43, + 0x4b304, + 0x20c3, + 0x228b03, 0x200181, - 0x14903, - 0x205e03, - 0x3216c4, - 0x205184, - 0x206b43, - 0x23cf83, - 0x202003, - 0xa14c8, + 0xe403, + 0x211543, + 0x303f84, + 0x217b84, + 0x20a803, + 0x4bbc3, + 0x216603, + 0x20c603, + 0x9fe08, 0x2000c2, - 0x24ce83, - 0x202782, - 0x22d7c3, - 0x233743, - 0x228843, + 0x248343, + 0x20c302, + 0x22c0c3, + 0x232c43, + 0x212483, 0x2005c2, - 0x222884, - 0x219e43, - 0x205e03, - 0x206b43, - 0x2013c3, - 0x23cf83, - 0x207b83, - 0xa14c8, - 0x1213c7, - 0x2782, - 0x1a4d45, - 0x5798f, - 0xdac46, - 0x144b148, - 0x11630e, - 0x57a0f9c2, - 0x32bd88, - 0x310446, - 0x252306, - 0x30fdc7, - 0x57e01cc2, - 0x583d3308, - 0x21538a, - 0x264cc8, - 0x200b02, - 0x31f649, - 0x328847, - 0x2122c6, - 0x222289, - 0x30bdc4, - 0x20f186, - 0x2c5bc4, - 0x2072c4, - 0x25ab09, - 0x314786, - 0x22c345, - 0x2684c5, - 0x22df07, - 0x2c2ac7, - 0x28c3c4, - 0x310006, - 0x2f9045, - 0x218c85, - 0x27d245, - 0x2af587, - 0x26f285, - 0x24c349, - 0x3ccec5, - 0x347b44, - 0x266607, - 0x330b8e, - 0x360849, - 0x37ef89, - 0x335d46, - 0x23e788, - 0x24378b, - 0x367ecc, - 0x34d746, - 0x336c07, - 0x2b2a45, - 0x21744a, - 0x28db09, - 0x203489, - 0x3d5546, - 0x303405, - 0x247ac5, - 0x34a009, - 0x27d3cb, - 0x2e1886, - 0x350706, - 0x202c44, - 0x290746, - 0x2fc248, - 0x3b7506, - 0x357086, - 0x3c6d48, - 0x3d1907, - 0x3d5309, - 0x3d7485, - 0xa14c8, - 0x3cedc4, - 0x316e84, - 0x20b085, - 0x343e09, - 0x2214c7, - 0x2214cb, - 0x2245ca, - 0x2278c5, - 0x586022c2, - 0x2c6b47, - 0x58a27bc8, - 0x3d5787, - 0x2bdf05, - 0x35cd4a, - 0x2782, - 0x279acb, - 0x27f74a, - 0x24c7c6, - 0x22a2c3, - 0x36f7cd, - 0x3a864c, - 0x3b568d, - 0x231085, - 0x27a785, - 0x30ae87, - 0x3dac89, - 0x215286, - 0x257345, - 0x2eed48, - 0x290643, - 0x3011c8, - 0x290648, - 0x2c7d47, - 0x32af88, - 0x3a8449, - 0x2cbec7, - 0x2c6347, - 0x27d8c8, - 0x31ad44, - 0x31ad47, - 0x287a88, - 0x35e006, - 0x39990f, - 0x2e5007, - 0x358d86, - 0x36af45, - 0x224103, - 0x249d47, - 0x387183, - 0x24ff86, - 0x252086, - 0x252f86, - 0x294045, - 0x267e83, - 0x391408, - 0x388d49, - 0x39a54b, - 0x253108, - 0x2545c5, - 0x2563c5, - 0x58eb06c2, - 0x284f89, - 0x222907, - 0x25c785, - 0x25aa07, - 0x25c046, - 0x380bc5, - 0x25cb4b, - 0x25f044, - 0x264885, - 0x2649c7, - 0x277f46, - 0x278385, - 0x2874c7, - 0x287e07, - 0x2d2944, - 0x28cd0a, - 0x28ee48, - 0x243a49, - 0x368a85, - 0x2b2dc6, - 0x2fc40a, - 0x2683c6, - 0x22cd47, - 0x2c9b4d, - 0x2a5849, - 0x341d45, - 0x202d07, - 0x330f88, - 0x330508, - 0x21fa47, - 0x32e906, - 0x222c87, - 0x251b03, - 0x314704, - 0x37d145, - 0x3a9b07, - 0x3ae709, - 0x22ac48, - 0x22cc45, - 0x24b544, - 0x24cac5, - 0x2532cd, - 0x202082, - 0x2c1346, - 0x25ba06, - 0x2fe5ca, - 0x390dc6, - 0x397485, - 0x2c6085, - 0x2c6087, - 0x3a788c, - 0x2760ca, - 0x290406, - 0x2dbe05, - 0x290586, - 0x2908c7, - 0x292046, - 0x293f4c, - 0x2223c9, - 0x59211bc7, - 0x295f45, - 0x295f46, - 0x2963c8, - 0x2bca45, - 0x2a6545, - 0x2a6f08, - 0x2a710a, - 0x5967a482, - 0x59a08402, - 0x300945, - 0x281443, - 0x229d88, - 0x20b443, - 0x2a7384, - 0x2f99cb, - 0x3c72c8, - 0x2b1588, - 0x59fcc049, - 0x2abbc9, - 0x2ac306, - 0x2ad048, - 0x2ad249, - 0x2ae3c6, - 0x2ae545, - 0x24a8c6, - 0x2aed09, - 0x2ba987, - 0x34b786, - 0x21d087, - 0x3731c7, - 0x21f1c4, - 0x5a3a06c9, - 0x349708, - 0x3d3208, - 0x23fd07, - 0x2caf06, - 0x3c7789, - 0x2522c7, - 0x348f8a, - 0x369508, - 0x212c47, - 0x224f06, - 0x2ad5ca, - 0x231808, - 0x2e8745, - 0x2269c5, - 0x351147, - 0x31c689, - 0x3208cb, - 0x355d88, - 0x3ccf49, - 0x253a47, - 0x2bbd8c, - 0x2bc60c, - 0x2bc90a, - 0x2bcb8c, - 0x2c5748, - 0x2c5948, - 0x2c5b44, - 0x2c74c9, - 0x2c7709, - 0x2c794a, - 0x2c7bc9, - 0x2c7f07, - 0x3d5b4c, - 0x20ca46, - 0x2c9508, - 0x268486, - 0x3a3386, - 0x341c47, - 0x21fbc8, - 0x20f74b, - 0x3d5647, - 0x25a7c9, - 0x285189, - 0x355c07, - 0x2c5e04, - 0x2fa147, - 0x20a286, - 0x20ddc6, - 0x2fdf85, - 0x2cec48, - 0x294884, - 0x294886, - 0x275f8b, - 0x2ae009, - 0x250ac6, - 0x357289, - 0x20b146, - 0x204048, - 0x218983, - 0x303585, - 0x222a89, - 0x224805, - 0x37e504, - 0x277486, - 0x23c705, - 0x257bc6, - 0x31a607, - 0x346dc6, - 0x22bb0b, - 0x249887, - 0x2554c6, - 0x210046, - 0x22dfc6, - 0x28c389, - 0x2fa54a, - 0x2be6c5, - 0x3b518d, - 0x2a7206, - 0x38fac6, - 0x2cb806, - 0x2f7805, - 0x2ea2c7, - 0x22a587, - 0x273bce, - 0x205e03, - 0x2caec9, - 0x245009, - 0x22dc47, - 0x226247, - 0x237d85, - 0x210205, - 0x5a600c0f, - 0x2d2287, - 0x2d2448, - 0x2d3144, - 0x2d3586, - 0x5aa477c2, - 0x2d9b06, - 0x2dc3c6, - 0x2451ce, - 0x30100a, - 0x2b6546, - 0x21ba0a, - 0x3c2989, - 0x234045, - 0x305488, - 0x31d886, - 0x29d808, - 0x329788, - 0x27958b, - 0x30fec5, - 0x26f308, - 0x3c6e8c, - 0x2bddc7, - 0x252806, - 0x2e5888, - 0x20f408, - 0x5ae4fd42, - 0x20ef4b, - 0x3d7689, - 0x28d5c9, - 0x21b707, - 0x3c4f88, - 0x5b397048, - 0x20e7cb, - 0x37f749, - 0x25db4d, - 0x3295c8, - 0x2ad7c8, - 0x5b601642, - 0x3cbec4, - 0x5ba2ebc2, - 0x3b0a06, - 0x5be01102, - 0x2f500a, - 0x2ab406, - 0x238348, - 0x3be948, - 0x248ec6, - 0x337106, - 0x2fd1c6, - 0x2a6a45, - 0x23a1c4, - 0x5c238884, - 0x355586, - 0x296e47, - 0x5c60c687, - 0x26c08b, - 0x3d5989, - 0x27a7ca, - 0x206944, - 0x2c61c8, - 0x34b54d, - 0x2f5b89, - 0x2f5dc8, - 0x2f6049, - 0x2f7dc4, - 0x247344, - 0x25ebc5, - 0x36824b, - 0x3c7246, - 0x3553c5, - 0x2eb909, - 0x3100c8, - 0x238a04, - 0x2175c9, - 0x237605, - 0x2c2b08, - 0x2c6a07, - 0x37f388, - 0x284846, - 0x3d1ec7, - 0x2e1049, - 0x3cc909, - 0x3c7a85, - 0x36ff45, - 0x5ca12cc2, - 0x347904, - 0x217fc5, - 0x30fcc6, - 0x37a1c5, - 0x2edec7, - 0x299f85, - 0x277f84, - 0x335e06, - 0x2573c7, - 0x2ff786, - 0x321d85, - 0x210608, - 0x310645, - 0x214887, - 0x221109, - 0x2ae14a, - 0x22b147, - 0x22b14c, - 0x22c306, - 0x23ce09, - 0x37ff05, - 0x38ad48, - 0x209f43, - 0x20ab85, - 0x209f45, - 0x303b07, - 0x5ce03542, - 0x2f0187, - 0x2e7f46, - 0x3ce746, - 0x2eb246, - 0x20f346, - 0x2ddf88, - 0x31f2c5, - 0x358e47, - 0x358e4d, - 0x203843, - 0x20cf05, - 0x26fbc7, - 0x2f04c8, - 0x26f785, - 0x213e88, - 0x39c646, - 0x2df047, - 0x2c9445, - 0x30ff46, - 0x391985, - 0x21504a, - 0x2f9406, - 0x282187, - 0x31e445, - 0x3a6707, - 0x305d84, - 0x37e486, - 0x3053c5, - 0x216bcb, - 0x20a109, - 0x24df0a, - 0x3c7b08, - 0x348348, - 0x30d40c, - 0x30ef47, - 0x311dc8, - 0x313f88, - 0x314d05, - 0x350f0a, - 0x352a09, - 0x5d202702, - 0x3c0806, - 0x246dc4, - 0x246dc9, - 0x270a09, - 0x277987, - 0x2b4907, - 0x3562c9, - 0x2d1b88, - 0x2d1b8f, - 0x223686, - 0x2deb4b, - 0x2669c5, - 0x2669c7, - 0x374c49, - 0x217546, - 0x217547, - 0x2e3185, - 0x230f84, - 0x267586, - 0x221684, - 0x2b5287, - 0x2b3688, - 0x5d703308, - 0x304885, - 0x3049c7, - 0x32ac89, - 0x20ed04, - 0x240588, - 0x5da72b88, - 0x2d88c4, - 0x347e48, - 0x372644, - 0x3b5489, - 0x219f85, - 0x5de1be02, - 0x2236c5, - 0x2e38c5, - 0x202b48, - 0x234347, - 0x5e2008c2, - 0x2389c5, - 0x2d76c6, - 0x232e06, - 0x3478c8, - 0x34ab88, - 0x37a186, - 0x37ae06, - 0x321489, - 0x3ce686, - 0x2195cb, - 0x31f585, - 0x2a8046, - 0x2755c8, - 0x3333c6, - 0x39ec86, - 0x21434a, - 0x2abf8a, - 0x273305, - 0x30dcc7, - 0x2f33c6, - 0x5e606842, - 0x26fd07, - 0x25e345, - 0x2fc384, - 0x2fc385, - 0x206846, - 0x271847, - 0x21c9c5, - 0x21fc44, - 0x2d39c8, - 0x39ed45, - 0x3c9707, - 0x3d4145, - 0x214f85, - 0x2ae9c4, - 0x2e6ac9, - 0x2f8e88, - 0x23a946, - 0x3b7ec6, - 0x3cae86, - 0x5eb0f4c8, - 0x30f6c7, - 0x31174d, - 0x312c4c, - 0x313249, - 0x313489, - 0x5ef73c82, - 0x3d2fc3, - 0x20a343, - 0x20a345, - 0x3a9c0a, - 0x33fbc6, - 0x24e305, - 0x31af04, - 0x31af0b, - 0x3340cc, - 0x33534c, - 0x335655, - 0x337b4d, - 0x33964f, - 0x339a12, - 0x339e8f, - 0x33a252, - 0x33a6d3, - 0x33ab8d, - 0x33b14d, - 0x33b4ce, - 0x33ba4e, - 0x33c78c, - 0x33cb4c, - 0x33cf8b, - 0x33da0e, - 0x33e312, - 0x33f98c, - 0x33fe90, - 0x34ba52, - 0x34c6cc, - 0x34cd8d, - 0x34d0cc, - 0x34f611, - 0x35088d, - 0x352c4d, - 0x35324a, - 0x3534cc, - 0x3547cc, - 0x3550cc, - 0x35688c, - 0x35a253, - 0x35a8d0, - 0x35acd0, - 0x35b64d, - 0x35bc4c, - 0x35d6c9, - 0x35ef4d, - 0x35f293, - 0x361fd1, - 0x3627d3, - 0x363c8f, - 0x36404c, - 0x36434f, - 0x36470d, - 0x364d0f, - 0x3650d0, - 0x365b4e, - 0x369c8e, - 0x36b490, - 0x36bf4d, - 0x36c8ce, - 0x36cc4c, - 0x36dc13, - 0x37028e, - 0x370910, - 0x370d11, - 0x37114f, - 0x371513, - 0x37380d, - 0x373b4f, - 0x373f0e, - 0x374490, - 0x374889, - 0x3761d0, - 0x3767cf, - 0x376e4f, - 0x377212, - 0x37940e, - 0x379e0d, - 0x37a54d, - 0x37a88d, - 0x37b80d, - 0x37bb4d, - 0x37be90, - 0x37c28b, - 0x37cf0c, - 0x37d28c, - 0x37d88c, - 0x37db8e, - 0x38b4d0, - 0x38ddd2, - 0x38e24b, - 0x38e58e, - 0x38e90e, - 0x38f18e, - 0x38f60b, - 0x5f38fc56, - 0x390acd, - 0x390f54, - 0x391c4d, - 0x3939d5, - 0x39554d, - 0x395ecf, - 0x39654f, - 0x39a80f, - 0x39abce, - 0x39b14d, - 0x39cc91, - 0x3a2b4c, - 0x3a2e4c, - 0x3a314b, - 0x3a370c, - 0x3a3d8f, - 0x3a4152, - 0x3a480d, - 0x3a590c, - 0x3a68cc, - 0x3a6bcd, - 0x3a6f0f, - 0x3a72ce, - 0x3a98cc, - 0x3a9e8d, - 0x3aa1cb, - 0x3aaa8c, - 0x3ab38d, - 0x3ab6ce, - 0x3aba49, - 0x3ad093, - 0x3ad7cd, - 0x3adecd, - 0x3ae4cc, - 0x3ae94e, - 0x3af04f, - 0x3af40c, - 0x3af70d, - 0x3afa4f, - 0x3afe0c, - 0x3b0c4c, - 0x3b110c, - 0x3b140c, - 0x3b1acd, - 0x3b1e12, - 0x3b2b8c, - 0x3b2e8c, - 0x3b3191, - 0x3b35cf, - 0x3b398f, - 0x3b3d53, - 0x3b5e0e, - 0x3b618f, - 0x3b654c, - 0x5f7b688e, - 0x3b6c0f, - 0x3b6fd6, - 0x3b9f92, - 0x3bc7cc, - 0x3bd60f, - 0x3bdc8d, - 0x3c878f, - 0x3c8b4c, - 0x3c8e4d, - 0x3c918d, - 0x3caa4e, - 0x3cdecc, - 0x3d044c, - 0x3d0750, - 0x3d2351, - 0x3d278b, - 0x3d2bcc, - 0x3d2ece, - 0x3d4591, - 0x3d49ce, - 0x3d4d4d, - 0x3d894b, - 0x3d924f, - 0x3d9e54, - 0x2068c2, - 0x2068c2, - 0x202e03, - 0x2068c2, - 0x202e03, - 0x2068c2, - 0x20c682, - 0x24a905, - 0x3d428c, - 0x2068c2, - 0x2068c2, - 0x20c682, - 0x2068c2, - 0x296a45, - 0x2ae145, - 0x2068c2, - 0x2068c2, - 0x2010c2, - 0x296a45, - 0x338309, - 0x361ccc, - 0x2068c2, - 0x2068c2, - 0x2068c2, - 0x2068c2, - 0x24a905, - 0x2068c2, - 0x2068c2, - 0x2068c2, - 0x2068c2, - 0x2010c2, - 0x338309, - 0x2068c2, - 0x2068c2, - 0x2068c2, - 0x2ae145, - 0x2068c2, - 0x2ae145, - 0x361ccc, - 0x3d428c, - 0x24ce83, - 0x22d7c3, - 0x233743, - 0x220583, - 0x222884, - 0x206b43, - 0x23cf83, - 0x60314887, - 0x1c618f, - 0x24c8, - 0x7b684, - 0x13c3, - 0x1a20c8, - 0x7c44, + 0x224e44, + 0x214543, + 0x211543, + 0x20a803, + 0x20ca43, + 0x216603, + 0x205b03, + 0x17c204, + 0x9fe08, + 0x103c87, + 0xc302, + 0x1a0dc5, + 0x5120f, + 0xd23c6, + 0x14470c8, + 0x11240e, + 0x5a631802, + 0x32ce48, + 0x28c4c6, + 0x24d046, + 0x30e787, + 0x5aa00c82, + 0x5afd1e88, + 0x21068a, + 0x260a48, + 0x200ac2, + 0x3c0409, + 0x251a87, + 0x213e86, + 0x224849, + 0x2db544, + 0x3c0306, + 0x2c7144, + 0x203584, + 0x2560c9, + 0x30f546, + 0x229cc5, + 0x264f45, + 0x22cac7, + 0x2c3887, + 0x2f53c4, + 0x35c0c6, + 0x2f9145, + 0x20e805, + 0x246745, + 0x2c4f47, + 0x26fb45, + 0x247749, + 0x329945, + 0x31b604, + 0x256907, + 0x33ed4e, + 0x343689, + 0x28e2c9, + 0x33de06, + 0x23ce88, + 0x3c208b, + 0x36828c, + 0x324046, + 0x2ffe07, + 0x2b34c5, + 0x21730a, + 0x28c109, + 0x2013c9, + 0x3d9f06, + 0x305d45, + 0x242885, + 0x355449, + 0x2468cb, + 0x2772c6, + 0x354546, + 0x204b44, + 0x239b06, + 0x2fbbc8, + 0x3bc0c6, + 0x2eb006, + 0x3cf9c8, + 0x3d6e47, + 0x3d9cc9, + 0x3de005, + 0x9fe08, + 0x3cc184, + 0x312f84, + 0x208345, + 0x346b09, + 0x222c07, + 0x222c0b, + 0x225a4a, + 0x2290c5, + 0x5b20b382, + 0x20ebc7, + 0x5b6293c8, + 0x328887, + 0x2dd185, + 0x347e8a, + 0xc302, + 0x2795cb, + 0x27deca, + 0x247bc6, + 0x2081c3, + 0x291f0d, + 0x3c084c, + 0x3c1acd, + 0x2304c5, + 0x27cb85, + 0x3748c7, + 0x207909, + 0x210586, + 0x252e05, + 0x2ec888, + 0x239a03, + 0x2e2ec8, + 0x239a08, + 0x2c8907, + 0x369588, + 0x3afa49, + 0x2fb787, + 0x20f1c7, + 0x33dfc8, + 0x29b484, + 0x29b487, + 0x314748, + 0x360586, + 0x3c3e4f, + 0x22a5c7, + 0x35bbc6, + 0x388005, + 0x2253c3, + 0x243c47, + 0x3874c3, + 0x24a686, + 0x24cdc6, + 0x24db06, + 0x294d45, + 0x264203, + 0x391c08, + 0x38a8c9, + 0x39a24b, + 0x24dc88, + 0x24ec05, + 0x24fe45, + 0x5bab12c2, + 0x285709, + 0x224ec7, + 0x258bc5, + 0x255fc7, + 0x257a86, + 0x3804c5, + 0x258f8b, + 0x25ad04, + 0x260605, + 0x260747, + 0x276c46, + 0x277085, + 0x2851c7, + 0x285cc7, + 0x2d0d84, + 0x28b30a, + 0x28cd48, + 0x3c2349, + 0x394785, + 0x32f406, + 0x2fbd8a, + 0x264e46, + 0x231047, + 0x26c88d, + 0x2a65c9, + 0x390885, + 0x36ac47, + 0x252788, + 0x2f7288, + 0x3a8d07, + 0x3affc6, + 0x2230c7, + 0x24b503, + 0x30f4c4, + 0x37dc05, + 0x3a5447, + 0x3ab0c9, + 0x26b7c8, + 0x230f45, + 0x2530c4, + 0x24de45, + 0x25ca8d, + 0x200cc2, + 0x2b6606, + 0x2d7a86, + 0x301bca, + 0x3915c6, + 0x398245, + 0x2c7605, + 0x2c7607, + 0x3a340c, + 0x27420a, + 0x290206, + 0x21fb05, + 0x239946, + 0x290387, + 0x292d06, + 0x294c4c, + 0x224989, + 0x5be1a707, + 0x296a05, + 0x296a06, + 0x296e48, + 0x245785, + 0x2a6d05, + 0x2a7f48, + 0x2a814a, + 0x5c21efc2, + 0x5c606a02, + 0x3ac085, + 0x266803, + 0x23dc88, + 0x245f43, + 0x2a83c4, + 0x245f4b, + 0x368688, + 0x2b2788, + 0x5cae7489, + 0x2ad149, + 0x2adb06, + 0x2ae7c8, + 0x2ae9c9, + 0x2af346, + 0x2af4c5, + 0x244246, + 0x2afa09, + 0x2bf9c7, + 0x3ddac6, + 0x2dd507, + 0x2e77c7, + 0x208804, + 0x5ce11b49, + 0x3b9748, + 0x3d1d88, + 0x267747, + 0x2cb246, + 0x3c6b89, + 0x24d007, + 0x3b8fca, + 0x32f548, + 0x3bd087, + 0x3c1086, + 0x27d88a, + 0x241b88, + 0x2d7505, + 0x228345, + 0x3359c7, + 0x316049, + 0x31828b, + 0x354048, + 0x3299c9, + 0x24e087, + 0x2bae4c, + 0x2bb8cc, + 0x2bbbca, + 0x2bbe4c, + 0x2c6cc8, + 0x2c6ec8, + 0x2c70c4, + 0x2c8089, + 0x2c82c9, + 0x2c850a, + 0x2c8789, + 0x2c8ac7, + 0x3b4f4c, + 0x3c62c6, + 0x26c248, + 0x264f06, + 0x38ebc6, + 0x390787, + 0x39f348, + 0x32a68b, + 0x3da007, + 0x255d89, + 0x25a709, + 0x285907, + 0x2c7384, + 0x200fc7, + 0x2cfec6, + 0x20c7c6, + 0x215705, + 0x2ce588, + 0x340544, + 0x340546, + 0x2740cb, + 0x2c6909, + 0x31fc86, + 0x2eb209, + 0x208406, + 0x201f88, + 0x20e503, + 0x305ec5, + 0x21b649, + 0x21bec5, + 0x380d84, + 0x2755c6, + 0x2354c5, + 0x207f06, + 0x316887, + 0x34b4c6, + 0x22ab4b, + 0x28efc7, + 0x243946, + 0x272506, + 0x22cb86, + 0x2f5389, + 0x2b884a, + 0x2f9d45, + 0x22850d, + 0x2a8246, + 0x23aec6, + 0x2e1546, + 0x214745, + 0x2e9547, + 0x26b107, + 0x272c8e, + 0x211543, + 0x2cb209, + 0x374d89, + 0x22c807, + 0x269887, + 0x292905, + 0x36b7c5, + 0x5d34464f, + 0x2d18c7, + 0x2d1a88, + 0x2d1fc4, + 0x2d2286, + 0x5d642582, + 0x2d6d46, + 0x2d9bc6, + 0x374f4e, + 0x2e2d0a, + 0x3d2606, + 0x219b8a, + 0x3c18c9, + 0x23bd85, + 0x307b08, + 0x335886, + 0x2b1388, + 0x3dbd48, + 0x27b58b, + 0x30e885, + 0x26fbc8, + 0x3cfb0c, + 0x2dd047, + 0x24d386, + 0x3dd0c8, + 0x32a348, + 0x5da39242, + 0x208ccb, + 0x3de209, + 0x28bbc9, + 0x21b4c7, + 0x3ba588, + 0x5de07748, + 0x20df8b, + 0x343149, + 0x259e4d, + 0x31d7c8, + 0x27da88, + 0x5e201e02, + 0x3c75c4, + 0x5e62d7c2, + 0x3aba86, + 0x5ea06302, + 0x2f258a, + 0x2a6b86, + 0x26a908, + 0x3be5c8, + 0x3c0206, + 0x300306, + 0x2fc946, + 0x2a7205, + 0x237dc4, + 0x5efd3204, + 0x359686, + 0x2978c7, + 0x5f20bc07, + 0x389b0b, + 0x328a89, + 0x27cbca, + 0x220504, + 0x2c7748, + 0x3dd88d, + 0x2f3a89, + 0x2f3cc8, + 0x2f3f49, + 0x2f61c4, + 0x23d504, + 0x39ba85, + 0x275f4b, + 0x368606, + 0x3594c5, + 0x3cb449, + 0x35c188, + 0x2a4984, + 0x217489, + 0x306845, + 0x2c38c8, + 0x20f887, + 0x28e6c8, + 0x282546, + 0x3a8a07, + 0x2deac9, + 0x3ba8c9, + 0x213845, + 0x322ac5, + 0x5f61df02, + 0x31b3c4, + 0x230705, + 0x30e686, + 0x33cf45, + 0x2b7d87, + 0x2f2ec5, + 0x276c84, + 0x33dec6, + 0x252e87, + 0x251f86, + 0x3ac605, + 0x2098c8, + 0x28c6c5, + 0x20e387, + 0x21d889, + 0x2c6a4a, + 0x227cc7, + 0x227ccc, + 0x229c86, + 0x241d49, + 0x38c685, + 0x2456c8, + 0x202e43, + 0x2edb05, + 0x3a94c5, + 0x27c1c7, + 0x5fa01482, + 0x2ee787, + 0x2e8746, + 0x37fcc6, + 0x2ecbc6, + 0x32a286, + 0x239188, + 0x27abc5, + 0x35bc87, + 0x35bc8d, + 0x201783, + 0x3c6785, + 0x270487, + 0x2eeac8, + 0x270045, + 0x216348, + 0x37d686, + 0x2dc387, + 0x2c9c05, + 0x30e906, + 0x392185, + 0x21034a, + 0x303406, + 0x26ef47, + 0x2c2fc5, + 0x308407, + 0x30ed04, + 0x380d06, + 0x307a45, + 0x397c4b, + 0x2cfd49, + 0x25888a, + 0x2138c8, + 0x38d108, + 0x30bd0c, + 0x30c747, + 0x30fac8, + 0x316608, + 0x3186c5, + 0x3562ca, + 0x358249, + 0x5fe03a42, + 0x206146, + 0x25c1c4, + 0x2f0e09, + 0x25b589, + 0x2712c7, + 0x31d0c7, + 0x367309, + 0x2b8288, + 0x2b828f, + 0x223ac6, + 0x2dbe8b, + 0x259485, + 0x259487, + 0x36c889, + 0x210086, + 0x217407, + 0x2dfe05, + 0x2303c4, + 0x35b606, + 0x222dc4, + 0x2f1347, + 0x321988, + 0x60305c48, + 0x306cc5, + 0x306e07, + 0x324a09, + 0x208a84, + 0x23eb48, + 0x607c2e88, + 0x2d3384, + 0x2ebdc8, + 0x369b44, + 0x34b6c9, + 0x214685, + 0x60a19f82, + 0x223b05, + 0x2e8045, + 0x36aa88, + 0x233887, + 0x60e008c2, + 0x3d3345, + 0x2d4706, + 0x23e306, + 0x31b388, + 0x3192c8, + 0x33cf06, + 0x34aa46, + 0x303d49, + 0x37fc06, + 0x20ff4b, + 0x32a105, + 0x2a9506, + 0x2f8548, + 0x34df46, + 0x313ec6, + 0x216a4a, + 0x2d64ca, + 0x24fb45, + 0x307487, + 0x2fb286, + 0x61217042, + 0x2705c7, + 0x2ff1c5, + 0x2fbd04, + 0x2fbd05, + 0x220406, + 0x272087, + 0x21c385, + 0x25b644, + 0x2e0cc8, + 0x313f85, + 0x3c8647, + 0x3d43c5, + 0x210285, + 0x2c4e84, + 0x2e3cc9, + 0x2f8f88, + 0x238546, + 0x2e9c46, + 0x27d5c6, + 0x6170c3c8, + 0x30c5c7, + 0x30c90d, + 0x30cecc, + 0x30d4c9, + 0x30d709, + 0x61b75ac2, + 0x3d1b43, + 0x2010c3, + 0x2cff85, + 0x3a554a, + 0x33cdc6, + 0x23fd45, + 0x317944, + 0x31794b, + 0x33280c, + 0x33310c, + 0x333415, + 0x3342cd, + 0x336e4f, + 0x337212, + 0x33768f, + 0x337a52, + 0x337ed3, + 0x33838d, + 0x33894d, + 0x338cce, + 0x33924e, + 0x33994c, + 0x339d0c, + 0x33a14b, + 0x33abce, + 0x33b4d2, + 0x33cb8c, + 0x33d2d0, + 0x34fdd2, + 0x350c0c, + 0x3512cd, + 0x35160c, + 0x3536d1, + 0x3546cd, + 0x356f0d, + 0x35750a, + 0x35778c, + 0x358c4c, + 0x3591cc, + 0x359d4c, + 0x35d4d3, + 0x35db50, + 0x35df50, + 0x35e8cd, + 0x35eecc, + 0x35fc49, + 0x3618cd, + 0x361c13, + 0x363251, + 0x363a53, + 0x36474f, + 0x364b0c, + 0x364e0f, + 0x3651cd, + 0x3657cf, + 0x365b90, + 0x36660e, + 0x36b18e, + 0x36cad0, + 0x36da4d, + 0x36e3ce, + 0x36e74c, + 0x36fa13, + 0x37180e, + 0x371e90, + 0x372291, + 0x3726cf, + 0x372a93, + 0x37564d, + 0x37598f, + 0x375d4e, + 0x3762d0, + 0x3766c9, + 0x378490, + 0x378a8f, + 0x37910f, + 0x3794d2, + 0x379c8e, + 0x37a68d, + 0x37b00d, + 0x37b34d, + 0x37c70d, + 0x37ca4d, + 0x37cd90, + 0x37d18b, + 0x37d9cc, + 0x37dd4c, + 0x37e34c, + 0x37e64e, + 0x38c7d0, + 0x38e512, + 0x38e98b, + 0x38f4ce, + 0x38f84e, + 0x3900ce, + 0x39054b, + 0x61f909d6, + 0x3912cd, + 0x391754, + 0x39244d, + 0x393ad5, + 0x39578d, + 0x39610f, + 0x3968cf, + 0x39a50f, + 0x39a8ce, + 0x39ae4d, + 0x39ca11, + 0x39eb0c, + 0x39ee0c, + 0x39f10b, + 0x39f54c, + 0x39fbcf, + 0x39ff92, + 0x3a088d, + 0x3a198c, + 0x3a244c, + 0x3a274d, + 0x3a2a8f, + 0x3a2e4e, + 0x3a520c, + 0x3a57cd, + 0x3a5b0b, + 0x3a63cc, + 0x3a6ccd, + 0x3a700e, + 0x3a7389, + 0x3a83d3, + 0x3aa18d, + 0x3aa88d, + 0x3aae8c, + 0x3ab30e, + 0x3ac78f, + 0x3acb4c, + 0x3ace4d, + 0x3ad18f, + 0x3ad54c, + 0x3ae3cc, + 0x3ae88c, + 0x3aeb8c, + 0x3af24d, + 0x3af592, + 0x3b164c, + 0x3b194c, + 0x3b1c51, + 0x3b208f, + 0x3b244f, + 0x3b2813, + 0x3b374e, + 0x3b3acf, + 0x3b3e8c, + 0x623b41ce, + 0x3b454f, + 0x3b4916, + 0x3b5452, + 0x3b7d4c, + 0x3bb14f, + 0x3bb7cd, + 0x3c76cf, + 0x3c7a8c, + 0x3c7d8d, + 0x3c80cd, + 0x3c988e, + 0x3ca3cc, + 0x3cd64c, + 0x3cd950, + 0x3d0ed1, + 0x3d130b, + 0x3d174c, + 0x3d1a4e, + 0x3d4811, + 0x3d4c4e, + 0x3d4fcd, + 0x3d854b, + 0x3d8e4f, + 0x3d9814, + 0x220482, + 0x220482, + 0x227dc3, + 0x220482, + 0x227dc3, + 0x220482, + 0x204142, + 0x244285, + 0x3d450c, + 0x220482, + 0x220482, + 0x204142, + 0x220482, + 0x2974c5, + 0x2c6a45, + 0x220482, + 0x220482, + 0x208342, + 0x2974c5, + 0x334a89, + 0x362f4c, + 0x220482, + 0x220482, + 0x220482, + 0x220482, + 0x244285, + 0x220482, + 0x220482, + 0x220482, + 0x220482, + 0x208342, + 0x334a89, + 0x220482, + 0x220482, + 0x220482, + 0x2c6a45, + 0x220482, + 0x2c6a45, + 0x362f4c, + 0x3d450c, + 0x248343, + 0x22c0c3, + 0x232c43, + 0x228b03, + 0x224e44, + 0x20a803, + 0x216603, + 0x62f0f647, + 0x1ce4cf, + 0x144208, + 0x6704, + 0xca43, + 0xcd248, + 0x5bc4, 0x2000c2, - 0x60a02782, - 0x23fec3, - 0x250604, - 0x204183, - 0x3dc504, - 0x22fac6, - 0x20ad83, - 0x30e184, - 0x24d985, - 0x205e03, - 0x206b43, - 0x6df83, - 0x23cf83, - 0x21d60a, - 0x259b06, - 0x38ec8c, - 0xa14c8, - 0x202782, - 0x22d7c3, - 0x233743, - 0x220583, - 0x22a243, - 0x2dc3c6, - 0x206b43, - 0x23cf83, - 0x213c43, - 0x2fe03, - 0xa7c88, - 0x6157eac5, - 0x4b8c7, - 0x12dac5, - 0x178449, - 0xdcc2, - 0x6237e2c5, - 0x12dac5, - 0x2afc7, - 0x6da08, - 0x820e, - 0x8abd2, - 0x11f94b, - 0x1143c6, - 0x6268d145, - 0x62a8d14c, - 0x5e4c7, - 0x14c47, - 0x1a0eca, - 0x3b650, - 0x173345, - 0x10cd0b, - 0x6c648, - 0x3fbc7, - 0x19ee0b, - 0x80b89, - 0x4aac7, - 0x1a0047, - 0xe1ac7, - 0x35186, - 0x18b08, - 0x63029f46, - 0x49ec7, - 0x15c646, - 0x6c2cd, - 0x1a0890, - 0x634758c2, - 0x5d88, - 0x3c010, - 0x1818cc, - 0x63b89fcd, - 0x5d348, - 0x5d7cb, - 0x6ad07, - 0x16a549, - 0x59706, - 0x965c8, - 0x7102, - 0x8898a, - 0xde307, - 0x1cc607, - 0xa8549, - 0xaa8c8, - 0x1b8e85, - 0x18bb06, - 0x1c4d06, - 0xf6cce, - 0x23b4e, - 0xa9f4f, - 0xe4e09, - 0x504c9, - 0x8850b, - 0xa224f, - 0xc334c, - 0xbb64b, - 0xe0ac8, - 0x144707, - 0x166308, - 0x18da0b, - 0x194d8c, - 0x19bd4c, - 0x1a3a8c, - 0xafccd, - 0x17f8c8, - 0xefdc2, - 0x191789, - 0xf9708, - 0x1921cb, - 0xcb106, - 0xd6f8b, - 0x13de4b, - 0xe28ca, - 0xe3485, - 0xe9fd0, - 0xec646, - 0x12e406, - 0x45585, - 0x1667c7, - 0xfd6c8, - 0xf1407, - 0xf16c7, - 0x1c6647, - 0x1b084a, - 0xa134a, - 0x5bac6, - 0x94ecd, - 0x49f88, - 0x115f88, - 0xae909, - 0xbacc5, - 0x1aed4c, - 0xafecb, - 0x10d704, - 0x10f109, - 0x10f346, - 0x159546, - 0x1b4886, - 0x7d82, - 0xec046, - 0x10b9cb, - 0x11d447, - 0xa842, - 0xcd9c5, - 0x26c44, + 0x6360c302, + 0x23e483, + 0x259844, + 0x2020c3, + 0x2d3b84, + 0x22f446, + 0x20b8c3, + 0x30b0c4, + 0x398685, + 0x211543, + 0x20a803, + 0x6d9c3, + 0x216603, + 0x21de8a, + 0x253c46, + 0x38fbcc, + 0x9fe08, + 0x20c302, + 0x22c0c3, + 0x232c43, + 0x228b03, + 0x238cc3, + 0x2d9bc6, + 0x20a803, + 0x216603, + 0x216103, + 0x2f783, + 0xa9148, + 0x641c6005, + 0x453c7, + 0x12eb85, + 0x9349, + 0xc6c2, + 0x1b5fca, + 0x64f9e785, + 0x12eb85, + 0x6bb47, + 0x6d448, + 0x680e, + 0x894d2, + 0x173e0b, + 0x10f186, + 0x6528b745, + 0x6568b74c, + 0x8ec47, + 0x176c87, + 0x12650a, + 0x3a210, + 0xe7945, + 0x10a7cb, + 0x18a0c8, + 0x67607, + 0x11404b, + 0x330c9, + 0x44447, + 0x16c307, + 0x77507, + 0x346c6, + 0xe688, + 0x65c39346, + 0x45887, + 0x147786, + 0x189d4d, + 0xc78d0, + 0x66009802, + 0x114c8, + 0x67fd0, + 0x181a8c, + 0x6678b84d, + 0x59648, + 0x59acb, + 0x68e47, + 0x6e149, + 0x54c46, + 0x97048, + 0x33c2, + 0x198c0a, + 0x1cb807, + 0x35147, + 0xaa289, + 0xac0c8, + 0x20005, + 0x18ce06, + 0x1ba306, + 0x100d4e, + 0x240ce, + 0x14f5cf, + 0xe3389, + 0x6dc89, + 0x19878b, + 0xa318f, + 0x15090c, + 0xc010b, + 0xd8fc8, + 0x116e87, + 0x15f548, + 0x18e14b, + 0x194fcc, + 0x19bd8c, + 0x19f8cc, + 0xb08cd, + 0x1432c8, + 0xf10c2, + 0x191f89, + 0x45c88, + 0x19e10b, + 0xcb446, + 0xd408b, + 0x13b00b, + 0xdf54a, + 0xe1145, + 0xe9250, + 0xeba46, + 0x52286, + 0x175305, + 0x114587, + 0xd6fc8, + 0xef9c7, + 0xefc87, + 0x184907, + 0xc10c6, + 0x1ab8ca, + 0x9fc8a, + 0x13686, + 0xad44d, + 0x45948, + 0x111788, + 0x112009, + 0xb9545, + 0x1a214c, + 0xb0acb, + 0x1cab84, + 0x10c009, + 0x10c246, + 0x4a506, + 0x1bff46, + 0x5402, + 0x3e006, + 0xbe70b, + 0x118547, + 0x57c2, + 0xccc85, + 0x63444, 0x101, - 0x568c3, - 0x62e81606, - 0x96943, + 0x50343, + 0x65a669c6, + 0x973c3, 0x382, - 0x29144, - 0xb02, - 0x41844, + 0x2b704, + 0xac2, + 0x42244, 0x882, - 0x2202, - 0x2c42, - 0x25a42, - 0x5cc2, - 0x8d142, - 0x14c2, - 0xd5e42, - 0x36d82, - 0x37982, - 0x2942, - 0x52282, - 0x33743, + 0x4c82, + 0x19c2, + 0x27682, + 0x4042, + 0x8b742, + 0xd42, + 0x8cac2, + 0x36182, + 0x59dc2, + 0x81c2, + 0x4cfc2, + 0x32c43, 0x942, - 0x1242, - 0x19d02, - 0xe282, + 0x1bc2, + 0xc202, + 0x3d42, 0x642, - 0x320c2, - 0x373c2, - 0x3d82, - 0x5e42, + 0x30ac2, + 0x4742, + 0x1cc2, + 0xf42, 0x5c2, - 0x19e43, - 0x1b82, - 0x6102, - 0x4d442, - 0x53a42, - 0xb42, - 0x8002, - 0xf1c2, - 0xdf302, - 0x24c2, - 0x1582, - 0x6cec2, - 0x45ec2, - 0x6b43, + 0x14543, + 0x1742, + 0x2cc2, + 0x48902, + 0x4e082, + 0x3102, + 0x5f82, + 0x17002, + 0x1fc02, + 0x6a42, + 0x140d82, + 0x6bf42, + 0x9082, + 0xa803, 0x602, - 0x4fd42, - 0x13c2, - 0xcc82, - 0x1c7a05, - 0x6a82, - 0x41f42, - 0x3c883, + 0x39242, + 0x2f42, + 0x23242, + 0x137c5, + 0x8242, + 0x20082, + 0x3b1c3, 0x682, - 0x16f82, - 0x1bc2, - 0x37c2, - 0x3842, + 0xa982, + 0x2e42, + 0x1702, + 0x1782, 0x8c2, - 0xd2c2, - 0x7d82, - 0x5f85, - 0x63e0c682, - 0x642cfe83, - 0x20c3, - 0x6460c682, - 0x20c3, - 0x83cc7, - 0x20c443, + 0x14302, + 0x5402, + 0x7d45, + 0x66a04142, + 0x66f6d603, + 0x13583, + 0x67204142, + 0x13583, + 0x819c7, + 0x209e83, 0x2000c2, - 0x22d7c3, - 0x233743, - 0x228843, + 0x22c0c3, + 0x232c43, + 0x212483, 0x2005c3, - 0x22a243, - 0x206b43, - 0x2013c3, - 0x23cf83, - 0x296983, - 0xfc105, - 0x1083, - 0xa14c8, - 0x22d7c3, - 0x233743, - 0x228843, - 0x205e03, - 0x206b43, - 0x2013c3, - 0x6df83, - 0x23cf83, - 0x22d7c3, - 0x233743, - 0x23cf83, - 0x22d7c3, - 0x233743, - 0x220583, + 0x238cc3, + 0x20a803, + 0x20ca43, + 0x216603, + 0x297403, + 0xfba85, + 0x8303, + 0x9fe08, + 0x22c0c3, + 0x232c43, + 0x212483, + 0x211543, + 0x20a803, + 0x20ca43, + 0x6d9c3, + 0x216603, + 0x22c0c3, + 0x232c43, + 0x216603, + 0x22c0c3, + 0x232c43, + 0x228b03, 0x200181, - 0x205e03, - 0x206b43, - 0x251ac3, - 0x23cf83, - 0x10c9c4, - 0x24ce83, - 0x22d7c3, - 0x233743, - 0x205d83, - 0x228843, - 0x251383, - 0x22f503, - 0x2ab3c3, - 0x249743, - 0x220583, - 0x222884, - 0x206b43, - 0x23cf83, - 0x207b83, - 0x201844, - 0x2534c3, - 0xa683, - 0x3c38c3, - 0x32a148, - 0x2ad604, + 0x211543, + 0x20a803, + 0x24bbc3, + 0x216603, + 0xbef44, + 0x248343, + 0x22c0c3, + 0x232c43, + 0x20d083, + 0x212483, + 0x35c6c3, + 0x2042c3, + 0x2a6b43, + 0x20edc3, + 0x228b03, + 0x224e44, + 0x20a803, + 0x216603, + 0x205b03, + 0x345344, + 0x25cc83, + 0x25843, + 0x2287c3, + 0x32b808, + 0x27d8c4, 0x20020a, - 0x250846, - 0x12aa84, - 0x383407, - 0x21dd8a, - 0x223549, - 0x3ad507, - 0x3b41ca, - 0x24ce83, - 0x3009cb, - 0x2d5809, - 0x2d86c5, - 0x3b0f47, - 0x2782, - 0x22d7c3, - 0x237987, - 0x2e5505, - 0x2c5cc9, - 0x233743, - 0x308386, - 0x2c5103, - 0xa1c3, - 0x119746, - 0x10b206, - 0xad07, - 0x221986, - 0x225a85, - 0x3d7547, - 0x316747, - 0x67220583, - 0x34c907, - 0x3b4983, - 0x20be85, - 0x222884, - 0x26ef88, - 0x379b0c, - 0x2b12c5, - 0x2a59c6, - 0x237847, - 0x20a647, - 0x2660c7, - 0x270048, - 0x31868f, - 0x223785, - 0x23ffc7, - 0x20d547, - 0x2a74ca, - 0x2eeb89, - 0x322805, - 0x32484a, - 0x130246, - 0xbb147, - 0x2c5185, - 0x38e484, - 0x248e06, - 0xbdfc6, - 0x381b47, - 0x2efcc7, - 0x3dae88, - 0x21a205, - 0x2e5406, - 0x25388, - 0x357005, - 0x1571c6, - 0x23bd85, - 0x28ca84, - 0x2376c7, - 0x2dddca, - 0x255988, - 0x361386, - 0x2a243, - 0x2e43c5, - 0x3291c6, - 0x3d5d86, - 0x245486, - 0x205e03, - 0x3a4a87, - 0x20d4c5, - 0x206b43, - 0x2e2b8d, - 0x2013c3, - 0x3daf88, - 0x219344, - 0x278245, - 0x2a73c6, - 0x394206, - 0x2a7f47, - 0x25da07, - 0x283385, - 0x23cf83, - 0x2e9987, - 0x344809, - 0x36a6c9, - 0x32e64a, - 0x2434c2, - 0x20be44, - 0x2ecbc4, - 0x2efb87, - 0x2f0048, - 0x2f24c9, - 0x20cdc9, - 0x2f3a07, - 0xffc09, - 0x3720c6, - 0xf6a46, - 0x2f7dc4, - 0x2f83ca, - 0x2fb488, - 0x2fd089, - 0x3ac386, - 0x2b5e85, - 0x255848, - 0x2cc48a, - 0x210f43, - 0x2019c6, - 0x2f3b07, - 0x357785, - 0x390485, - 0x239703, - 0x23d804, - 0x226985, - 0x287f07, - 0x2f8fc5, - 0x2eea46, - 0x13c285, - 0x28a243, - 0x2b6609, - 0x27800c, - 0x2b9f4c, - 0x2d6d88, - 0x2a4b47, - 0x306148, - 0x106787, - 0x306fca, - 0x30768b, - 0x2d5948, - 0x394308, - 0x239106, - 0x3cad45, - 0x30a10a, - 0x2cfec5, - 0x21be02, - 0x2c9307, - 0x251646, - 0x375145, - 0x30de89, - 0x206145, - 0x31fec5, - 0x2752c9, - 0x329106, - 0x3ba5c8, - 0x26a183, - 0x209046, - 0x2773c6, - 0x31c485, - 0x31c489, - 0x2f2c09, - 0x27e387, - 0x11d2c4, - 0x31d2c7, - 0x20ccc9, - 0x21df85, - 0x3a2c8, - 0x340ec5, - 0x274b05, - 0x377a09, - 0x2020c2, - 0x2e4884, - 0x203f42, - 0x201b82, - 0x38c145, - 0x32a808, - 0x2bac05, - 0x2c80c3, - 0x2c80c5, - 0x2d9d03, - 0x209002, - 0x302284, - 0x2b69c3, - 0x201002, - 0x3cb604, - 0x2ed143, - 0x204f02, - 0x2bac83, - 0x303a84, - 0x2fd643, - 0x25cfc4, - 0x209482, - 0x213b43, - 0x21bb03, - 0x203002, - 0x308102, - 0x2f2a49, - 0x219082, - 0x28ba04, - 0x202242, - 0x2556c4, - 0x372084, - 0x206f04, - 0x207d82, - 0x238d42, - 0x36ad83, - 0x307443, - 0x237b44, - 0x248804, - 0x2ba344, - 0x2d1544, - 0x2fb643, - 0x2446c3, - 0x3301c4, - 0x31fdc4, - 0x3203c6, - 0x22c202, - 0x2782, - 0x409c3, - 0x202782, - 0x233743, - 0x220583, - 0x206b43, - 0x23cf83, + 0x31fa06, + 0x124804, + 0x38ad87, + 0x22090a, + 0x223989, + 0x3b2c87, + 0x3b588a, + 0x248343, + 0x3ac10b, + 0x3c28c9, + 0x2d3185, + 0x3ae6c7, + 0xc302, + 0x22c0c3, + 0x3c3187, + 0x26a3c5, + 0x2c7249, + 0x232c43, + 0x2bd546, + 0x2c5d83, + 0xcfe03, + 0x115f06, + 0x13f146, + 0xb847, + 0x21e686, + 0x2276c5, + 0x3de0c7, + 0x312847, + 0x69e28b03, + 0x350e47, + 0x3c0043, + 0x20a405, + 0x224e44, + 0x26f848, + 0x37a38c, + 0x2b2045, + 0x2a6746, + 0x3c3047, + 0x3a9ac7, + 0x243a87, + 0x24fc48, + 0x314f4f, + 0x223bc5, + 0x23e587, + 0x205147, + 0x2a850a, + 0x2ec6c9, + 0x31e445, + 0x320fca, + 0xbc7c6, + 0xb9a07, + 0x2c5e05, + 0x2ed104, + 0x3c0146, + 0xdd246, + 0x381d07, + 0x2f0fc7, + 0x369748, + 0x2188c5, + 0x26a2c6, + 0x25788, + 0x2eaf85, + 0xeb146, + 0x2311c5, + 0x28b084, + 0x306907, + 0x238fca, + 0x336408, + 0x36a346, + 0x38cc3, + 0x2e2a45, + 0x322406, + 0x3b5186, + 0x375206, + 0x211543, + 0x3a0b07, + 0x2050c5, + 0x20a803, + 0x2df80d, + 0x20ca43, + 0x369848, + 0x20fcc4, + 0x276f45, + 0x2a8406, + 0x394306, + 0x2a9407, + 0x259d07, + 0x28aa85, + 0x216603, + 0x31a207, + 0x316f89, + 0x26e2c9, + 0x2524ca, + 0x2091c2, + 0x20a3c4, + 0x302604, + 0x2ee247, + 0x2ee648, + 0x2f0889, + 0x3c6649, + 0x2f1507, + 0x101f49, + 0x21ee46, + 0xf4a86, + 0x2f61c4, + 0x22c50a, + 0x2fab08, + 0x2fc809, + 0x2fcdc6, + 0x2b6305, + 0x3362c8, + 0x2cb88a, + 0x24f1c3, + 0x3454c6, + 0x2f1607, + 0x31f785, + 0x3a4245, + 0x240a83, + 0x246484, + 0x228305, + 0x285dc7, + 0x2f90c5, + 0x2f6a46, + 0x11ba45, + 0x359a43, + 0x3d26c9, + 0x276d0c, + 0x2bb5cc, + 0x39e908, + 0x2a98c7, + 0x3085c8, + 0x108c07, + 0x30944a, + 0x309b0b, + 0x3c2a08, + 0x394408, + 0x3db806, + 0x27d485, + 0x33954a, + 0x36d645, + 0x219f82, + 0x2c9ac7, + 0x24d686, + 0x377b45, + 0x30adc9, + 0x27ae85, + 0x295b05, + 0x2f8249, + 0x322346, + 0x329788, + 0x267dc3, + 0x21e7c6, + 0x275506, + 0x318085, + 0x318089, + 0x2bc409, + 0x27d207, + 0x11abc4, + 0x31abc7, + 0x3c6549, + 0x220b05, + 0x37ec8, + 0x342dc5, + 0x28e1c5, + 0x383dc9, + 0x202542, + 0x3d2c04, + 0x201e82, + 0x201742, + 0x2e5285, + 0x324588, + 0x2b9485, + 0x2c8c83, + 0x2c8c85, + 0x2d6f43, + 0x2071c2, + 0x331d04, + 0x26e683, + 0x200a82, + 0x3b8944, + 0x311943, + 0x212842, + 0x2b9503, + 0x213604, + 0x2fcf43, + 0x254ec4, + 0x204e82, + 0x216003, + 0x219c83, + 0x202602, + 0x293042, + 0x2bc249, + 0x20fa02, + 0x28a304, + 0x20d542, + 0x336144, + 0x21ee04, + 0x252b44, + 0x205402, + 0x23b4c2, + 0x387e43, + 0x298cc3, + 0x2614c4, + 0x28dcc4, + 0x2d0984, + 0x2f1784, + 0x31ad43, + 0x300b03, + 0x2bc744, + 0x31d9c4, + 0x31db06, + 0x20b582, + 0xc302, + 0x3ef83, + 0x20c302, + 0x232c43, + 0x228b03, + 0x20a803, + 0x216603, 0x2000c2, - 0x24ce83, - 0x22d7c3, - 0x233743, - 0x208903, - 0x220583, - 0x222884, - 0x2f2d04, - 0x205184, - 0x206b43, - 0x23cf83, - 0x213c43, - 0x2f8984, - 0x32bd43, - 0x2a8fc3, - 0x37a0c4, - 0x340cc6, - 0x218a43, - 0x12dac5, - 0x14c47, - 0x2e6e03, - 0x68a4abc8, - 0x2416c3, - 0x2b3883, - 0x20bec3, - 0x22a243, - 0x35ff85, - 0x1b0f03, - 0x22d7c3, - 0x233743, - 0x220583, - 0x206b43, - 0x23cf83, - 0x3410c3, - 0x22f0c3, - 0xa14c8, - 0x22d7c3, - 0x233743, - 0x220583, - 0x219e43, - 0x206b43, - 0x23b484, - 0x6df83, - 0x23cf83, - 0x21f4c4, - 0x12dac5, - 0x2c1745, - 0x14c47, - 0x202782, - 0x203dc2, + 0x248343, + 0x22c0c3, + 0x232c43, + 0x205e03, + 0x228b03, + 0x224e44, + 0x2bc504, + 0x217b84, + 0x20a803, + 0x216603, + 0x216103, + 0x2f8a84, + 0x32ce03, + 0x2aad03, + 0x37a944, + 0x342bc6, + 0x20e5c3, + 0x12eb85, + 0x176c87, + 0x2e4003, + 0x6b644548, + 0x2420c3, + 0x2b4103, + 0x20a443, + 0x238cc3, + 0x3afd05, + 0x1ae683, + 0x22c0c3, + 0x232c43, + 0x228b03, + 0x20a803, + 0x216603, + 0x208243, + 0x22dcc3, + 0x9fe08, + 0x22c0c3, + 0x232c43, + 0x228b03, + 0x214543, + 0x20a803, + 0x27f984, + 0x6d9c3, + 0x216603, + 0x2ba0c4, + 0x12eb85, + 0x2c2ac5, + 0x176c87, + 0x20c302, + 0x201d02, 0x200382, - 0x202642, - 0x13c3, + 0x205642, + 0xca43, 0x2003c2, - 0x3304, - 0x22d7c3, - 0x236204, - 0x233743, - 0x220583, - 0x205e03, - 0x206b43, - 0x23cf83, - 0xa14c8, - 0x22d7c3, - 0x233743, - 0x220583, - 0x205e03, - 0x205184, - 0x206b43, - 0x13c3, - 0x23cf83, - 0x202003, - 0x241844, - 0xa14c8, - 0x22d7c3, - 0x2013c3, - 0x1083, - 0x14d5c4, - 0x24ec04, - 0xa14c8, - 0x22d7c3, - 0x251184, - 0x222884, - 0x2013c3, - 0x201642, - 0x6df83, - 0x23cf83, - 0x25b583, - 0x3d804, - 0x3da885, - 0x21be02, - 0x3094c3, - 0x131949, - 0xdff06, - 0x109548, + 0x1244, + 0x22c0c3, + 0x235604, + 0x232c43, + 0x228b03, + 0x211543, + 0x20a803, + 0x216603, + 0x9fe08, + 0x22c0c3, + 0x232c43, + 0x228b03, + 0x211543, + 0x217b84, + 0x20a803, + 0xca43, + 0x216603, + 0x20c603, + 0x242244, + 0x9fe08, + 0x22c0c3, + 0x20ca43, + 0x8303, + 0x123ec4, + 0x249f84, + 0x9fe08, + 0x22c0c3, + 0x24b304, + 0x224e44, + 0x20ca43, + 0x201e02, + 0x6d9c3, + 0x216603, + 0x236bc3, + 0x46484, + 0x204185, + 0x219f82, + 0x2be683, + 0x2b49, + 0xddb86, + 0x142ec8, 0x2000c2, - 0xa14c8, - 0x202782, - 0x233743, - 0x220583, + 0x9fe08, + 0x20c302, + 0x232c43, + 0x228b03, 0x2005c2, - 0x13c3, - 0x23cf83, - 0x79c2, + 0xca43, + 0x216603, + 0x5942, 0x82, + 0xc2, + 0x1b5a47, + 0x13dc09, + 0x7be83, + 0x9fe08, + 0x27643, + 0x6ef26287, + 0x2c0c3, + 0x6048, + 0x32c43, + 0x28b03, + 0x3a086, + 0x14543, + 0x96448, + 0xc53c8, + 0x79046, + 0x11543, + 0xce788, + 0xb7e03, + 0x6f0e23c6, + 0xea185, + 0x32e47, + 0xa803, + 0x21803, + 0x16603, + 0xb142, + 0x17d48a, + 0x4e03, + 0xe5343, + 0xfe804, + 0x114d4b, + 0x115308, + 0x91482, + 0x1451207, + 0x153efc7, + 0x14c8d48, + 0x151d403, + 0x10044b, + 0x8582, + 0x12ea07, + 0x10cbc4, 0x2000c2, - 0x1b4387, - 0x135b49, - 0x7c303, - 0xa14c8, - 0x25a03, - 0x6c356e87, - 0x2d7c3, - 0x1c0708, - 0x233743, - 0x220583, - 0x3d346, - 0x219e43, - 0x95988, - 0xc4108, - 0x11f086, - 0x205e03, - 0xcf188, - 0xedf43, - 0x6c4e3d46, - 0xea9c5, - 0x33947, - 0x6b43, - 0x4e283, - 0x3cf83, - 0x2102, - 0x19c44a, - 0x4cc3, - 0x18c203, - 0x300204, - 0x11848b, - 0x118a48, - 0x91a82, - 0x1457987, - 0x1530e07, - 0x14c8188, - 0x151e703, - 0x1289cb, - 0x12d947, - 0x6a04, - 0x2000c2, - 0x202782, - 0x236204, - 0x220583, - 0x205e03, - 0x206b43, - 0x23cf83, - 0x22d7c3, - 0x233743, - 0x220583, - 0x22a243, - 0x206b43, - 0x23cf83, - 0x21f4c3, - 0x202003, - 0x2fe03, - 0x22d7c3, - 0x233743, - 0x220583, - 0x206b43, - 0x23cf83, - 0x22d7c3, - 0x233743, - 0x220583, - 0x206b43, - 0x23cf83, - 0x1083, - 0x22d7c3, - 0x233743, - 0x220583, - 0x222884, - 0x22a243, - 0x206b43, - 0x23cf83, - 0x2195c2, + 0x20c302, + 0x235604, + 0x228b03, + 0x211543, + 0x20a803, + 0x216603, + 0x22c0c3, + 0x232c43, + 0x228b03, + 0x238cc3, + 0x20a803, + 0x216603, + 0x2ba0c3, + 0x20c603, + 0x2f783, + 0x22c0c3, + 0x232c43, + 0x228b03, + 0x20a803, + 0x216603, + 0x22c0c3, + 0x232c43, + 0x228b03, + 0x20a803, + 0x216603, + 0x602, + 0x8303, + 0x28b03, + 0x22c0c3, + 0x232c43, + 0x228b03, + 0x224e44, + 0x238cc3, + 0x20a803, + 0x216603, + 0x20ff42, 0x2000c1, 0x2000c2, 0x200201, - 0x339742, - 0xa14c8, - 0x21c745, + 0x336f42, + 0x9fe08, + 0x21c105, 0x200101, - 0x2d7c3, - 0x30944, - 0x200f01, + 0x2c0c3, + 0x2fd84, + 0x2015c1, 0x200501, - 0x202401, - 0x24a882, - 0x387184, - 0x24a883, + 0x2014c1, + 0x244202, + 0x3874c4, + 0x244203, 0x200041, 0x200801, 0x200181, 0x200701, - 0x37e6c7, - 0x31d9cf, - 0x319886, + 0x2f6b87, + 0x380f4f, + 0x3cac46, 0x2004c1, - 0x34d606, - 0x200c01, + 0x323f06, + 0x200bc1, 0x200581, - 0x3d8b8e, + 0x3d878e, 0x2003c1, - 0x23cf83, - 0x201001, - 0x2e4d05, - 0x202102, - 0x239605, + 0x216603, + 0x200a81, + 0x2e3285, + 0x20b142, + 0x240985, 0x200401, 0x200741, 0x2007c1, - 0x21be02, + 0x219f82, 0x200081, - 0x201ec1, - 0x203301, - 0x201081, - 0x20a781, - 0x54389, - 0xa14c8, - 0x22d7c3, - 0x233743, - 0x220583, - 0x206b43, - 0x23cf83, - 0x214703, - 0x22d7c3, - 0x220583, - 0x919c8, - 0x205e03, - 0x206b43, - 0x4e703, - 0x23cf83, - 0x14ee5c8, - 0x140fc8, - 0x12dac5, - 0xa14c8, - 0x13c3, - 0x12dac5, - 0x43fc4, - 0x3c2c8, - 0x47984, - 0x54389, - 0x14ee5ca, - 0xa14c8, - 0x6df83, - 0x22d7c3, - 0x233743, - 0x220583, - 0x206b43, - 0x23cf83, - 0x20a683, - 0xa14c8, - 0x22d7c3, - 0x233743, - 0x2dd2c4, - 0x23cf83, - 0x3451c5, - 0x31f384, - 0x22d7c3, - 0x206b43, - 0x23cf83, - 0x2003, - 0xa7d8a, - 0xf3e84, - 0x122c86, - 0x202782, - 0x22d7c3, - 0x230ec9, - 0x233743, - 0x2ab989, - 0x220583, - 0x205e03, - 0x206b43, - 0x6bfc4, - 0x13c3, - 0x23cf83, - 0x2f7bc8, - 0x2319c7, - 0x3da885, - 0x1d29c8, - 0x1b4387, - 0xf02ca, - 0x6f54b, - 0x14d847, - 0x3e648, - 0x1a050a, - 0x11808, - 0x135b49, - 0x26847, - 0x374c7, - 0x14c8, - 0x1c0708, - 0x4028f, - 0x19a45, - 0x18b307, - 0x3d346, - 0x4e1c7, - 0x122946, - 0x95988, - 0x9e786, - 0x128f07, - 0x12ea49, - 0x10ec7, - 0xb2f09, - 0xbb909, - 0xc14c6, - 0xc4108, - 0xc2c45, - 0x7a30a, - 0xcf188, - 0xedf43, - 0xdaa88, - 0x33947, - 0x172945, - 0x5f550, - 0x4e283, - 0x6df83, - 0x128d87, - 0x22d85, - 0xf19c8, - 0x68885, - 0x18c203, - 0x7048, - 0xc0246, - 0x17c949, - 0xad447, - 0x131c0b, - 0x6d144, - 0x10e984, - 0x11848b, - 0x118a48, - 0x119647, - 0x12dac5, - 0x22d7c3, - 0x233743, - 0x228843, - 0x23cf83, - 0x23de43, - 0x220583, - 0x6df83, - 0x22d7c3, - 0x233743, - 0x220583, - 0x205e03, - 0x206b43, - 0x23cf83, - 0x8864b, + 0x205841, + 0x201241, + 0x2018c1, + 0x204981, + 0x4e9c9, + 0x9fe08, + 0x22c0c3, + 0x232c43, + 0x228b03, + 0x20a803, + 0x216603, + 0x216e03, + 0x22c0c3, + 0x228b03, + 0x913c8, + 0x211543, + 0x20a803, + 0x70e03, + 0x216603, + 0x14ecd48, + 0x8148, + 0x12eb85, + 0x9fe08, + 0xca43, + 0x12eb85, + 0x1da144, + 0x116c8, + 0x42744, + 0xc9345, + 0x4e9c9, + 0x14ecd4a, + 0x9fe08, + 0x6d9c3, + 0x22c0c3, + 0x232c43, + 0x228b03, + 0x20a803, + 0x216603, + 0x225843, + 0x9fe08, + 0x22c0c3, + 0x232c43, + 0x2db1c4, + 0x216603, + 0x25cf45, + 0x27ac84, + 0x22c0c3, + 0x232c43, + 0x228b03, + 0x206a42, + 0x20a803, + 0x216603, + 0xc603, + 0xa924a, + 0x119b84, + 0x121d46, + 0x248343, + 0x22c0c3, + 0x232c43, + 0x228b03, + 0x20a803, + 0x216603, + 0x20c302, + 0x22c0c3, + 0x230309, + 0x232c43, + 0x2ac809, + 0x228b03, + 0x211543, + 0x20a803, + 0x189a44, + 0xca43, + 0x216603, + 0x2f5fc8, + 0x23ad87, + 0x204185, + 0x1d1548, + 0x1b5a47, + 0xee8ca, + 0x6fe0b, + 0x124147, + 0x3cd48, + 0x1198a, + 0x1a348, + 0x13dc09, + 0x281c7, + 0x106707, + 0x140cc8, + 0x6048, + 0x3e84f, + 0x17c45, + 0x16687, + 0x3a086, + 0x3fc07, + 0x11e586, + 0x96448, + 0x9f546, + 0x129587, + 0x143489, + 0x1a4ec7, + 0x9be49, + 0xba9c9, + 0xc2846, + 0xc53c8, + 0xc3a05, + 0x7c70a, + 0xce788, + 0xb7e03, + 0xd7348, + 0x32e47, + 0x13e8c5, + 0x64910, + 0x21803, + 0x6d9c3, + 0x129407, + 0x231c5, + 0xeff88, + 0x65305, + 0xe5343, + 0x3308, + 0xb446, + 0x92289, + 0xaebc7, + 0x2e0b, + 0x6c1c4, + 0x10b8c4, + 0x114d4b, + 0x115308, + 0x115e07, + 0x12eb85, + 0x22c0c3, + 0x232c43, + 0x212483, + 0x216603, + 0x23bf03, + 0x228b03, + 0x6d9c3, + 0x22c0c3, + 0x232c43, + 0x228b03, + 0x211543, + 0x20a803, + 0x216603, + 0x1988cb, 0x2000c2, - 0x202782, - 0x23cf83, - 0xa14c8, - 0x2782, + 0x20c302, + 0x216603, + 0x9fe08, + 0x133d89, + 0xc302, 0x2000c2, - 0x202782, + 0x20c302, 0x200382, 0x2005c2, - 0x205e02, - 0x206b43, - 0x132f46, + 0x206702, + 0x20a803, + 0x133a46, 0x2003c2, - 0x3d804, + 0x46484, 0x2000c2, - 0x24ce83, - 0x202782, - 0x22d7c3, - 0x233743, + 0x248343, + 0x20c302, + 0x22c0c3, + 0x232c43, 0x200382, - 0x220583, - 0x219e43, - 0x205e03, - 0x205184, - 0x206b43, - 0x212203, - 0x13c3, - 0x23cf83, - 0x300204, - 0x207b83, - 0x220583, - 0x202782, - 0x22d7c3, - 0x233743, - 0x220583, - 0x205e03, - 0x206b43, - 0x2013c3, - 0x23cf83, - 0x3bcc87, - 0x22d7c3, - 0x27c507, - 0x366486, - 0x201f83, - 0x219d03, - 0x220583, - 0x209a03, - 0x222884, - 0x3975c4, - 0x2df1c6, - 0x201d43, - 0x206b43, - 0x23cf83, - 0x3451c5, - 0x309e84, - 0x3a13c3, - 0x2c7183, - 0x2c9307, - 0x2c6985, - 0x22d7c3, - 0x233743, - 0x220583, - 0x205e03, - 0x206b43, - 0x23cf83, - 0x52507, - 0x1667c7, - 0x1a2a05, - 0x20c882, - 0x24a0c3, - 0x20ee03, - 0x24ce83, - 0x7622d7c3, - 0x206742, - 0x233743, - 0x204183, - 0x220583, - 0x222884, - 0x37fa83, - 0x223783, - 0x205e03, - 0x205184, - 0x76602a42, - 0x206b43, - 0x23cf83, - 0x204f03, - 0x21c4c3, - 0x212bc3, - 0x2195c2, - 0x207b83, - 0xa14c8, - 0x220583, - 0x1083, - 0x21e744, - 0x24ce83, - 0x202782, - 0x22d7c3, - 0x236204, - 0x233743, - 0x220583, - 0x222884, - 0x219e43, - 0x3b7d44, - 0x3216c4, - 0x2dc3c6, - 0x205184, - 0x206b43, - 0x23cf83, - 0x213c43, - 0x251646, - 0x3540b, - 0x29f46, - 0xebe8a, - 0x11c10a, - 0xa14c8, - 0x225344, - 0x77a2d7c3, - 0x329384, - 0x233743, - 0x2aea44, - 0x220583, - 0x2067c3, - 0x205e03, - 0x206b43, - 0x6df83, - 0x23cf83, - 0x4b283, - 0x3487cb, - 0x3c94ca, - 0x3db44c, - 0xe4148, + 0x228b03, + 0x214543, + 0x211543, + 0x217b84, + 0x20a803, + 0x213dc3, + 0xca43, + 0x216603, + 0x2fe804, + 0x205b03, + 0x228b03, + 0x20c302, + 0x22c0c3, + 0x232c43, + 0x228b03, + 0x211543, + 0x20a803, + 0x20ca43, + 0x216603, + 0x3b8207, + 0x22c0c3, + 0x27c087, + 0x35f6c6, + 0x216b03, + 0x214403, + 0x228b03, + 0x204f43, + 0x224e44, + 0x300bc4, + 0x3187c6, + 0x218f83, + 0x20a803, + 0x216603, + 0x25cf45, + 0x34f1c4, + 0x326a03, + 0x276683, + 0x2c9ac7, + 0x20f805, + 0x22c0c3, + 0x232c43, + 0x228b03, + 0x211543, + 0x20a803, + 0x216603, + 0x14803, + 0x7970270c, + 0x50e87, + 0xbe846, + 0x114587, + 0x8f6c5, + 0x20be02, + 0x245a83, + 0x208b83, + 0x248343, + 0x7a22c0c3, + 0x207902, + 0x232c43, + 0x2020c3, + 0x228b03, + 0x224e44, + 0x201143, + 0x223bc3, + 0x211543, + 0x217b84, + 0x7a612b02, + 0x20a803, + 0x216603, + 0x21d0c3, + 0x22ce03, + 0x20a883, + 0x20ff42, + 0x205b03, + 0x9fe08, + 0x228b03, + 0x8303, + 0x322c44, + 0x248343, + 0x20c302, + 0x22c0c3, + 0x235604, + 0x232c43, + 0x228b03, + 0x224e44, + 0x214543, + 0x246b84, + 0x303f84, + 0x2d9bc6, + 0x217b84, + 0x20a803, + 0x216603, + 0x216103, + 0x24d686, + 0x3494b, + 0x39346, + 0x396ca, + 0x11960a, + 0x9fe08, + 0x225744, + 0x7ba2c0c3, + 0x3db044, + 0x232c43, + 0x26e144, + 0x228b03, + 0x220383, + 0x211543, + 0x20a803, + 0x6d9c3, + 0x216603, + 0x47203, + 0x34b00b, + 0x3c840a, + 0x3dc60c, + 0xe27c8, 0x2000c2, - 0x202782, + 0x20c302, 0x200382, - 0x22e1c5, - 0x222884, - 0x2024c2, - 0x205e03, - 0x3216c4, - 0x202642, + 0x22cd85, + 0x224e44, + 0x206a42, + 0x211543, + 0x303f84, + 0x205642, 0x2003c2, - 0x202002, - 0x2195c2, - 0x4ce83, - 0x35d82, - 0x2c1f89, - 0x33f688, - 0x2294c9, - 0x21f009, - 0x2b718a, - 0x32324a, - 0x20a602, - 0x2d5e42, - 0x2782, - 0x22d7c3, - 0x22bdc2, - 0x240186, - 0x376cc2, - 0x203742, - 0x26f8ce, - 0x213b8e, - 0x281287, - 0x212ac7, - 0x251bc2, - 0x233743, - 0x220583, - 0x2191c2, + 0x209482, + 0x20ff42, + 0x48343, + 0x9382, + 0x2c4009, + 0x364448, + 0x228989, + 0x208649, + 0x2181ca, + 0x22170a, + 0x203cc2, + 0x28cac2, + 0xc302, + 0x22c0c3, + 0x22ae02, + 0x23e746, + 0x378f82, + 0x201682, + 0x27018e, + 0x21604e, + 0x27fc47, + 0x20a787, + 0x24b5c2, + 0x232c43, + 0x228b03, + 0x20d602, 0x2005c2, - 0x19c83, - 0x23640f, - 0x237542, - 0x355f47, - 0x2b5707, - 0x2c8c47, - 0x2d164c, - 0x2d36cc, - 0x21e404, - 0x25ea0a, - 0x213ac2, - 0x253a42, - 0x2bd1c4, + 0x14383, + 0x23580f, + 0x23ea82, + 0x366f87, + 0x2b1bc7, + 0x354207, + 0x2b590c, + 0x2e09cc, + 0x3d0384, + 0x39b8ca, + 0x211902, + 0x24e082, + 0x2bce04, 0x200702, - 0x2af602, - 0x2d3904, - 0x212302, - 0x200b42, - 0x14903, - 0x29e807, - 0x23f2c5, - 0x20f1c2, - 0x24e144, - 0x201582, - 0x2e3ec8, - 0x206b43, - 0x3754c8, - 0x204082, - 0x21e5c5, - 0x394b06, - 0x23cf83, - 0x206a82, - 0x2f2707, - 0x2102, - 0x3a46c5, - 0x21fe85, - 0x213f82, - 0x202c02, - 0x204d4a, - 0x28320a, - 0x2801c2, - 0x29ce84, - 0x201202, - 0x20bd08, - 0x20a742, - 0x304d48, - 0x314187, - 0x315089, - 0x21ff02, - 0x31a585, - 0x36a1c5, - 0x21a2cb, - 0x2df74c, - 0x22b8c8, - 0x32d788, - 0x22c202, - 0x2a8002, + 0x2c4fc2, + 0x2e0c04, + 0x213ec2, + 0x203102, + 0xe403, + 0x29f5c7, + 0x238685, + 0x217002, + 0x23fb84, + 0x340d82, + 0x2e2548, + 0x20a803, + 0x377ec8, + 0x201fc2, + 0x3d0545, + 0x394d46, + 0x216603, + 0x208242, + 0x2f0ac7, + 0xb142, + 0x212ec5, + 0x301185, + 0x216442, + 0x2085c2, + 0x21cf0a, + 0x28a90a, + 0x287582, + 0x2a0cc4, + 0x205c42, + 0x20a288, + 0x205782, + 0x356708, + 0xf01, + 0x30ef47, + 0x310a49, + 0x212f42, + 0x316805, + 0x3b0205, + 0x21898b, + 0x318d4c, + 0x22a908, + 0x32e848, + 0x20b582, + 0x2a94c2, 0x2000c2, - 0xa14c8, - 0x202782, - 0x22d7c3, + 0x9fe08, + 0x20c302, + 0x22c0c3, 0x200382, - 0x202642, - 0x13c3, + 0x205642, + 0xca43, 0x2003c2, - 0x23cf83, - 0x202002, + 0x216603, + 0x209482, 0x2000c2, - 0x12dac5, - 0x78e02782, - 0x79620583, - 0x214903, - 0x2024c2, - 0x206b43, - 0x379083, - 0x79a3cf83, - 0x2ef083, - 0x283dc6, - 0x1602003, - 0x12dac5, - 0x132e0b, - 0xa14c8, - 0x793caf88, - 0x60ac7, - 0x6d807, - 0x45585, - 0xaafcd, - 0x3d142, - 0x119042, - 0xa8a0a, - 0x83047, - 0x256c4, - 0x25703, - 0x1b4904, - 0x7a205342, - 0x7a600b02, - 0x7aa02442, - 0x7ae026c2, - 0x7b20d242, - 0x7b605cc2, - 0x14c47, - 0x7ba02782, - 0x7be2eec2, - 0x7c21ed42, - 0x7c602942, - 0x213b83, - 0x16f44, - 0x2399c3, - 0x7ca0dd82, - 0x5d348, - 0x7ce05282, - 0x71d87, - 0x7d200042, - 0x7d6012c2, - 0x7da00182, - 0x7de067c2, - 0x7e205e42, - 0x7e6005c2, - 0xd8605, - 0x251e03, - 0x39ffc4, - 0x7ea00702, - 0x7ee03942, - 0x7f206ac2, - 0x7af0b, - 0x7f601442, - 0x7fe4ab82, - 0x802024c2, - 0x80605e02, - 0x80a02dc2, - 0x80e00c02, - 0x81200e82, - 0x8166cec2, - 0x81a02a42, - 0x81e09a42, - 0x82202642, - 0x82616202, - 0x82a6ef42, - 0x82e09b42, - 0xb2bc4, - 0x217a43, - 0x8320a302, - 0x836137c2, - 0x83a11b82, - 0x83e006c2, - 0x842003c2, - 0x84601002, - 0x887c7, - 0x84a13c42, - 0x84e04482, - 0x85202002, - 0x85600ec2, - 0x1aed4c, - 0x85a43982, - 0x85e28202, - 0x86203082, - 0x86606842, - 0x86a0a342, - 0x86e76c02, - 0x87205302, - 0x8760adc2, - 0x87a77742, - 0x87e77c82, - 0x235d82, - 0x37fa83, - 0x217343, - 0x235d82, - 0x37fa83, - 0x217343, - 0x235d82, - 0x37fa83, - 0x217343, - 0x235d82, - 0x37fa83, - 0x217343, - 0x235d82, - 0x37fa83, - 0x217343, - 0x235d82, - 0x37fa83, - 0x217343, - 0x235d82, - 0x37fa83, - 0x217343, - 0x235d82, - 0x37fa83, - 0x217343, - 0x235d82, - 0x37fa83, - 0x217343, - 0x235d82, - 0x37fa83, - 0x17343, - 0x235d82, - 0x37fa83, - 0x217343, - 0x235d82, - 0x37fa83, - 0x217343, - 0x235d82, - 0x37fa83, - 0x217343, - 0x235d82, - 0x217343, - 0x235d82, - 0x37fa83, - 0x217343, - 0x235d82, - 0x37fa83, - 0x217343, - 0x235d82, - 0x37fa83, - 0x217343, - 0x235d82, - 0x37fa83, - 0x217343, - 0x235d82, - 0x37fa83, - 0x217343, - 0x235d82, - 0x37fa83, - 0x217343, - 0x235d82, - 0x37fa83, - 0x217343, - 0x235d82, - 0x7fb7fa83, - 0x217343, - 0x360004, - 0x2293c6, - 0x2fe843, - 0x235d82, - 0x37fa83, - 0x217343, - 0x235d82, - 0x37fa83, - 0x217343, - 0x308b49, - 0x235d82, - 0x3d3c43, - 0x2bbc03, - 0x202ac5, - 0x204183, - 0x37fa83, - 0x217343, - 0x2a6343, - 0x243283, - 0x245b89, - 0x235d82, - 0x37fa83, - 0x217343, - 0x235d82, - 0x37fa83, - 0x217343, - 0x235d82, - 0x37fa83, - 0x217343, - 0x235d82, - 0x37fa83, - 0x217343, - 0x235d82, - 0x37fa83, - 0x217343, - 0x235d82, - 0x217343, - 0x235d82, - 0x37fa83, - 0x217343, - 0x235d82, - 0x37fa83, - 0x217343, - 0x235d82, - 0x37fa83, - 0x217343, - 0x235d82, - 0x37fa83, - 0x217343, - 0x235d82, - 0x37fa83, - 0x217343, - 0x235d82, - 0x37fa83, - 0x217343, - 0x235d82, - 0x37fa83, - 0x217343, - 0x235d82, - 0x37fa83, - 0x217343, - 0x235d82, - 0x37fa83, - 0x217343, - 0x235d82, - 0x37fa83, - 0x217343, - 0x235d82, - 0x37fa83, - 0x217343, - 0x235d82, - 0x37fa83, - 0x217343, - 0x235d82, - 0x37fa83, - 0x217343, - 0x235d82, - 0x217343, - 0x235d82, - 0x37fa83, - 0x217343, - 0x235d82, - 0x37fa83, - 0x217343, - 0x235d82, - 0x37fa83, - 0x217343, - 0x235d82, - 0x37fa83, - 0x217343, - 0x235d82, - 0x37fa83, - 0x217343, - 0x235d82, - 0x37fa83, - 0x217343, - 0x235d82, - 0x37fa83, - 0x217343, - 0x235d82, - 0x37fa83, - 0x217343, - 0x235d82, - 0x235d82, - 0x37fa83, - 0x217343, - 0x8862d7c3, - 0x233743, - 0x21f243, - 0x205e03, - 0x206b43, - 0x13c3, - 0x23cf83, - 0xa14c8, - 0x202782, - 0x22d7c3, - 0x206b43, - 0x23cf83, - 0x22d7c3, - 0x233743, - 0x220583, - 0x205e03, - 0x206b43, - 0x13c3, - 0x23cf83, - 0x24ec04, - 0x202782, - 0x22d7c3, - 0x309703, - 0x233743, - 0x251184, - 0x228843, - 0x220583, - 0x222884, - 0x219e43, - 0x205e03, - 0x206b43, - 0x23cf83, - 0x25b583, - 0x3da885, - 0x243283, - 0x207b83, - 0x13c3, - 0x202782, - 0x22d7c3, - 0x37fa83, - 0x206b43, - 0x23cf83, + 0x12eb85, + 0x7ce0c302, + 0x7d628b03, + 0x20e403, + 0x206a42, + 0x20a803, + 0x3559c3, + 0x7da16603, + 0x2ed343, + 0x281ac6, + 0x160c603, + 0x12eb85, + 0x13390b, + 0x9fe08, + 0x7d27d6c8, + 0x7e407, + 0x6d247, + 0x175305, + 0x2a20d, + 0x39e82, + 0x115902, + 0xaa74a, + 0x8a747, + 0x27304, + 0x27343, + 0x1bffc4, + 0x7e204ec2, + 0x7e600ac2, + 0x7ea02282, + 0x7ee03342, + 0x7f209bc2, + 0x7f604042, + 0x176c87, + 0x7fa0c302, + 0x7fe2dac2, + 0x80221442, + 0x806081c2, + 0x216043, + 0x12704, + 0x236cc3, + 0x80a0c782, + 0x59648, + 0x80e076c2, + 0x4bc07, + 0x81200042, + 0x81600d82, + 0x81a00182, + 0x81e03dc2, + 0x82200f42, + 0x826005c2, + 0xd30c5, + 0x215183, + 0x36c284, + 0x82a00702, + 0x82e01882, + 0x83203c42, + 0x86ccb, + 0x83600c42, + 0x83e44502, + 0x84206a42, + 0x84606702, + 0x84a1d902, + 0x84e00bc2, + 0x85205a02, + 0x8566bf42, + 0x85a12b02, + 0x85e04f82, + 0x86205642, + 0x86636002, + 0x86a6f802, + 0x86e28c42, + 0x194584, + 0x217903, + 0x87200ec2, + 0x8760fc42, + 0x87a0ad82, + 0x87e006c2, + 0x882003c2, + 0x88600a82, + 0x198a47, + 0x88a16102, + 0x88e03d82, + 0x89209482, + 0x89616002, + 0x1a214c, + 0x89a47c82, + 0x89e22182, + 0x8a202682, + 0x8a617042, + 0x8aa00f02, + 0x8ae18342, + 0x8b205842, + 0x8b60b902, + 0x8ba75882, + 0x8be369c2, + 0x209382, + 0x201143, + 0x217203, + 0x209382, + 0x201143, + 0x217203, + 0x209382, + 0x201143, + 0x217203, + 0x209382, + 0x201143, + 0x217203, + 0x209382, + 0x201143, + 0x217203, + 0x209382, + 0x201143, + 0x217203, + 0x209382, + 0x201143, + 0x217203, + 0x209382, + 0x201143, + 0x217203, + 0x209382, + 0x201143, + 0x217203, + 0x209382, + 0x201143, + 0x17203, + 0x209382, + 0x201143, + 0x217203, + 0x209382, + 0x201143, + 0x217203, + 0x209382, + 0x201143, + 0x217203, + 0x209382, + 0x217203, + 0x209382, + 0x201143, + 0x217203, + 0x209382, + 0x201143, + 0x217203, + 0x209382, + 0x201143, + 0x217203, + 0x209382, + 0x201143, + 0x217203, + 0x209382, + 0x201143, + 0x217203, + 0x209382, + 0x201143, + 0x217203, + 0x209382, + 0x201143, + 0x217203, + 0x209382, + 0x83a01143, + 0x217203, + 0x3afd84, + 0x228886, + 0x2fd643, + 0x209382, + 0x201143, + 0x217203, + 0x209382, + 0x201143, + 0x217203, + 0x2bdd09, + 0x209382, + 0x39c403, + 0x2bacc3, + 0x36aa05, + 0x2020c3, + 0x201143, + 0x217203, + 0x28f543, + 0x221a43, + 0x34d8c9, + 0x209382, + 0x201143, + 0x217203, + 0x209382, + 0x201143, + 0x217203, + 0x209382, + 0x201143, + 0x217203, + 0x209382, + 0x201143, + 0x217203, + 0x209382, + 0x201143, + 0x217203, + 0x209382, + 0x217203, + 0x209382, + 0x201143, + 0x217203, + 0x209382, + 0x201143, + 0x217203, + 0x209382, + 0x201143, + 0x217203, + 0x209382, + 0x201143, + 0x217203, + 0x209382, + 0x201143, + 0x217203, + 0x209382, + 0x201143, + 0x217203, + 0x209382, + 0x201143, + 0x217203, + 0x209382, + 0x201143, + 0x217203, + 0x209382, + 0x201143, + 0x217203, + 0x209382, + 0x201143, + 0x217203, + 0x209382, + 0x201143, + 0x217203, + 0x209382, + 0x201143, + 0x217203, + 0x209382, + 0x201143, + 0x217203, + 0x209382, + 0x217203, + 0x209382, + 0x201143, + 0x217203, + 0x209382, + 0x201143, + 0x217203, + 0x209382, + 0x201143, + 0x217203, + 0x209382, + 0x201143, + 0x217203, + 0x209382, + 0x201143, + 0x217203, + 0x209382, + 0x201143, + 0x217203, + 0x209382, + 0x201143, + 0x217203, + 0x209382, + 0x201143, + 0x217203, + 0x209382, + 0x209382, + 0x201143, + 0x217203, + 0x8c62c0c3, + 0x232c43, + 0x208883, + 0x211543, + 0x20a803, + 0xca43, + 0x216603, + 0x9fe08, + 0x20c302, + 0x22c0c3, + 0x20a803, + 0x216603, + 0xbdb82, + 0x22c0c3, + 0x232c43, + 0x228b03, + 0x8d0ebe82, + 0x211543, + 0x20a803, + 0xca43, + 0x216603, + 0x15c1, + 0x249f84, + 0x20c302, + 0x22c0c3, + 0x200983, + 0x232c43, + 0x24b304, + 0x212483, + 0x228b03, + 0x224e44, + 0x214543, + 0x211543, + 0x20a803, + 0x216603, + 0x236bc3, + 0x204185, + 0x221a43, + 0x205b03, + 0xca43, + 0x20c302, + 0x22c0c3, + 0x201143, + 0x20a803, + 0x216603, 0x2000c2, - 0x24ce83, - 0xa14c8, - 0x22d7c3, - 0x233743, - 0x220583, - 0x22fac6, - 0x222884, - 0x219e43, - 0x205184, - 0x206b43, - 0x23cf83, - 0x213c43, - 0x22d7c3, - 0x233743, - 0x206b43, - 0x23cf83, - 0x2ebc2, - 0x2b42, - 0x144de07, - 0x492c7, - 0x22d7c3, - 0x29f46, - 0x233743, - 0x220583, - 0xe7e06, - 0x206b43, - 0x23cf83, - 0x329fc8, - 0x32d5c9, - 0x341f49, - 0x34a9c8, - 0x396bc8, - 0x396bc9, - 0x323aca, - 0x35d44a, - 0x391f8a, - 0x39858a, - 0x3c94ca, - 0x3d680b, - 0x24704d, - 0x3676cf, - 0x272190, - 0x35eacd, - 0x37d58c, - 0x3982cb, - 0x6da08, - 0x147d48, - 0xb1005, - 0x1489947, - 0xcd9c5, + 0x248343, + 0x9fe08, + 0x22c0c3, + 0x232c43, + 0x228b03, + 0x22f446, + 0x224e44, + 0x214543, + 0x217b84, + 0x20a803, + 0x216603, + 0x216103, + 0x22c0c3, + 0x232c43, + 0x20a803, + 0x216603, + 0x2d7c2, + 0x1942, + 0x1458787, + 0x141347, + 0x22c0c3, + 0x39346, + 0x232c43, + 0x228b03, + 0xe7d46, + 0x20a803, + 0x216603, + 0x32b688, + 0x32e689, + 0x341509, + 0x34cd48, + 0x396f48, + 0x396f49, + 0x32370a, + 0x35f9ca, + 0x39278a, + 0x39914a, + 0x3c840a, + 0x3d5fcb, + 0x23d20d, + 0x367bcf, + 0x25b050, + 0x36144d, + 0x37e04c, + 0x398e8b, + 0x6d448, + 0xebcc8, + 0x92e85, + 0x1488147, + 0xccc85, 0x2000c2, - 0x2c67c5, - 0x200b03, - 0x8c202782, - 0x233743, - 0x220583, - 0x38d5c7, - 0x20bec3, - 0x205e03, - 0x206b43, - 0x251ac3, - 0x20c243, - 0x2013c3, - 0x23cf83, - 0x259b06, - 0x21be02, - 0x207b83, - 0xa14c8, + 0x20f645, + 0x20e3c3, + 0x9060c302, + 0x232c43, + 0x228b03, + 0x3d4007, + 0x20a443, + 0x211543, + 0x20a803, + 0x24bbc3, + 0x213dc3, + 0x209a83, + 0x20ca43, + 0x216603, + 0x253c46, + 0x219f82, + 0x205b03, + 0x9fe08, 0x2000c2, - 0x24ce83, - 0x202782, - 0x22d7c3, - 0x233743, - 0x220583, - 0x222884, - 0x205e03, - 0x206b43, - 0x23cf83, - 0x202003, - 0x492c7, - 0x131944, - 0x153fd06, + 0x248343, + 0x20c302, + 0x22c0c3, + 0x232c43, + 0x228b03, + 0x224e44, + 0x211543, + 0x20a803, + 0x216603, + 0x20c603, + 0x141347, + 0x8582, + 0x2b44, + 0x15c87c6, 0x2000c2, - 0x202782, - 0x220583, - 0x205e03, - 0x23cf83, + 0x20c302, + 0x228b03, + 0x211543, + 0x216603, } // children is the list of nodes' children, the parent's wildcard bit and the @@ -9395,568 +9462,585 @@ var children = [...]uint32{ 0x40000000, 0x50000000, 0x60000000, - 0x1824603, - 0x1828609, - 0x182c60a, - 0x185060b, - 0x19ac614, + 0x17f85f8, + 0x17fc5fe, + 0x18005ff, + 0x1824600, + 0x1980609, + 0x1998660, + 0x19ac666, 0x19c466b, - 0x19d8671, - 0x19f0676, - 0x1a1067c, - 0x1a28684, - 0x1a4068a, - 0x1a58690, + 0x19e4671, + 0x19fc679, + 0x1a1467f, + 0x1a2c685, + 0x1a3068b, + 0x1a5868c, 0x1a5c696, - 0x1a84697, - 0x1a886a1, - 0x1aa06a2, - 0x1aa46a8, - 0x1aa86a9, - 0x1ae46aa, - 0x1ae86b9, - 0x61af06ba, - 0x21af86bc, - 0x1b406be, + 0x1a74697, + 0x1a7869d, + 0x1a7c69e, + 0x1ab869f, + 0x1abc6ae, + 0x61ac46af, + 0x21acc6b1, + 0x1b146b3, + 0x1b186c5, + 0x1b3c6c6, + 0x1b406cf, 0x1b446d0, - 0x1b646d1, - 0x1b786d9, - 0x1b7c6de, - 0x1bac6df, - 0x1bc86eb, - 0x1bf06f2, - 0x1c006fc, - 0x1c04700, - 0x1c9c701, - 0x1cb0727, - 0x1cc472c, - 0x1cfc731, - 0x1d0c73f, - 0x1d20743, - 0x1d38748, - 0x1ddc74e, - 0x1fe0777, - 0x1fe47f8, - 0x20507f9, - 0x20bc814, - 0x20d482f, + 0x1b586d1, + 0x1b5c6d6, + 0x1b8c6d7, + 0x1ba86e3, + 0x1bd06ea, + 0x1be06f4, + 0x1be46f8, + 0x1c7c6f9, + 0x1c9071f, + 0x1ca4724, + 0x1cdc729, + 0x1cec737, + 0x1d0073b, + 0x1d18740, + 0x1dbc746, + 0x1fc076f, + 0x1fc47f0, + 0x20307f1, + 0x209c80c, + 0x20b4827, + 0x20c882d, + 0x20cc832, + 0x20d4833, 0x20e8835, 0x20ec83a, - 0x20f483b, - 0x210883d, - 0x210c842, - 0x2128843, - 0x217884a, - 0x217c85e, - 0x2218085f, - 0x219c860, - 0x21a0867, - 0x21a4868, - 0x21c8869, - 0x2208872, - 0x220c882, - 0x62210883, - 0x2228884, - 0x224888a, - 0x2254892, - 0x2264895, - 0x2318899, - 0x231c8c6, - 0x2232c8c7, - 0x223308cb, - 0x223388cc, - 0x23948ce, - 0x23988e5, - 0x28848e6, - 0x2292ca21, - 0x22930a4b, - 0x22934a4c, - 0x22940a4d, - 0x22944a50, - 0x22950a51, - 0x22954a54, - 0x22958a55, - 0x2295ca56, + 0x210883b, + 0x2158842, + 0x215c856, + 0x22160857, + 0x217c858, + 0x218085f, + 0x2184860, + 0x21a8861, + 0x21e886a, + 0x21ec87a, + 0x621f087b, + 0x220887c, + 0x222c882, + 0x223888b, + 0x224888e, + 0x22fc892, + 0x23008bf, + 0x223108c0, + 0x223148c4, + 0x2231c8c5, + 0x23748c7, + 0x23788dd, + 0x288c8de, + 0x2890a23, + 0x22938a24, + 0x2293ca4e, + 0x22940a4f, + 0x2294ca50, + 0x22950a53, + 0x2295ca54, 0x22960a57, 0x22964a58, - 0x22970a59, - 0x22974a5c, - 0x22980a5d, - 0x22984a60, - 0x22988a61, - 0x2298ca62, - 0x22998a63, - 0x2299ca66, - 0x229a8a67, - 0x229aca6a, - 0x229b0a6b, - 0x229b4a6c, - 0x29b8a6d, + 0x22968a59, + 0x2296ca5a, + 0x22970a5b, + 0x2297ca5c, + 0x22980a5f, + 0x2298ca60, + 0x22990a63, + 0x22994a64, + 0x22998a65, + 0x229a4a66, + 0x229a8a69, + 0x229b4a6a, + 0x229b8a6d, 0x229bca6e, - 0x229c8a6f, - 0x229cca72, - 0x29d4a73, - 0x2a18a75, - 0x22a38a86, - 0x22a3ca8e, - 0x22a40a8f, - 0x22a48a90, - 0x22a4ca92, - 0x2a50a93, - 0x22a54a94, + 0x229c0a6f, + 0x29c4a70, + 0x229c8a71, + 0x229d4a72, + 0x229d8a75, + 0x29dca76, + 0x29e4a77, + 0x629f0a79, + 0x2a34a7c, + 0x22a54a8d, 0x22a58a95, 0x22a5ca96, - 0x2a64a97, - 0x2a68a99, + 0x22a64a97, + 0x22a68a99, 0x2a6ca9a, - 0x2a88a9b, - 0x2aa0aa2, - 0x2aa4aa8, - 0x2ab4aa9, - 0x2ac0aad, - 0x2af4ab0, - 0x2af8abd, - 0x2b10abe, - 0x22b18ac4, - 0x22b1cac6, - 0x22b24ac7, - 0x2c14ac9, - 0x22c18b05, - 0x2c20b06, - 0x2c24b08, - 0x22c28b09, - 0x2c2cb0a, - 0x2c3cb0b, - 0x2c40b0f, - 0x2c44b10, - 0x2c48b11, - 0x2c60b12, - 0x2c74b18, - 0x2c9cb1d, - 0x2cbcb27, - 0x2cc0b2f, - 0x62cc4b30, - 0x2cf4b31, - 0x2cf8b3d, - 0x22cfcb3e, - 0x2d00b3f, - 0x2d28b40, - 0x2d2cb4a, - 0x2d50b4b, - 0x2d54b54, - 0x2d68b55, - 0x2d6cb5a, - 0x2d70b5b, - 0x2d90b5c, - 0x2dacb64, - 0x2db0b6b, - 0x22db4b6c, - 0x2db8b6d, - 0x2dbcb6e, - 0x2dc0b6f, - 0x2dc8b70, - 0x2ddcb72, - 0x2de0b77, - 0x2de4b78, + 0x22a70a9b, + 0x22a74a9c, + 0x22a78a9d, + 0x22a7ca9e, + 0x2a84a9f, + 0x2a8caa1, + 0x2a90aa3, + 0x2aacaa4, + 0x2ac4aab, + 0x2ac8ab1, + 0x2ad8ab2, + 0x2ae4ab6, + 0x2b18ab9, + 0x2b1cac6, + 0x2b34ac7, + 0x22b3cacd, + 0x22b40acf, + 0x22b48ad0, + 0x2c40ad2, + 0x22c44b10, + 0x2c4cb11, + 0x2c50b13, + 0x22c54b14, + 0x2c58b15, + 0x2c70b16, + 0x2c74b1c, + 0x2c78b1d, + 0x2c7cb1e, + 0x2c94b1f, + 0x2ca8b25, + 0x2cd0b2a, + 0x2cf0b34, + 0x2cf4b3c, + 0x62cf8b3d, + 0x2d2cb3e, + 0x2d30b4b, + 0x22d34b4c, + 0x2d38b4d, + 0x2d60b4e, + 0x2d64b58, + 0x2d88b59, + 0x2d8cb62, + 0x2da0b63, + 0x2da4b68, + 0x2da8b69, + 0x2dc8b6a, + 0x2de4b72, 0x2de8b79, - 0x2e58b7a, - 0x2e5cb96, - 0x2e60b97, - 0x2e80b98, - 0x2e94ba0, - 0x2ea8ba5, - 0x2ec0baa, - 0x2edcbb0, - 0x2ef4bb7, - 0x2ef8bbd, - 0x2f10bbe, - 0x2f2cbc4, - 0x2f30bcb, - 0x2f50bcc, - 0x2f70bd4, - 0x2f8cbdc, - 0x2fecbe3, - 0x3008bfb, - 0x3018c02, - 0x301cc06, - 0x3034c07, - 0x3078c0d, - 0x30f8c1e, - 0x312cc3e, - 0x3130c4b, - 0x313cc4c, - 0x315cc4f, - 0x3160c57, - 0x3184c58, - 0x318cc61, - 0x31c8c63, - 0x3218c72, - 0x321cc86, - 0x3220c87, - 0x32e4c88, - 0x232e8cb9, - 0x232eccba, - 0x32f0cbb, - 0x232f4cbc, - 0x232f8cbd, - 0x232fccbe, - 0x2330ccbf, - 0x23310cc3, - 0x23314cc4, - 0x23318cc5, - 0x2331ccc6, - 0x3334cc7, - 0x3358ccd, - 0x3378cd6, - 0x39e4cde, - 0x39f0e79, - 0x3a10e7c, - 0x3bd0e84, - 0x3ca0ef4, - 0x3d10f28, - 0x3d68f44, - 0x3e50f5a, - 0x3ea8f94, - 0x3ee4faa, - 0x3fe0fb9, - 0x40acff8, - 0x414502b, - 0x41d5051, - 0x4239075, - 0x447108e, - 0x452911c, - 0x45f514a, - 0x464117d, - 0x46c9190, - 0x47051b2, - 0x47551c1, - 0x47cd1d5, - 0x647d11f3, - 0x647d51f4, - 0x647d91f5, - 0x48551f6, - 0x48b1215, - 0x492d22c, - 0x49a524b, - 0x4a25269, - 0x4a91289, - 0x4bbd2a4, - 0x4c152ef, - 0x64c19305, - 0x4cb1306, - 0x4cb532c, - 0x4d3d32d, - 0x4d8934f, - 0x4df1362, - 0x4e9937c, - 0x4f613a6, - 0x4fc93d8, - 0x50dd3f2, - 0x650e1437, - 0x650e5438, - 0x5141439, - 0x519d450, - 0x522d467, - 0x52a948b, - 0x52ed4aa, - 0x53d14bb, - 0x54054f4, - 0x5465501, - 0x54d9519, - 0x5561536, - 0x55a1558, - 0x5611568, - 0x65615584, - 0x563d585, - 0x564158f, - 0x5659590, - 0x5675596, - 0x56b959d, - 0x56c95ae, - 0x56e15b2, - 0x57595b8, - 0x57615d6, - 0x577d5d8, - 0x57915df, - 0x57ad5e4, - 0x57d95eb, - 0x57dd5f6, - 0x57e55f7, - 0x57f95f9, - 0x58195fe, - 0x5829606, - 0x583560a, - 0x587160d, - 0x587961c, - 0x588d61e, - 0x58b1623, - 0x58bd62c, - 0x58c562f, - 0x58e9631, - 0x590d63a, - 0x5925643, - 0x5929649, - 0x593164a, - 0x593564c, - 0x59d164d, - 0x59d5674, - 0x59d9675, - 0x59dd676, - 0x5a01677, - 0x5a25680, - 0x5a41689, - 0x5a55690, - 0x5a69695, - 0x5a7169a, - 0x5a7969c, - 0x5a8169e, - 0x5a996a0, - 0x5aa96a6, - 0x5aad6aa, - 0x5ac96ab, - 0x63596b2, - 0x63918d6, - 0x63bd8e4, - 0x63d98ef, - 0x63f98f6, - 0x64198fe, - 0x645d906, - 0x6465917, - 0x26469919, - 0x2646d91a, - 0x647591b, - 0x663d91d, - 0x2664198f, - 0x26651990, - 0x26659994, - 0x26665996, - 0x6669999, - 0x2667199a, - 0x668199c, - 0x66a99a0, - 0x66dd9aa, - 0x66e19b7, - 0x67199b8, - 0x67399c6, - 0x72919ce, - 0x7295ca4, - 0x7299ca5, - 0x2729dca6, - 0x72a1ca7, - 0x272a5ca8, - 0x72a9ca9, - 0x272b5caa, - 0x72b9cad, - 0x72bdcae, - 0x272c1caf, - 0x72c5cb0, - 0x272cdcb1, - 0x72d1cb3, - 0x72d5cb4, - 0x272e5cb5, - 0x72e9cb9, - 0x72edcba, - 0x72f1cbb, - 0x72f5cbc, - 0x272f9cbd, - 0x72fdcbe, - 0x7301cbf, - 0x7305cc0, - 0x7309cc1, - 0x27311cc2, - 0x7315cc4, - 0x7319cc5, - 0x731dcc6, - 0x27321cc7, - 0x7325cc8, - 0x2732dcc9, - 0x27331ccb, - 0x734dccc, - 0x7365cd3, - 0x27369cd9, - 0x73adcda, - 0x73b1ceb, - 0x73d5cec, - 0x73e1cf5, - 0x73e5cf8, - 0x73e9cf9, - 0x759dcfa, - 0x275a1d67, - 0x275a9d68, - 0x275add6a, - 0x275b1d6b, - 0x75b9d6c, - 0x7695d6e, - 0x276a1da5, - 0x276a5da8, - 0x276a9da9, - 0x276addaa, - 0x76b1dab, - 0x76dddac, - 0x76e1db7, - 0x76e5db8, - 0x7709db9, - 0x7715dc2, - 0x7735dc5, - 0x7739dcd, - 0x7771dce, - 0x7a21ddc, - 0x7adde88, - 0x7ae1eb7, - 0x7ae5eb8, - 0x7af9eb9, - 0x7b2debe, - 0x7b65ecb, - 0x27b69ed9, - 0x7b85eda, - 0x7badee1, - 0x7bb1eeb, - 0x7bd5eec, - 0x7bf1ef5, - 0x7c19efc, - 0x7c29f06, - 0x7c2df0a, - 0x7c31f0b, - 0x7c69f0c, - 0x7c75f1a, - 0x7c9df1d, - 0x7d1df27, - 0x27d21f47, - 0x7d31f48, - 0x7d3df4c, - 0x7d59f4f, - 0x7d79f56, - 0x7d7df5e, - 0x7d91f5f, - 0x7da5f64, - 0x7da9f69, - 0x7dc9f6a, - 0x7e71f72, - 0x7e75f9c, - 0x7e91f9d, - 0x7eb5fa4, - 0x7eb9fad, - 0x7ec1fae, - 0x7ed9fb0, - 0x7ee1fb6, - 0x7ef5fb8, - 0x7f15fbd, - 0x7f25fc5, - 0x7f31fc9, - 0x7f69fcc, - 0x803dfda, - 0x804200f, - 0x8056010, - 0x805e015, - 0x8076017, - 0x807a01d, - 0x808601e, - 0x808a021, - 0x808e022, - 0x80b2023, - 0x80f202c, - 0x80f603c, - 0x811603d, - 0x8166045, - 0x8182059, - 0x818a060, - 0x81e2062, - 0x81e6078, - 0x81ea079, - 0x81ee07a, - 0x823207b, - 0x824208c, - 0x8282090, - 0x82860a0, - 0x82b60a1, - 0x83fe0ad, - 0x84260ff, - 0x8456109, - 0x8476115, - 0x2847e11d, - 0x848611f, - 0x8492121, - 0x85a6124, - 0x85b2169, - 0x85be16c, - 0x85ca16f, - 0x85d6172, - 0x85e2175, - 0x85ee178, - 0x85fa17b, - 0x860617e, - 0x8612181, - 0x861e184, - 0x862a187, - 0x863618a, - 0x864218d, - 0x864a190, - 0x8656192, - 0x8662195, - 0x866e198, - 0x867a19b, - 0x868619e, - 0x86921a1, - 0x869e1a4, - 0x86aa1a7, - 0x86b61aa, - 0x86c21ad, - 0x86ce1b0, - 0x86fa1b3, - 0x87061be, - 0x87121c1, - 0x871e1c4, - 0x872a1c7, - 0x87361ca, - 0x873e1cd, - 0x874a1cf, - 0x87561d2, - 0x87621d5, - 0x876e1d8, - 0x877a1db, - 0x87861de, - 0x87921e1, - 0x879e1e4, - 0x87aa1e7, - 0x87b61ea, - 0x87c21ed, - 0x87ce1f0, - 0x87da1f3, - 0x87e21f6, - 0x87ee1f8, - 0x87fa1fb, - 0x88061fe, - 0x8812201, - 0x881e204, - 0x882a207, - 0x883620a, - 0x884220d, - 0x8846210, + 0x22decb7a, + 0x2df0b7b, + 0x2df4b7c, + 0x2df8b7d, + 0x2e00b7e, + 0x2e14b80, + 0x2e18b85, + 0x2e1cb86, + 0x2e44b87, + 0x2e48b91, + 0x2ebcb92, + 0x2ec0baf, + 0x2ec4bb0, + 0x2ee4bb1, + 0x2ef8bb9, + 0x2f0cbbe, + 0x2f24bc3, + 0x2f40bc9, + 0x2f58bd0, + 0x2f5cbd6, + 0x2f74bd7, + 0x2f90bdd, + 0x2f94be4, + 0x2fb4be5, + 0x2fd4bed, + 0x2ff0bf5, + 0x3054bfc, + 0x3070c15, + 0x3080c1c, + 0x3084c20, + 0x309cc21, + 0x30e0c27, + 0x3160c38, + 0x3190c58, + 0x3194c64, + 0x31a0c65, + 0x31c0c68, + 0x31c4c70, + 0x31e8c71, + 0x31f0c7a, + 0x322cc7c, + 0x327cc8b, + 0x3280c9f, + 0x3284ca0, + 0x3354ca1, + 0x23358cd5, + 0x2335ccd6, + 0x3360cd7, + 0x23364cd8, + 0x23368cd9, + 0x336ccda, + 0x23370cdb, + 0x23380cdc, + 0x23384ce0, + 0x23388ce1, + 0x2338cce2, + 0x23390ce3, + 0x33a8ce4, + 0x33cccea, + 0x33eccf3, + 0x3a58cfb, + 0x3a64e96, + 0x3a84e99, + 0x3c44ea1, + 0x3d14f11, + 0x3d84f45, + 0x3ddcf61, + 0x3ec4f77, + 0x3f1cfb1, + 0x3f58fc7, + 0x4054fd6, + 0x4121015, + 0x41b9048, + 0x424906e, + 0x42ad092, + 0x44e50ab, + 0x459d139, + 0x4669167, + 0x46b519a, + 0x473d1ad, + 0x47791cf, + 0x47c91de, + 0x48411f2, + 0x64845210, + 0x64849211, + 0x6484d212, + 0x48c9213, + 0x4925232, + 0x49a1249, + 0x4a19268, + 0x4a99286, + 0x4b052a6, + 0x4c312c1, + 0x4c8930c, + 0x64c8d322, + 0x4d25323, + 0x4d2d349, + 0x24d3134b, + 0x4db934c, + 0x4e0536e, + 0x4e6d381, + 0x4f1539b, + 0x4fdd3c5, + 0x50453f7, + 0x5159411, + 0x6515d456, + 0x65161457, + 0x51bd458, + 0x521946f, + 0x52a9486, + 0x53254aa, + 0x53694c9, + 0x544d4da, + 0x5481513, + 0x54e1520, + 0x5555538, + 0x55dd555, + 0x561d577, + 0x568d587, + 0x656915a3, + 0x56b95a4, + 0x56bd5ae, + 0x56d55af, + 0x56f15b5, + 0x57355bc, + 0x57455cd, + 0x575d5d1, + 0x57d55d7, + 0x57dd5f5, + 0x57f95f7, + 0x580d5fe, + 0x5829603, + 0x585560a, + 0x5859615, + 0x5861616, + 0x5875618, + 0x589561d, + 0x58a5625, + 0x58b1629, + 0x58ed62c, + 0x58f563b, + 0x590963d, + 0x592d642, + 0x593964b, + 0x594164e, + 0x5965650, + 0x5989659, + 0x59a1662, + 0x59a5668, + 0x59ad669, + 0x59b166b, + 0x5a5166c, + 0x5a55694, + 0x5a59695, + 0x5a5d696, + 0x5a81697, + 0x5aa56a0, + 0x5ac16a9, + 0x5ad56b0, + 0x5ae96b5, + 0x5af16ba, + 0x5af96bc, + 0x5b016be, + 0x5b196c0, + 0x5b296c6, + 0x5b2d6ca, + 0x5b496cb, + 0x63d16d2, + 0x64098f4, + 0x6435902, + 0x645190d, + 0x6471914, + 0x649191c, + 0x64d5924, + 0x64dd935, + 0x264e1937, + 0x264e5938, + 0x64ed939, + 0x66c593b, + 0x266c99b1, + 0x66cd9b2, + 0x266dd9b3, + 0x266e59b7, + 0x266f19b9, + 0x66f59bc, + 0x266fd9bd, + 0x67059bf, + 0x67159c1, + 0x673d9c5, + 0x67799cf, + 0x677d9de, + 0x67b59df, + 0x67d99ed, + 0x73319f6, + 0x7335ccc, + 0x7339ccd, + 0x2733dcce, + 0x7341ccf, + 0x27345cd0, + 0x7349cd1, + 0x27355cd2, + 0x7359cd5, + 0x735dcd6, + 0x27361cd7, + 0x7365cd8, + 0x2736dcd9, + 0x7371cdb, + 0x7375cdc, + 0x27385cdd, + 0x7389ce1, + 0x738dce2, + 0x7391ce3, + 0x7395ce4, + 0x27399ce5, + 0x739dce6, + 0x73a1ce7, + 0x73a5ce8, + 0x73a9ce9, + 0x273b1cea, + 0x73b5cec, + 0x73b9ced, + 0x73bdcee, + 0x273c1cef, + 0x73c5cf0, + 0x273cdcf1, + 0x273d1cf3, + 0x73edcf4, + 0x7405cfb, + 0x27409d01, + 0x744dd02, + 0x7451d13, + 0x7475d14, + 0x7481d1d, + 0x7485d20, + 0x7489d21, + 0x7645d22, + 0x27649d91, + 0x27651d92, + 0x27655d94, + 0x27659d95, + 0x7661d96, + 0x773dd98, + 0x27749dcf, + 0x2774ddd2, + 0x27751dd3, + 0x27755dd4, + 0x7759dd5, + 0x7785dd6, + 0x7789de1, + 0x778dde2, + 0x77b1de3, + 0x77bddec, + 0x77dddef, + 0x77e1df7, + 0x7819df8, + 0x7ac9e06, + 0x7b85eb2, + 0x7b89ee1, + 0x7b8dee2, + 0x7ba1ee3, + 0x7bd5ee8, + 0x7c0def5, + 0x27c11f03, + 0x7c2df04, + 0x7c55f0b, + 0x7c59f15, + 0x7c7df16, + 0x7c99f1f, + 0x7cc1f26, + 0x7cd1f30, + 0x7cd5f34, + 0x7cd9f35, + 0x7d11f36, + 0x7d1df44, + 0x7d45f47, + 0x7dc5f51, + 0x27dc9f71, + 0x7dd9f72, + 0x7de9f76, + 0x7e05f7a, + 0x7e25f81, + 0x7e29f89, + 0x7e3df8a, + 0x7e51f8f, + 0x7e55f94, + 0x7e59f95, + 0x7e5df96, + 0x7e7df97, + 0x7f25f9f, + 0x7f29fc9, + 0x7f45fca, + 0x7f69fd1, + 0x7f6dfda, + 0x7f75fdb, + 0x7f91fdd, + 0x7f99fe4, + 0x7fadfe6, + 0x7fcdfeb, + 0x7fe9ff3, + 0x7ff5ffa, + 0x800dffd, + 0x8046003, + 0x811a011, + 0x811e046, + 0x8132047, + 0x813a04c, + 0x815204e, + 0x8156054, + 0x8162055, + 0x8166058, + 0x816a059, + 0x816e05a, + 0x819205b, + 0x81d2064, + 0x81d6074, + 0x81f6075, + 0x824607d, + 0x826a091, + 0x2826e09a, + 0x827609b, + 0x82ce09d, + 0x82d20b3, + 0x82d60b4, + 0x82da0b5, + 0x831e0b6, + 0x832e0c7, + 0x836e0cb, + 0x83720db, + 0x83a20dc, + 0x84ee0e8, + 0x851613b, + 0x8546145, + 0x8566151, + 0x2856e159, + 0x857615b, + 0x858215d, + 0x8696160, + 0x86a21a5, + 0x86ae1a8, + 0x86ba1ab, + 0x86c61ae, + 0x86d21b1, + 0x86de1b4, + 0x86ea1b7, + 0x86f61ba, + 0x87021bd, + 0x870e1c0, + 0x871a1c3, + 0x87261c6, + 0x87321c9, + 0x873a1cc, + 0x87461ce, + 0x87521d1, + 0x875e1d4, + 0x876a1d7, + 0x87761da, + 0x87821dd, + 0x878e1e0, + 0x879a1e3, + 0x87a61e6, + 0x87b21e9, + 0x87be1ec, + 0x87ea1ef, + 0x87f61fa, + 0x88021fd, + 0x880e200, + 0x881a203, + 0x8826206, + 0x882e209, + 0x883a20b, + 0x884620e, 0x8852211, - 0x886e214, - 0x887221b, - 0x888221c, - 0x889e220, - 0x88e2227, - 0x88e6238, - 0x88fa239, - 0x892e23e, - 0x893e24b, - 0x894624f, - 0x896a251, - 0x898225a, - 0x899a260, - 0x89b2266, - 0x89c626c, - 0x28a0a271, - 0x8a0e282, - 0x8a3a283, - 0x8a4628e, - 0x8a5a291, + 0x885e214, + 0x886a217, + 0x887621a, + 0x888221d, + 0x888e220, + 0x889a223, + 0x88a6226, + 0x88b2229, + 0x88be22c, + 0x88ca22f, + 0x88d2232, + 0x88de234, + 0x88ea237, + 0x88f623a, + 0x890223d, + 0x890e240, + 0x891a243, + 0x8926246, + 0x8932249, + 0x893624c, + 0x894224d, + 0x895e250, + 0x8962257, + 0x8972258, + 0x899625c, + 0x899a265, + 0x89de266, + 0x89e2277, + 0x89f6278, + 0x8a2a27d, + 0x8a3a28a, + 0x8a4228e, + 0x8a66290, + 0x8a7e299, + 0x8a9629f, + 0x8aae2a5, + 0x8ac22ab, + 0x28b0a2b0, + 0x8b0e2c2, + 0x8b3a2c3, + 0x8b4a2ce, + 0x8b5e2d2, } -// max children 563 (capacity 1023) -// max text offset 30521 (capacity 32767) +// max children 580 (capacity 1023) +// max text offset 30618 (capacity 32767) // max text length 36 (capacity 63) -// max hi 8854 (capacity 16383) -// max lo 8849 (capacity 16383) +// max hi 8919 (capacity 16383) +// max lo 8914 (capacity 16383) diff --git a/vendor/golang.org/x/tools/cmd/goimports/goimports.go b/vendor/golang.org/x/tools/cmd/goimports/goimports.go index a476a7f3c3..a5680d8d6c 100644 --- a/vendor/golang.org/x/tools/cmd/goimports/goimports.go +++ b/vendor/golang.org/x/tools/cmd/goimports/goimports.go @@ -45,8 +45,12 @@ var ( Fragment: true, // This environment, and its caches, will be reused for the whole run. Env: &imports.ProcessEnv{ - GOPATH: build.Default.GOPATH, - GOROOT: build.Default.GOROOT, + GOPATH: build.Default.GOPATH, + GOROOT: build.Default.GOROOT, + GOFLAGS: os.Getenv("GOFLAGS"), + GO111MODULE: os.Getenv("GO111MODULE"), + GOPROXY: os.Getenv("GOPROXY"), + GOSUMDB: os.Getenv("GOSUMDB"), }, } exitCode = 0 @@ -258,7 +262,7 @@ func gofmtMain() { if verbose { log.SetFlags(log.LstdFlags | log.Lmicroseconds) - options.Env.Debug = true + options.Env.Logf = log.Printf } if options.TabWidth < 0 { fmt.Fprintf(os.Stderr, "negative tabwidth %d\n", options.TabWidth) diff --git a/vendor/golang.org/x/tools/go/analysis/doc.go b/vendor/golang.org/x/tools/go/analysis/doc.go index a2353fc88b..ea56b724e8 100644 --- a/vendor/golang.org/x/tools/go/analysis/doc.go +++ b/vendor/golang.org/x/tools/go/analysis/doc.go @@ -1,8 +1,9 @@ /* -The analysis package defines the interface between a modular static +Package analysis defines the interface between a modular static analysis and an analysis driver program. + Background A static analysis is a function that inspects a package of Go code and @@ -41,9 +42,9 @@ the go/analysis/passes/ subdirectory: package unusedresult var Analyzer = &analysis.Analyzer{ - Name: "unusedresult", - Doc: "check for unused results of calls to some functions", - Run: run, + Name: "unusedresult", + Doc: "check for unused results of calls to some functions", + Run: run, ... } @@ -51,7 +52,6 @@ the go/analysis/passes/ subdirectory: ... } - An analysis driver is a program such as vet that runs a set of analyses and prints the diagnostics that they report. The driver program must import the list of Analyzers it needs. @@ -70,51 +70,18 @@ A driver may use the name, flags, and documentation to provide on-line help that describes the analyses it performs. The doc comment contains a brief one-line summary, optionally followed by paragraphs of explanation. -The vet command, shown below, is an example of a driver that runs -multiple analyzers. It is based on the multichecker package -(see the "Standalone commands" section for details). - - $ go build golang.org/x/tools/go/analysis/cmd/vet - $ ./vet help - vet is a tool for static analysis of Go programs. - - Usage: vet [-flag] [package] - - Registered analyzers: - - asmdecl report mismatches between assembly files and Go declarations - assign check for useless assignments - atomic check for common mistakes using the sync/atomic package - ... - unusedresult check for unused results of calls to some functions - - $ ./vet help unusedresult - unusedresult: check for unused results of calls to some functions - - Analyzer flags: - - -unusedresult.funcs value - comma-separated list of functions whose results must be used (default Error,String) - -unusedresult.stringmethods value - comma-separated list of names of methods of type func() string whose results must be used - - Some functions like fmt.Errorf return a result and have no side effects, - so it is always a mistake to discard the result. This analyzer reports - calls to certain functions in which the result of the call is ignored. - - The set of functions may be controlled using flags. The Analyzer type has more fields besides those shown above: type Analyzer struct { - Name string - Doc string - Flags flag.FlagSet - Run func(*Pass) (interface{}, error) - RunDespiteErrors bool - ResultType reflect.Type - Requires []*Analyzer - FactTypes []Fact + Name string + Doc string + Flags flag.FlagSet + Run func(*Pass) (interface{}, error) + RunDespiteErrors bool + ResultType reflect.Type + Requires []*Analyzer + FactTypes []Fact } The Flags field declares a set of named (global) flag variables that @@ -154,13 +121,13 @@ package being analyzed, and provides operations to the Run function for reporting diagnostics and other information back to the driver. type Pass struct { - Fset *token.FileSet - Files []*ast.File - OtherFiles []string - Pkg *types.Package - TypesInfo *types.Info - ResultOf map[*Analyzer]interface{} - Report func(Diagnostic) + Fset *token.FileSet + Files []*ast.File + OtherFiles []string + Pkg *types.Package + TypesInfo *types.Info + ResultOf map[*Analyzer]interface{} + Report func(Diagnostic) ... } @@ -245,7 +212,7 @@ package. An Analyzer that uses facts must declare their types: var Analyzer = &analysis.Analyzer{ - Name: "printf", + Name: "printf", FactTypes: []analysis.Fact{new(isWrapper)}, ... } @@ -330,7 +297,5 @@ entirety as: A tool that provides multiple analyzers can use multichecker in a similar way, giving it the list of Analyzers. - - */ package analysis diff --git a/vendor/golang.org/x/tools/go/ast/astutil/imports.go b/vendor/golang.org/x/tools/go/ast/astutil/imports.go index 3e4b195368..2087ceec9c 100644 --- a/vendor/golang.org/x/tools/go/ast/astutil/imports.go +++ b/vendor/golang.org/x/tools/go/ast/astutil/imports.go @@ -275,9 +275,10 @@ func DeleteNamedImport(fset *token.FileSet, f *ast.File, name, path string) (del // We deleted an entry but now there may be // a blank line-sized hole where the import was. - if line-lastLine > 1 { + if line-lastLine > 1 || !gen.Rparen.IsValid() { // There was a blank line immediately preceding the deleted import, - // so there's no need to close the hole. + // so there's no need to close the hole. The right parenthesis is + // invalid after AddImport to an import statement without parenthesis. // Do nothing. } else if line != fset.File(gen.Rparen).LineCount() { // There was no blank line. Close the hole. diff --git a/vendor/golang.org/x/tools/go/ast/inspector/inspector.go b/vendor/golang.org/x/tools/go/ast/inspector/inspector.go index ddbdd3f08f..3084508b5f 100644 --- a/vendor/golang.org/x/tools/go/ast/inspector/inspector.go +++ b/vendor/golang.org/x/tools/go/ast/inspector/inspector.go @@ -90,7 +90,7 @@ func (in *Inspector) Preorder(types []ast.Node, f func(ast.Node)) { // The types argument, if non-empty, enables type-based filtering of // events. The function f if is called only for nodes whose type // matches an element of the types slice. -func (in *Inspector) Nodes(types []ast.Node, f func(n ast.Node, push bool) (prune bool)) { +func (in *Inspector) Nodes(types []ast.Node, f func(n ast.Node, push bool) (proceed bool)) { mask := maskOf(types) for i := 0; i < len(in.events); { ev := in.events[i] @@ -114,7 +114,7 @@ func (in *Inspector) Nodes(types []ast.Node, f func(n ast.Node, push bool) (prun // supplies each call to f an additional argument, the current // traversal stack. The stack's first element is the outermost node, // an *ast.File; its last is the innermost, n. -func (in *Inspector) WithStack(types []ast.Node, f func(n ast.Node, push bool, stack []ast.Node) (prune bool)) { +func (in *Inspector) WithStack(types []ast.Node, f func(n ast.Node, push bool, stack []ast.Node) (proceed bool)) { mask := maskOf(types) var stack []ast.Node for i := 0; i < len(in.events); { diff --git a/vendor/golang.org/x/tools/go/internal/gcimporter/gcimporter.go b/vendor/golang.org/x/tools/go/internal/gcimporter/gcimporter.go index 9cf186605f..8dcd8bbb71 100644 --- a/vendor/golang.org/x/tools/go/internal/gcimporter/gcimporter.go +++ b/vendor/golang.org/x/tools/go/internal/gcimporter/gcimporter.go @@ -344,7 +344,7 @@ func (p *parser) expectKeyword(keyword string) { // PackageId = string_lit . // -func (p *parser) parsePackageId() string { +func (p *parser) parsePackageID() string { id, err := strconv.Unquote(p.expect(scanner.String)) if err != nil { p.error(err) @@ -384,7 +384,7 @@ func (p *parser) parseDotIdent() string { // func (p *parser) parseQualifiedName() (id, name string) { p.expect('@') - id = p.parsePackageId() + id = p.parsePackageID() p.expect('.') // Per rev f280b8a485fd (10/2/2013), qualified names may be used for anonymous fields. if p.tok == '?' { @@ -696,7 +696,7 @@ func (p *parser) parseInterfaceType(parent *types.Package) types.Type { // Complete requires the type's embedded interfaces to be fully defined, // but we do not define any - return types.NewInterface(methods, nil).Complete() + return newInterface(methods, nil).Complete() } // ChanType = ( "chan" [ "<-" ] | "<-" "chan" ) Type . @@ -785,7 +785,7 @@ func (p *parser) parseType(parent *types.Package) types.Type { func (p *parser) parseImportDecl() { p.expectKeyword("import") name := p.parsePackageName() - p.getPkg(p.parsePackageId(), name) + p.getPkg(p.parsePackageID(), name) } // int_lit = [ "+" | "-" ] { "0" ... "9" } . diff --git a/vendor/golang.org/x/tools/go/internal/packagesdriver/sizes.go b/vendor/golang.org/x/tools/go/internal/packagesdriver/sizes.go index db0c9a7ea6..5ee692d383 100644 --- a/vendor/golang.org/x/tools/go/internal/packagesdriver/sizes.go +++ b/vendor/golang.org/x/tools/go/internal/packagesdriver/sizes.go @@ -11,11 +11,10 @@ import ( "encoding/json" "fmt" "go/types" - "log" - "os" "os/exec" "strings" - "time" + + "golang.org/x/tools/internal/gocommand" ) var debug = false @@ -78,97 +77,42 @@ func GetSizes(ctx context.Context, buildFlags, env []string, dir string, usesExp } func GetSizesGolist(ctx context.Context, buildFlags, env []string, dir string, usesExportData bool) (types.Sizes, error) { - args := []string{"list", "-f", "{{context.GOARCH}} {{context.Compiler}}"} - args = append(args, buildFlags...) - args = append(args, "--", "unsafe") - stdout, stderr, err := invokeGo(ctx, env, dir, usesExportData, args...) + inv := gocommand.Invocation{ + Verb: "list", + Args: []string{"-f", "{{context.GOARCH}} {{context.Compiler}}", "--", "unsafe"}, + Env: env, + BuildFlags: buildFlags, + WorkingDir: dir, + } + stdout, stderr, friendlyErr, rawErr := inv.RunRaw(ctx) var goarch, compiler string - if err != nil { - if strings.Contains(err.Error(), "cannot find main module") { + if rawErr != nil { + if strings.Contains(rawErr.Error(), "cannot find main module") { // User's running outside of a module. All bets are off. Get GOARCH and guess compiler is gc. // TODO(matloob): Is this a problem in practice? - envout, _, enverr := invokeGo(ctx, env, dir, usesExportData, "env", "GOARCH") + inv := gocommand.Invocation{ + Verb: "env", + Args: []string{"GOARCH"}, + Env: env, + WorkingDir: dir, + } + envout, enverr := inv.Run(ctx) if enverr != nil { - return nil, err + return nil, enverr } goarch = strings.TrimSpace(envout.String()) compiler = "gc" } else { - return nil, err + return nil, friendlyErr } } else { fields := strings.Fields(stdout.String()) if len(fields) < 2 { - return nil, fmt.Errorf("could not parse GOARCH and Go compiler in format \" \" from stdout of go command:\n%s\ndir: %s\nstdout: <<%s>>\nstderr: <<%s>>", - cmdDebugStr(env, args...), dir, stdout.String(), stderr.String()) + return nil, fmt.Errorf("could not parse GOARCH and Go compiler in format \" \":\nstdout: <<%s>>\nstderr: <<%s>>", + stdout.String(), stderr.String()) } goarch = fields[0] compiler = fields[1] } return types.SizesFor(compiler, goarch), nil } - -// invokeGo returns the stdout and stderr of a go command invocation. -func invokeGo(ctx context.Context, env []string, dir string, usesExportData bool, args ...string) (*bytes.Buffer, *bytes.Buffer, error) { - if debug { - defer func(start time.Time) { log.Printf("%s for %v", time.Since(start), cmdDebugStr(env, args...)) }(time.Now()) - } - stdout := new(bytes.Buffer) - stderr := new(bytes.Buffer) - cmd := exec.CommandContext(ctx, "go", args...) - // On darwin the cwd gets resolved to the real path, which breaks anything that - // expects the working directory to keep the original path, including the - // go command when dealing with modules. - // The Go stdlib has a special feature where if the cwd and the PWD are the - // same node then it trusts the PWD, so by setting it in the env for the child - // process we fix up all the paths returned by the go command. - cmd.Env = append(append([]string{}, env...), "PWD="+dir) - cmd.Dir = dir - cmd.Stdout = stdout - cmd.Stderr = stderr - if err := cmd.Run(); err != nil { - exitErr, ok := err.(*exec.ExitError) - if !ok { - // Catastrophic error: - // - executable not found - // - context cancellation - return nil, nil, fmt.Errorf("couldn't exec 'go %v': %s %T", args, err, err) - } - - // Export mode entails a build. - // If that build fails, errors appear on stderr - // (despite the -e flag) and the Export field is blank. - // Do not fail in that case. - if !usesExportData { - return nil, nil, fmt.Errorf("go %v: %s: %s", args, exitErr, stderr) - } - } - - // As of writing, go list -export prints some non-fatal compilation - // errors to stderr, even with -e set. We would prefer that it put - // them in the Package.Error JSON (see https://golang.org/issue/26319). - // In the meantime, there's nowhere good to put them, but they can - // be useful for debugging. Print them if $GOPACKAGESPRINTGOLISTERRORS - // is set. - if len(stderr.Bytes()) != 0 && os.Getenv("GOPACKAGESPRINTGOLISTERRORS") != "" { - fmt.Fprintf(os.Stderr, "%s stderr: <<%s>>\n", cmdDebugStr(env, args...), stderr) - } - - // debugging - if false { - fmt.Fprintf(os.Stderr, "%s stdout: <<%s>>\n", cmdDebugStr(env, args...), stdout) - } - - return stdout, stderr, nil -} - -func cmdDebugStr(envlist []string, args ...string) string { - env := make(map[string]string) - for _, kv := range envlist { - split := strings.Split(kv, "=") - k, v := split[0], split[1] - env[k] = v - } - - return fmt.Sprintf("GOROOT=%v GOPATH=%v GO111MODULE=%v PWD=%v go %v", env["GOROOT"], env["GOPATH"], env["GO111MODULE"], env["PWD"], args) -} diff --git a/vendor/golang.org/x/tools/go/packages/doc.go b/vendor/golang.org/x/tools/go/packages/doc.go index 3799f8ed8b..4bfe28a51f 100644 --- a/vendor/golang.org/x/tools/go/packages/doc.go +++ b/vendor/golang.org/x/tools/go/packages/doc.go @@ -60,8 +60,7 @@ causes Load to run in LoadFiles mode, collecting minimal information. See the documentation for type Config for details. As noted earlier, the Config.Mode controls the amount of detail -reported about the loaded packages, with each mode returning all the data of the -previous mode with some extra added. See the documentation for type LoadMode +reported about the loaded packages. See the documentation for type LoadMode for details. Most tools should pass their command-line arguments (after any flags) diff --git a/vendor/golang.org/x/tools/go/packages/external.go b/vendor/golang.org/x/tools/go/packages/external.go index 6ac3e4f5b5..8c8473fd0b 100644 --- a/vendor/golang.org/x/tools/go/packages/external.go +++ b/vendor/golang.org/x/tools/go/packages/external.go @@ -84,13 +84,14 @@ func findExternalDriver(cfg *Config) driver { cmd.Stdin = bytes.NewReader(req) cmd.Stdout = buf cmd.Stderr = stderr - if len(stderr.Bytes()) != 0 && os.Getenv("GOPACKAGESPRINTDRIVERERRORS") != "" { - fmt.Fprintf(os.Stderr, "%s stderr: <<%s>>\n", cmdDebugStr(cmd, words...), stderr) - } if err := cmd.Run(); err != nil { return nil, fmt.Errorf("%v: %v: %s", tool, err, cmd.Stderr) } + if len(stderr.Bytes()) != 0 && os.Getenv("GOPACKAGESPRINTDRIVERERRORS") != "" { + fmt.Fprintf(os.Stderr, "%s stderr: <<%s>>\n", cmdDebugStr(cmd, words...), stderr) + } + var response driverResponse if err := json.Unmarshal(buf.Bytes(), &response); err != nil { return nil, err diff --git a/vendor/golang.org/x/tools/go/packages/golist.go b/vendor/golang.org/x/tools/go/packages/golist.go index 648e364313..b4a13ef454 100644 --- a/vendor/golang.org/x/tools/go/packages/golist.go +++ b/vendor/golang.org/x/tools/go/packages/golist.go @@ -6,27 +6,25 @@ package packages import ( "bytes" + "context" "encoding/json" "fmt" "go/types" - "io/ioutil" "log" "os" "os/exec" "path" "path/filepath" "reflect" - "regexp" + "sort" "strconv" "strings" "sync" - "time" "unicode" "golang.org/x/tools/go/internal/packagesdriver" - "golang.org/x/tools/internal/gopathwalk" - "golang.org/x/tools/internal/semver" - "golang.org/x/tools/internal/span" + "golang.org/x/tools/internal/gocommand" + "golang.org/x/tools/internal/packagesinternal" ) // debug controls verbose logging. @@ -45,16 +43,21 @@ type responseDeduper struct { dr *driverResponse } -// init fills in r with a driverResponse. -func (r *responseDeduper) init(dr *driverResponse) { - r.dr = dr - r.seenRoots = map[string]bool{} - r.seenPackages = map[string]*Package{} +func newDeduper() *responseDeduper { + return &responseDeduper{ + dr: &driverResponse{}, + seenRoots: map[string]bool{}, + seenPackages: map[string]*Package{}, + } +} + +// addAll fills in r with a driverResponse. +func (r *responseDeduper) addAll(dr *driverResponse) { for _, pkg := range dr.Packages { - r.seenPackages[pkg.ID] = pkg + r.addPackage(pkg) } for _, root := range dr.Roots { - r.seenRoots[root] = true + r.addRoot(root) } } @@ -74,25 +77,47 @@ func (r *responseDeduper) addRoot(id string) { r.dr.Roots = append(r.dr.Roots, id) } -// goInfo contains global information from the go tool. -type goInfo struct { - rootDirs map[string]string - env goEnv +type golistState struct { + cfg *Config + ctx context.Context + + envOnce sync.Once + goEnvError error + goEnv map[string]string + + rootsOnce sync.Once + rootDirsError error + rootDirs map[string]string + + // vendorDirs caches the (non)existence of vendor directories. + vendorDirs map[string]bool } -type goEnv struct { - modulesOn bool +// getEnv returns Go environment variables. Only specific variables are +// populated -- computing all of them is slow. +func (state *golistState) getEnv() (map[string]string, error) { + state.envOnce.Do(func() { + var b *bytes.Buffer + b, state.goEnvError = state.invokeGo("env", "-json", "GOMOD", "GOPATH") + if state.goEnvError != nil { + return + } + + state.goEnv = make(map[string]string) + decoder := json.NewDecoder(b) + if state.goEnvError = decoder.Decode(&state.goEnv); state.goEnvError != nil { + return + } + }) + return state.goEnv, state.goEnvError } -func determineEnv(cfg *Config) goEnv { - buf, err := invokeGo(cfg, "env", "GOMOD") +// mustGetEnv is a convenience function that can be used if getEnv has already succeeded. +func (state *golistState) mustGetEnv() map[string]string { + env, err := state.getEnv() if err != nil { - return goEnv{} + panic(fmt.Sprintf("mustGetEnv: %v", err)) } - gomod := bytes.TrimSpace(buf.Bytes()) - - env := goEnv{} - env.modulesOn = len(gomod) > 0 return env } @@ -100,47 +125,38 @@ func determineEnv(cfg *Config) goEnv { // the build system package structure. // See driver for more details. func goListDriver(cfg *Config, patterns ...string) (*driverResponse, error) { - var sizes types.Sizes + // Make sure that any asynchronous go commands are killed when we return. + parentCtx := cfg.Context + if parentCtx == nil { + parentCtx = context.Background() + } + ctx, cancel := context.WithCancel(parentCtx) + defer cancel() + + response := newDeduper() + + // Fill in response.Sizes asynchronously if necessary. var sizeserr error var sizeswg sync.WaitGroup if cfg.Mode&NeedTypesSizes != 0 || cfg.Mode&NeedTypes != 0 { sizeswg.Add(1) go func() { - sizes, sizeserr = getSizes(cfg) + var sizes types.Sizes + sizes, sizeserr = packagesdriver.GetSizesGolist(ctx, cfg.BuildFlags, cfg.Env, cfg.Dir, usesExportData(cfg)) + // types.SizesFor always returns nil or a *types.StdSizes. + response.dr.Sizes, _ = sizes.(*types.StdSizes) sizeswg.Done() }() } - defer sizeswg.Wait() - - // start fetching rootDirs - var info goInfo - var rootDirsReady, envReady = make(chan struct{}), make(chan struct{}) - go func() { - info.rootDirs = determineRootDirs(cfg) - close(rootDirsReady) - }() - go func() { - info.env = determineEnv(cfg) - close(envReady) - }() - getGoInfo := func() *goInfo { - <-rootDirsReady - <-envReady - return &info - } - - // Ensure that we don't leak goroutines: Load is synchronous, so callers will - // not expect it to access the fields of cfg after the call returns. - defer getGoInfo() - // always pass getGoInfo to golistDriver - golistDriver := func(cfg *Config, patterns ...string) (*driverResponse, error) { - return golistDriver(cfg, getGoInfo, patterns...) + state := &golistState{ + cfg: cfg, + ctx: ctx, + vendorDirs: map[string]bool{}, } // Determine files requested in contains patterns var containFiles []string - var packagesNamed []string restPatterns := make([]string, 0, len(patterns)) // Extract file= and other [querytype]= patterns. Report an error if querytype // doesn't exist. @@ -156,8 +172,6 @@ extractQueries: containFiles = append(containFiles, value) case "pattern": restPatterns = append(restPatterns, value) - case "iamashamedtousethedisabledqueryname": - packagesNamed = append(packagesNamed, value) case "": // not a reserved query restPatterns = append(restPatterns, pattern) default: @@ -173,52 +187,34 @@ extractQueries: } } - response := &responseDeduper{} - var err error - // See if we have any patterns to pass through to go list. Zero initial // patterns also requires a go list call, since it's the equivalent of // ".". if len(restPatterns) > 0 || len(patterns) == 0 { - dr, err := golistDriver(cfg, restPatterns...) + dr, err := state.createDriverResponse(restPatterns...) if err != nil { return nil, err } - response.init(dr) - } else { - response.init(&driverResponse{}) - } - - sizeswg.Wait() - if sizeserr != nil { - return nil, sizeserr + response.addAll(dr) } - // types.SizesFor always returns nil or a *types.StdSizes - response.dr.Sizes, _ = sizes.(*types.StdSizes) - - var containsCandidates []string if len(containFiles) != 0 { - if err := runContainsQueries(cfg, golistDriver, response, containFiles, getGoInfo); err != nil { - return nil, err - } - } - - if len(packagesNamed) != 0 { - if err := runNamedQueries(cfg, golistDriver, response, packagesNamed); err != nil { + if err := state.runContainsQueries(response, containFiles); err != nil { return nil, err } } - modifiedPkgs, needPkgs, err := processGolistOverlay(cfg, response, getGoInfo) + modifiedPkgs, needPkgs, err := state.processGolistOverlay(response) if err != nil { return nil, err } + + var containsCandidates []string if len(containFiles) > 0 { containsCandidates = append(containsCandidates, modifiedPkgs...) containsCandidates = append(containsCandidates, needPkgs...) } - if err := addNeededOverlayPackages(cfg, golistDriver, response, needPkgs, getGoInfo); err != nil { + if err := state.addNeededOverlayPackages(response, needPkgs); err != nil { return nil, err } // Check candidate packages for containFiles. @@ -247,33 +243,32 @@ extractQueries: } } + sizeswg.Wait() + if sizeserr != nil { + return nil, sizeserr + } return response.dr, nil } -func addNeededOverlayPackages(cfg *Config, driver driver, response *responseDeduper, pkgs []string, getGoInfo func() *goInfo) error { +func (state *golistState) addNeededOverlayPackages(response *responseDeduper, pkgs []string) error { if len(pkgs) == 0 { return nil } - drivercfg := *cfg - if getGoInfo().env.modulesOn { - drivercfg.BuildFlags = append(drivercfg.BuildFlags, "-mod=readonly") - } - dr, err := driver(&drivercfg, pkgs...) - + dr, err := state.createDriverResponse(pkgs...) if err != nil { return err } for _, pkg := range dr.Packages { response.addPackage(pkg) } - _, needPkgs, err := processGolistOverlay(cfg, response, getGoInfo) + _, needPkgs, err := state.processGolistOverlay(response) if err != nil { return err } - return addNeededOverlayPackages(cfg, driver, response, needPkgs, getGoInfo) + return state.addNeededOverlayPackages(response, needPkgs) } -func runContainsQueries(cfg *Config, driver driver, response *responseDeduper, queries []string, goInfo func() *goInfo) error { +func (state *golistState) runContainsQueries(response *responseDeduper, queries []string) error { for _, query := range queries { // TODO(matloob): Do only one query per directory. fdir := filepath.Dir(query) @@ -283,42 +278,16 @@ func runContainsQueries(cfg *Config, driver driver, response *responseDeduper, q if err != nil { return fmt.Errorf("could not determine absolute path of file= query path %q: %v", query, err) } - dirResponse, err := driver(cfg, pattern) - if err != nil { - var queryErr error - if dirResponse, queryErr = adHocPackage(cfg, driver, pattern, query); queryErr != nil { - return err // return the original error - } - } - // `go list` can report errors for files that are not listed as part of a package's GoFiles. - // In the case of an invalid Go file, we should assume that it is part of package if only - // one package is in the response. The file may have valid contents in an overlay. - if len(dirResponse.Packages) == 1 { - pkg := dirResponse.Packages[0] - for i, err := range pkg.Errors { - s := errorSpan(err) - if !s.IsValid() { - break - } - if len(pkg.CompiledGoFiles) == 0 { - break - } - dir := filepath.Dir(pkg.CompiledGoFiles[0]) - filename := filepath.Join(dir, filepath.Base(s.URI().Filename())) - if info, err := os.Stat(filename); err != nil || info.IsDir() { - break - } - if !contains(pkg.CompiledGoFiles, filename) { - pkg.CompiledGoFiles = append(pkg.CompiledGoFiles, filename) - pkg.GoFiles = append(pkg.GoFiles, filename) - pkg.Errors = append(pkg.Errors[:i], pkg.Errors[i+1:]...) - } - } - } - // A final attempt to construct an ad-hoc package. - if len(dirResponse.Packages) == 1 && len(dirResponse.Packages[0].Errors) == 1 { + dirResponse, err := state.createDriverResponse(pattern) + + // If there was an error loading the package, or the package is returned + // with errors, try to load the file as an ad-hoc package. + // Usually the error will appear in a returned package, but may not if we're + // in module mode and the ad-hoc is located outside a module. + if err != nil || len(dirResponse.Packages) == 1 && len(dirResponse.Packages[0].GoFiles) == 0 && + len(dirResponse.Packages[0].Errors) == 1 { var queryErr error - if dirResponse, queryErr = adHocPackage(cfg, driver, pattern, query); queryErr != nil { + if dirResponse, queryErr = state.adhocPackage(pattern, query); queryErr != nil { return err // return the original error } } @@ -347,345 +316,47 @@ func runContainsQueries(cfg *Config, driver driver, response *responseDeduper, q return nil } -// adHocPackage attempts to construct an ad-hoc package given a query that failed. -func adHocPackage(cfg *Config, driver driver, pattern, query string) (*driverResponse, error) { - // There was an error loading the package. Try to load the file as an ad-hoc package. - // Usually the error will appear in a returned package, but may not if we're in modules mode - // and the ad-hoc is located outside a module. - dirResponse, err := driver(cfg, query) +// adhocPackage attempts to load or construct an ad-hoc package for a given +// query, if the original call to the driver produced inadequate results. +func (state *golistState) adhocPackage(pattern, query string) (*driverResponse, error) { + response, err := state.createDriverResponse(query) if err != nil { return nil, err } - // If we get nothing back from `go list`, try to make this file into its own ad-hoc package. - if len(dirResponse.Packages) == 0 && err == nil { - dirResponse.Packages = append(dirResponse.Packages, &Package{ + // If we get nothing back from `go list`, + // try to make this file into its own ad-hoc package. + // TODO(rstambler): Should this check against the original response? + if len(response.Packages) == 0 { + response.Packages = append(response.Packages, &Package{ ID: "command-line-arguments", PkgPath: query, GoFiles: []string{query}, CompiledGoFiles: []string{query}, Imports: make(map[string]*Package), }) - dirResponse.Roots = append(dirResponse.Roots, "command-line-arguments") - } - // Special case to handle issue #33482: - // If this is a file= query for ad-hoc packages where the file only exists on an overlay, - // and exists outside of a module, add the file in for the package. - if len(dirResponse.Packages) == 1 && (dirResponse.Packages[0].ID == "command-line-arguments" || - filepath.ToSlash(dirResponse.Packages[0].PkgPath) == filepath.ToSlash(query)) { - if len(dirResponse.Packages[0].GoFiles) == 0 { - filename := filepath.Join(pattern, filepath.Base(query)) // avoid recomputing abspath - // TODO(matloob): check if the file is outside of a root dir? - for path := range cfg.Overlay { - if path == filename { - dirResponse.Packages[0].Errors = nil - dirResponse.Packages[0].GoFiles = []string{path} - dirResponse.Packages[0].CompiledGoFiles = []string{path} + response.Roots = append(response.Roots, "command-line-arguments") + } + // Handle special cases. + if len(response.Packages) == 1 { + // golang/go#33482: If this is a file= query for ad-hoc packages where + // the file only exists on an overlay, and exists outside of a module, + // add the file to the package and remove the errors. + if response.Packages[0].ID == "command-line-arguments" || + filepath.ToSlash(response.Packages[0].PkgPath) == filepath.ToSlash(query) { + if len(response.Packages[0].GoFiles) == 0 { + filename := filepath.Join(pattern, filepath.Base(query)) // avoid recomputing abspath + // TODO(matloob): check if the file is outside of a root dir? + for path := range state.cfg.Overlay { + if path == filename { + response.Packages[0].Errors = nil + response.Packages[0].GoFiles = []string{path} + response.Packages[0].CompiledGoFiles = []string{path} + } } } } } - return dirResponse, nil -} - -func contains(files []string, filename string) bool { - for _, f := range files { - if f == filename { - return true - } - } - return false -} - -// errorSpan attempts to parse a standard `go list` error message -// by stripping off the trailing error message. -// -// It works only on errors whose message is prefixed by colon, -// followed by a space (": "). For example: -// -// attributes.go:13:1: expected 'package', found 'type' -// -func errorSpan(err Error) span.Span { - if err.Pos == "" { - input := strings.TrimSpace(err.Msg) - msgIndex := strings.Index(input, ": ") - if msgIndex < 0 { - return span.Parse(input) - } - return span.Parse(input[:msgIndex]) - } - return span.Parse(err.Pos) -} - -// modCacheRegexp splits a path in a module cache into module, module version, and package. -var modCacheRegexp = regexp.MustCompile(`(.*)@([^/\\]*)(.*)`) - -func runNamedQueries(cfg *Config, driver driver, response *responseDeduper, queries []string) error { - // calling `go env` isn't free; bail out if there's nothing to do. - if len(queries) == 0 { - return nil - } - // Determine which directories are relevant to scan. - roots, modRoot, err := roots(cfg) - if err != nil { - return err - } - - // Scan the selected directories. Simple matches, from GOPATH/GOROOT - // or the local module, can simply be "go list"ed. Matches from the - // module cache need special treatment. - var matchesMu sync.Mutex - var simpleMatches, modCacheMatches []string - add := func(root gopathwalk.Root, dir string) { - // Walk calls this concurrently; protect the result slices. - matchesMu.Lock() - defer matchesMu.Unlock() - - path := dir - if dir != root.Path { - path = dir[len(root.Path)+1:] - } - if pathMatchesQueries(path, queries) { - switch root.Type { - case gopathwalk.RootModuleCache: - modCacheMatches = append(modCacheMatches, path) - case gopathwalk.RootCurrentModule: - // We'd need to read go.mod to find the full - // import path. Relative's easier. - rel, err := filepath.Rel(cfg.Dir, dir) - if err != nil { - // This ought to be impossible, since - // we found dir in the current module. - panic(err) - } - simpleMatches = append(simpleMatches, "./"+rel) - case gopathwalk.RootGOPATH, gopathwalk.RootGOROOT: - simpleMatches = append(simpleMatches, path) - } - } - } - - startWalk := time.Now() - gopathwalk.Walk(roots, add, gopathwalk.Options{ModulesEnabled: modRoot != "", Debug: debug}) - cfg.Logf("%v for walk", time.Since(startWalk)) - - // Weird special case: the top-level package in a module will be in - // whatever directory the user checked the repository out into. It's - // more reasonable for that to not match the package name. So, if there - // are any Go files in the mod root, query it just to be safe. - if modRoot != "" { - rel, err := filepath.Rel(cfg.Dir, modRoot) - if err != nil { - panic(err) // See above. - } - - files, err := ioutil.ReadDir(modRoot) - if err != nil { - panic(err) // See above. - } - - for _, f := range files { - if strings.HasSuffix(f.Name(), ".go") { - simpleMatches = append(simpleMatches, rel) - break - } - } - } - - addResponse := func(r *driverResponse) { - for _, pkg := range r.Packages { - response.addPackage(pkg) - for _, name := range queries { - if pkg.Name == name { - response.addRoot(pkg.ID) - break - } - } - } - } - - if len(simpleMatches) != 0 { - resp, err := driver(cfg, simpleMatches...) - if err != nil { - return err - } - addResponse(resp) - } - - // Module cache matches are tricky. We want to avoid downloading new - // versions of things, so we need to use the ones present in the cache. - // go list doesn't accept version specifiers, so we have to write out a - // temporary module, and do the list in that module. - if len(modCacheMatches) != 0 { - // Collect all the matches, deduplicating by major version - // and preferring the newest. - type modInfo struct { - mod string - major string - } - mods := make(map[modInfo]string) - var imports []string - for _, modPath := range modCacheMatches { - matches := modCacheRegexp.FindStringSubmatch(modPath) - mod, ver := filepath.ToSlash(matches[1]), matches[2] - importPath := filepath.ToSlash(filepath.Join(matches[1], matches[3])) - - major := semver.Major(ver) - if prevVer, ok := mods[modInfo{mod, major}]; !ok || semver.Compare(ver, prevVer) > 0 { - mods[modInfo{mod, major}] = ver - } - - imports = append(imports, importPath) - } - - // Build the temporary module. - var gomod bytes.Buffer - gomod.WriteString("module modquery\nrequire (\n") - for mod, version := range mods { - gomod.WriteString("\t" + mod.mod + " " + version + "\n") - } - gomod.WriteString(")\n") - - tmpCfg := *cfg - - // We're only trying to look at stuff in the module cache, so - // disable the network. This should speed things up, and has - // prevented errors in at least one case, #28518. - tmpCfg.Env = append([]string{"GOPROXY=off"}, cfg.Env...) - - var err error - tmpCfg.Dir, err = ioutil.TempDir("", "gopackages-modquery") - if err != nil { - return err - } - defer os.RemoveAll(tmpCfg.Dir) - - if err := ioutil.WriteFile(filepath.Join(tmpCfg.Dir, "go.mod"), gomod.Bytes(), 0777); err != nil { - return fmt.Errorf("writing go.mod for module cache query: %v", err) - } - - // Run the query, using the import paths calculated from the matches above. - resp, err := driver(&tmpCfg, imports...) - if err != nil { - return fmt.Errorf("querying module cache matches: %v", err) - } - addResponse(resp) - } - - return nil -} - -func getSizes(cfg *Config) (types.Sizes, error) { - return packagesdriver.GetSizesGolist(cfg.Context, cfg.BuildFlags, cfg.Env, cfg.Dir, usesExportData(cfg)) -} - -// roots selects the appropriate paths to walk based on the passed-in configuration, -// particularly the environment and the presence of a go.mod in cfg.Dir's parents. -func roots(cfg *Config) ([]gopathwalk.Root, string, error) { - stdout, err := invokeGo(cfg, "env", "GOROOT", "GOPATH", "GOMOD") - if err != nil { - return nil, "", err - } - - fields := strings.Split(stdout.String(), "\n") - if len(fields) != 4 || len(fields[3]) != 0 { - return nil, "", fmt.Errorf("go env returned unexpected output: %q", stdout.String()) - } - goroot, gopath, gomod := fields[0], filepath.SplitList(fields[1]), fields[2] - var modDir string - if gomod != "" { - modDir = filepath.Dir(gomod) - } - - var roots []gopathwalk.Root - // Always add GOROOT. - roots = append(roots, gopathwalk.Root{ - Path: filepath.Join(goroot, "/src"), - Type: gopathwalk.RootGOROOT, - }) - // If modules are enabled, scan the module dir. - if modDir != "" { - roots = append(roots, gopathwalk.Root{ - Path: modDir, - Type: gopathwalk.RootCurrentModule, - }) - } - // Add either GOPATH/src or GOPATH/pkg/mod, depending on module mode. - for _, p := range gopath { - if modDir != "" { - roots = append(roots, gopathwalk.Root{ - Path: filepath.Join(p, "/pkg/mod"), - Type: gopathwalk.RootModuleCache, - }) - } else { - roots = append(roots, gopathwalk.Root{ - Path: filepath.Join(p, "/src"), - Type: gopathwalk.RootGOPATH, - }) - } - } - - return roots, modDir, nil -} - -// These functions were copied from goimports. See further documentation there. - -// pathMatchesQueries is adapted from pkgIsCandidate. -// TODO: is it reasonable to do Contains here, rather than an exact match on a path component? -func pathMatchesQueries(path string, queries []string) bool { - lastTwo := lastTwoComponents(path) - for _, query := range queries { - if strings.Contains(lastTwo, query) { - return true - } - if hasHyphenOrUpperASCII(lastTwo) && !hasHyphenOrUpperASCII(query) { - lastTwo = lowerASCIIAndRemoveHyphen(lastTwo) - if strings.Contains(lastTwo, query) { - return true - } - } - } - return false -} - -// lastTwoComponents returns at most the last two path components -// of v, using either / or \ as the path separator. -func lastTwoComponents(v string) string { - nslash := 0 - for i := len(v) - 1; i >= 0; i-- { - if v[i] == '/' || v[i] == '\\' { - nslash++ - if nslash == 2 { - return v[i:] - } - } - } - return v -} - -func hasHyphenOrUpperASCII(s string) bool { - for i := 0; i < len(s); i++ { - b := s[i] - if b == '-' || ('A' <= b && b <= 'Z') { - return true - } - } - return false -} - -func lowerASCIIAndRemoveHyphen(s string) (ret string) { - buf := make([]byte, 0, len(s)) - for i := 0; i < len(s); i++ { - b := s[i] - switch { - case b == '-': - continue - case 'A' <= b && b <= 'Z': - buf = append(buf, b+('a'-'A')) - default: - buf = append(buf, b) - } - } - return string(buf) + return response, nil } // Fields must match go list; @@ -710,6 +381,7 @@ type jsonPackage struct { Imports []string ImportMap map[string]string Deps []string + Module *packagesinternal.Module TestGoFiles []string TestImports []string XTestGoFiles []string @@ -730,10 +402,9 @@ func otherFiles(p *jsonPackage) [][]string { return [][]string{p.CFiles, p.CXXFiles, p.MFiles, p.HFiles, p.FFiles, p.SFiles, p.SwigFiles, p.SwigCXXFiles, p.SysoFiles} } -// golistDriver uses the "go list" command to expand the pattern -// words and return metadata for the specified packages. dir may be -// "" and env may be nil, as per os/exec.Command. -func golistDriver(cfg *Config, rootsDirs func() *goInfo, words ...string) (*driverResponse, error) { +// createDriverResponse uses the "go list" command to expand the pattern +// words and return a response for the specified packages. +func (state *golistState) createDriverResponse(words ...string) (*driverResponse, error) { // go list uses the following identifiers in ImportPath and Imports: // // "p" -- importable package or main (command) @@ -747,11 +418,13 @@ func golistDriver(cfg *Config, rootsDirs func() *goInfo, words ...string) (*driv // Run "go list" for complete // information on the specified packages. - buf, err := invokeGo(cfg, golistargs(cfg, words)...) + buf, err := state.invokeGo("list", golistargs(state.cfg, words)...) if err != nil { return nil, err } seen := make(map[string]*jsonPackage) + pkgs := make(map[string]*Package) + additionalErrors := make(map[string][]Error) // Decode the JSON and convert it to Package form. var response driverResponse for dec := json.NewDecoder(buf); dec.More(); { @@ -782,18 +455,72 @@ func golistDriver(cfg *Config, rootsDirs func() *goInfo, words ...string) (*driv // contained in a known module or GOPATH entry. This will allow the package to be // properly "reclaimed" when overlays are processed. if filepath.IsAbs(p.ImportPath) && p.Error != nil { - pkgPath, ok := getPkgPath(cfg, p.ImportPath, rootsDirs) + pkgPath, ok, err := state.getPkgPath(p.ImportPath) + if err != nil { + return nil, err + } if ok { p.ImportPath = pkgPath } } if old, found := seen[p.ImportPath]; found { - if !reflect.DeepEqual(p, old) { - return nil, fmt.Errorf("internal error: go list gives conflicting information for package %v", p.ImportPath) + // If one version of the package has an error, and the other doesn't, assume + // that this is a case where go list is reporting a fake dependency variant + // of the imported package: When a package tries to invalidly import another + // package, go list emits a variant of the imported package (with the same + // import path, but with an error on it, and the package will have a + // DepError set on it). An example of when this can happen is for imports of + // main packages: main packages can not be imported, but they may be + // separately matched and listed by another pattern. + // See golang.org/issue/36188 for more details. + + // The plan is that eventually, hopefully in Go 1.15, the error will be + // reported on the importing package rather than the duplicate "fake" + // version of the imported package. Once all supported versions of Go + // have the new behavior this logic can be deleted. + // TODO(matloob): delete the workaround logic once all supported versions of + // Go return the errors on the proper package. + + // There should be exactly one version of a package that doesn't have an + // error. + if old.Error == nil && p.Error == nil { + if !reflect.DeepEqual(p, old) { + return nil, fmt.Errorf("internal error: go list gives conflicting information for package %v", p.ImportPath) + } + continue } - // skip the duplicate - continue + + // Determine if this package's error needs to be bubbled up. + // This is a hack, and we expect for go list to eventually set the error + // on the package. + if old.Error != nil { + var errkind string + if strings.Contains(old.Error.Err, "not an importable package") { + errkind = "not an importable package" + } else if strings.Contains(old.Error.Err, "use of internal package") && strings.Contains(old.Error.Err, "not allowed") { + errkind = "use of internal package not allowed" + } + if errkind != "" { + if len(old.Error.ImportStack) < 2 { + return nil, fmt.Errorf(`internal error: go list gave a %q error with an import stack with fewer than two elements`, errkind) + } + importingPkg := old.Error.ImportStack[len(old.Error.ImportStack)-2] + additionalErrors[importingPkg] = append(additionalErrors[importingPkg], Error{ + Pos: old.Error.Pos, + Msg: old.Error.Err, + Kind: ListError, + }) + } + } + + // Make sure that if there's a version of the package without an error, + // that's the one reported to the user. + if old.Error == nil { + continue + } + + // This package will replace the old one at the end of the loop. } seen[p.ImportPath] = p @@ -803,6 +530,8 @@ func golistDriver(cfg *Config, rootsDirs func() *goInfo, words ...string) (*driv GoFiles: absJoin(p.Dir, p.GoFiles, p.CgoFiles), CompiledGoFiles: absJoin(p.Dir, p.CompiledGoFiles), OtherFiles: absJoin(p.Dir, otherFiles(p)...), + forTest: p.ForTest, + module: p.Module, } // Work around https://golang.org/issue/28749: @@ -879,35 +608,49 @@ func golistDriver(cfg *Config, rootsDirs func() *goInfo, words ...string) (*driv } if p.Error != nil { + msg := strings.TrimSpace(p.Error.Err) // Trim to work around golang.org/issue/32363. + // Address golang.org/issue/35964 by appending import stack to error message. + if msg == "import cycle not allowed" && len(p.Error.ImportStack) != 0 { + msg += fmt.Sprintf(": import stack: %v", p.Error.ImportStack) + } pkg.Errors = append(pkg.Errors, Error{ - Pos: p.Error.Pos, - Msg: strings.TrimSpace(p.Error.Err), // Trim to work around golang.org/issue/32363. + Pos: p.Error.Pos, + Msg: msg, + Kind: ListError, }) } + pkgs[pkg.ID] = pkg + } + + for id, errs := range additionalErrors { + if p, ok := pkgs[id]; ok { + p.Errors = append(p.Errors, errs...) + } + } + for _, pkg := range pkgs { response.Packages = append(response.Packages, pkg) } + sort.Slice(response.Packages, func(i, j int) bool { return response.Packages[i].ID < response.Packages[j].ID }) return &response, nil } // getPkgPath finds the package path of a directory if it's relative to a root directory. -func getPkgPath(cfg *Config, dir string, goInfo func() *goInfo) (string, bool) { +func (state *golistState) getPkgPath(dir string) (string, bool, error) { absDir, err := filepath.Abs(dir) if err != nil { - cfg.Logf("error getting absolute path of %s: %v", dir, err) - return "", false + return "", false, err } - for rdir, rpath := range goInfo().rootDirs { - absRdir, err := filepath.Abs(rdir) - if err != nil { - cfg.Logf("error getting absolute path of %s: %v", rdir, err) - continue - } + roots, err := state.determineRootDirs() + if err != nil { + return "", false, err + } + + for rdir, rpath := range roots { // Make sure that the directory is in the module, // to avoid creating a path relative to another module. - if !strings.HasPrefix(absDir, absRdir) { - cfg.Logf("%s does not have prefix %s", absDir, absRdir) + if !strings.HasPrefix(absDir, rdir) { continue } // TODO(matloob): This doesn't properly handle symlinks. @@ -922,11 +665,11 @@ func getPkgPath(cfg *Config, dir string, goInfo func() *goInfo) (string, bool) { // Once the file is saved, gopls, or the next invocation of the tool will get the correct // result straight from golist. // TODO(matloob): Implement module tiebreaking? - return path.Join(rpath, filepath.ToSlash(r)), true + return path.Join(rpath, filepath.ToSlash(r)), true, nil } - return filepath.ToSlash(r), true + return filepath.ToSlash(r), true, nil } - return "", false + return "", false, nil } // absJoin absolutizes and flattens the lists of files. @@ -945,8 +688,8 @@ func absJoin(dir string, fileses ...[]string) (res []string) { func golistargs(cfg *Config, words []string) []string { const findFlags = NeedImports | NeedTypes | NeedSyntax | NeedTypesInfo fullargs := []string{ - "list", "-e", "-json", - fmt.Sprintf("-compiled=%t", cfg.Mode&(NeedCompiledGoFiles|NeedSyntax|NeedTypesInfo|NeedTypesSizes) != 0), + "-e", "-json", + fmt.Sprintf("-compiled=%t", cfg.Mode&(NeedCompiledGoFiles|NeedSyntax|NeedTypes|NeedTypesInfo|NeedTypesSizes) != 0), fmt.Sprintf("-test=%t", cfg.Tests), fmt.Sprintf("-export=%t", usesExportData(cfg)), fmt.Sprintf("-deps=%t", cfg.Mode&NeedImports != 0), @@ -961,25 +704,20 @@ func golistargs(cfg *Config, words []string) []string { } // invokeGo returns the stdout of a go command invocation. -func invokeGo(cfg *Config, args ...string) (*bytes.Buffer, error) { - stdout := new(bytes.Buffer) - stderr := new(bytes.Buffer) - cmd := exec.CommandContext(cfg.Context, "go", args...) - // On darwin the cwd gets resolved to the real path, which breaks anything that - // expects the working directory to keep the original path, including the - // go command when dealing with modules. - // The Go stdlib has a special feature where if the cwd and the PWD are the - // same node then it trusts the PWD, so by setting it in the env for the child - // process we fix up all the paths returned by the go command. - cmd.Env = append(append([]string{}, cfg.Env...), "PWD="+cfg.Dir) - cmd.Dir = cfg.Dir - cmd.Stdout = stdout - cmd.Stderr = stderr - defer func(start time.Time) { - cfg.Logf("%s for %v, stderr: <<%s>> stdout: <<%s>>\n", time.Since(start), cmdDebugStr(cmd, args...), stderr, stdout) - }(time.Now()) - - if err := cmd.Run(); err != nil { +func (state *golistState) invokeGo(verb string, args ...string) (*bytes.Buffer, error) { + cfg := state.cfg + + inv := &gocommand.Invocation{ + Verb: verb, + Args: args, + BuildFlags: cfg.BuildFlags, + Env: cfg.Env, + Logf: cfg.Logf, + WorkingDir: cfg.Dir, + } + + stdout, stderr, _, err := inv.RunRaw(cfg.Context) + if err != nil { // Check for 'go' executable not being found. if ee, ok := err.(*exec.Error); ok && ee.Err == exec.ErrNotFound { return nil, fmt.Errorf("'go list' driver requires 'go', but %s", exec.ErrNotFound) @@ -989,7 +727,7 @@ func invokeGo(cfg *Config, args ...string) (*bytes.Buffer, error) { if !ok { // Catastrophic error: // - context cancellation - return nil, fmt.Errorf("couldn't exec 'go %v': %s %T", args, err, err) + return nil, fmt.Errorf("couldn't run 'go': %v", err) } // Old go version? @@ -1016,7 +754,12 @@ func invokeGo(cfg *Config, args ...string) (*bytes.Buffer, error) { !strings.ContainsRune("!\"#$%&'()*,:;<=>?[\\]^`{|}\uFFFD", r) } if len(stderr.String()) > 0 && strings.HasPrefix(stderr.String(), "# ") { - if strings.HasPrefix(strings.TrimLeftFunc(stderr.String()[len("# "):], isPkgPathRune), "\n") { + msg := stderr.String()[len("# "):] + if strings.HasPrefix(strings.TrimLeftFunc(msg, isPkgPathRune), "\n") { + return stdout, nil + } + // Treat pkg-config errors as a special case (golang.org/issue/36770). + if strings.HasPrefix(msg, "pkg-config") { return stdout, nil } } @@ -1105,16 +848,6 @@ func invokeGo(cfg *Config, args ...string) (*bytes.Buffer, error) { return nil, fmt.Errorf("go %v: %s: %s", args, exitErr, stderr) } } - - // As of writing, go list -export prints some non-fatal compilation - // errors to stderr, even with -e set. We would prefer that it put - // them in the Package.Error JSON (see https://golang.org/issue/26319). - // In the meantime, there's nowhere good to put them, but they can - // be useful for debugging. Print them if $GOPACKAGESPRINTGOLISTERRORS - // is set. - if len(stderr.Bytes()) != 0 && os.Getenv("GOPACKAGESPRINTGOLISTERRORS") != "" { - fmt.Fprintf(os.Stderr, "%s stderr: <<%s>>\n", cmdDebugStr(cmd, args...), stderr) - } return stdout, nil } diff --git a/vendor/golang.org/x/tools/go/packages/golist_overlay.go b/vendor/golang.org/x/tools/go/packages/golist_overlay.go index a7de62299d..7974a6c9bb 100644 --- a/vendor/golang.org/x/tools/go/packages/golist_overlay.go +++ b/vendor/golang.org/x/tools/go/packages/golist_overlay.go @@ -1,12 +1,13 @@ package packages import ( - "bytes" "encoding/json" "fmt" "go/parser" "go/token" + "os" "path/filepath" + "sort" "strconv" "strings" ) @@ -16,7 +17,7 @@ import ( // sometimes incorrect. // TODO(matloob): Handle unsupported cases, including the following: // - determining the correct package to add given a new import path -func processGolistOverlay(cfg *Config, response *responseDeduper, rootDirs func() *goInfo) (modifiedPkgs, needPkgs []string, err error) { +func (state *golistState) processGolistOverlay(response *responseDeduper) (modifiedPkgs, needPkgs []string, err error) { havePkgs := make(map[string]string) // importPath -> non-test package ID needPkgsSet := make(map[string]bool) modifiedPkgsSet := make(map[string]bool) @@ -34,7 +35,23 @@ func processGolistOverlay(cfg *Config, response *responseDeduper, rootDirs func( // potentially modifying the transitive set of dependencies). var overlayAddsImports bool - for opath, contents := range cfg.Overlay { + // If both a package and its test package are created by the overlay, we + // need the real package first. Process all non-test files before test + // files, and make the whole process deterministic while we're at it. + var overlayFiles []string + for opath := range state.cfg.Overlay { + overlayFiles = append(overlayFiles, opath) + } + sort.Slice(overlayFiles, func(i, j int) bool { + iTest := strings.HasSuffix(overlayFiles[i], "_test.go") + jTest := strings.HasSuffix(overlayFiles[j], "_test.go") + if iTest != jTest { + return !iTest // non-tests are before tests. + } + return overlayFiles[i] < overlayFiles[j] + }) + for _, opath := range overlayFiles { + contents := state.cfg.Overlay[opath] base := filepath.Base(opath) dir := filepath.Dir(opath) var pkg *Package // if opath belongs to both a package and its test variant, this will be the test variant @@ -64,14 +81,8 @@ func processGolistOverlay(cfg *Config, response *responseDeduper, rootDirs func( testVariantOf = p continue nextPackage } + // We must have already seen the package of which this is a test variant. if pkg != nil && p != pkg && pkg.PkgPath == p.PkgPath { - // If we've already seen the test variant, - // make sure to label which package it is a test variant of. - if hasTestFiles(pkg) { - testVariantOf = p - continue nextPackage - } - // If we have already seen the package of which this is a test variant. if hasTestFiles(p) { testVariantOf = pkg } @@ -86,7 +97,10 @@ func processGolistOverlay(cfg *Config, response *responseDeduper, rootDirs func( if pkg == nil { // Try to find the module or gopath dir the file is contained in. // Then for modules, add the module opath to the beginning. - pkgPath, ok := getPkgPath(cfg, dir, rootDirs) + pkgPath, ok, err := state.getPkgPath(dir) + if err != nil { + return nil, nil, err + } if !ok { break } @@ -114,6 +128,11 @@ func processGolistOverlay(cfg *Config, response *responseDeduper, rootDirs func( if isTestFile && !isXTest && testVariantOf != nil { pkg.GoFiles = append(pkg.GoFiles, testVariantOf.GoFiles...) pkg.CompiledGoFiles = append(pkg.CompiledGoFiles, testVariantOf.CompiledGoFiles...) + // Add the package under test and its imports to the test variant. + pkg.forTest = testVariantOf.PkgPath + for k, v := range testVariantOf.Imports { + pkg.Imports[k] = &Package{ID: v.ID} + } } } } @@ -130,42 +149,45 @@ func processGolistOverlay(cfg *Config, response *responseDeduper, rootDirs func( continue } for _, imp := range imports { - _, found := pkg.Imports[imp] - if !found { - overlayAddsImports = true - // TODO(matloob): Handle cases when the following block isn't correct. - // These include imports of vendored packages, etc. - id, ok := havePkgs[imp] - if !ok { - id = imp - } - pkg.Imports[imp] = &Package{ID: id} - // Add dependencies to the non-test variant version of this package as wel. - if testVariantOf != nil { - testVariantOf.Imports[imp] = &Package{ID: id} + if _, found := pkg.Imports[imp]; found { + continue + } + overlayAddsImports = true + id, ok := havePkgs[imp] + if !ok { + var err error + id, err = state.resolveImport(dir, imp) + if err != nil { + return nil, nil, err } } + pkg.Imports[imp] = &Package{ID: id} + // Add dependencies to the non-test variant version of this package as well. + if testVariantOf != nil { + testVariantOf.Imports[imp] = &Package{ID: id} + } } - continue } - // toPkgPath tries to guess the package path given the id. - // This isn't always correct -- it's certainly wrong for - // vendored packages' paths. - toPkgPath := func(id string) string { - // TODO(matloob): Handle vendor paths. - i := strings.IndexByte(id, ' ') - if i >= 0 { - return id[:i] + // toPkgPath guesses the package path given the id. + toPkgPath := func(sourceDir, id string) (string, error) { + if i := strings.IndexByte(id, ' '); i >= 0 { + return state.resolveImport(sourceDir, id[:i]) } - return id + return state.resolveImport(sourceDir, id) } - // Do another pass now that new packages have been created to determine the - // set of missing packages. + // Now that new packages have been created, do another pass to determine + // the new set of missing packages. for _, pkg := range response.dr.Packages { for _, imp := range pkg.Imports { - pkgPath := toPkgPath(imp.ID) + if len(pkg.GoFiles) == 0 { + return nil, nil, fmt.Errorf("cannot resolve imports for package %q with no Go files", pkg.PkgPath) + } + pkgPath, err := toPkgPath(filepath.Dir(pkg.GoFiles[0]), imp.ID) + if err != nil { + return nil, nil, err + } if _, ok := havePkgs[pkgPath]; !ok { needPkgsSet[pkgPath] = true } @@ -185,6 +207,52 @@ func processGolistOverlay(cfg *Config, response *responseDeduper, rootDirs func( return modifiedPkgs, needPkgs, err } +// resolveImport finds the the ID of a package given its import path. +// In particular, it will find the right vendored copy when in GOPATH mode. +func (state *golistState) resolveImport(sourceDir, importPath string) (string, error) { + env, err := state.getEnv() + if err != nil { + return "", err + } + if env["GOMOD"] != "" { + return importPath, nil + } + + searchDir := sourceDir + for { + vendorDir := filepath.Join(searchDir, "vendor") + exists, ok := state.vendorDirs[vendorDir] + if !ok { + info, err := os.Stat(vendorDir) + exists = err == nil && info.IsDir() + state.vendorDirs[vendorDir] = exists + } + + if exists { + vendoredPath := filepath.Join(vendorDir, importPath) + if info, err := os.Stat(vendoredPath); err == nil && info.IsDir() { + // We should probably check for .go files here, but shame on anyone who fools us. + path, ok, err := state.getPkgPath(vendoredPath) + if err != nil { + return "", err + } + if ok { + return path, nil + } + } + } + + // We know we've hit the top of the filesystem when we Dir / and get /, + // or C:\ and get C:\, etc. + next := filepath.Dir(searchDir) + if next == searchDir { + break + } + searchDir = next + } + return importPath, nil +} + func hasTestFiles(p *Package) bool { for _, f := range p.GoFiles { if strings.HasSuffix(f, "_test.go") { @@ -194,44 +262,59 @@ func hasTestFiles(p *Package) bool { return false } -// determineRootDirs returns a mapping from directories code can be contained in to the -// corresponding import path prefixes of those directories. -// Its result is used to try to determine the import path for a package containing -// an overlay file. -func determineRootDirs(cfg *Config) map[string]string { - // Assume modules first: - out, err := invokeGo(cfg, "list", "-m", "-json", "all") +// determineRootDirs returns a mapping from absolute directories that could +// contain code to their corresponding import path prefixes. +func (state *golistState) determineRootDirs() (map[string]string, error) { + env, err := state.getEnv() if err != nil { - return determineRootDirsGOPATH(cfg) + return nil, err + } + if env["GOMOD"] != "" { + state.rootsOnce.Do(func() { + state.rootDirs, state.rootDirsError = state.determineRootDirsModules() + }) + } else { + state.rootsOnce.Do(func() { + state.rootDirs, state.rootDirsError = state.determineRootDirsGOPATH() + }) + } + return state.rootDirs, state.rootDirsError +} + +func (state *golistState) determineRootDirsModules() (map[string]string, error) { + out, err := state.invokeGo("list", "-m", "-json", "all") + if err != nil { + return nil, err } m := map[string]string{} type jsonMod struct{ Path, Dir string } for dec := json.NewDecoder(out); dec.More(); { mod := new(jsonMod) if err := dec.Decode(mod); err != nil { - return m // Give up and return an empty map. Package won't be found for overlay. + return nil, err } if mod.Dir != "" && mod.Path != "" { // This is a valid module; add it to the map. - m[mod.Dir] = mod.Path + absDir, err := filepath.Abs(mod.Dir) + if err != nil { + return nil, err + } + m[absDir] = mod.Path } } - return m + return m, nil } -func determineRootDirsGOPATH(cfg *Config) map[string]string { +func (state *golistState) determineRootDirsGOPATH() (map[string]string, error) { m := map[string]string{} - out, err := invokeGo(cfg, "env", "GOPATH") - if err != nil { - // Could not determine root dir mapping. Everything is best-effort, so just return an empty map. - // When we try to find the import path for a directory, there will be no root-dir match and - // we'll give up. - return m - } - for _, p := range filepath.SplitList(string(bytes.TrimSpace(out.Bytes()))) { - m[filepath.Join(p, "src")] = "" + for _, dir := range filepath.SplitList(state.mustGetEnv()["GOPATH"]) { + absDir, err := filepath.Abs(dir) + if err != nil { + return nil, err + } + m[filepath.Join(absDir, "src")] = "" } - return m + return m, nil } func extractImports(filename string, contents []byte) ([]string, error) { diff --git a/vendor/golang.org/x/tools/go/packages/loadmode_string.go b/vendor/golang.org/x/tools/go/packages/loadmode_string.go new file mode 100644 index 0000000000..aff94a3fe9 --- /dev/null +++ b/vendor/golang.org/x/tools/go/packages/loadmode_string.go @@ -0,0 +1,57 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package packages + +import ( + "fmt" + "strings" +) + +var allModes = []LoadMode{ + NeedName, + NeedFiles, + NeedCompiledGoFiles, + NeedImports, + NeedDeps, + NeedExportsFile, + NeedTypes, + NeedSyntax, + NeedTypesInfo, + NeedTypesSizes, +} + +var modeStrings = []string{ + "NeedName", + "NeedFiles", + "NeedCompiledGoFiles", + "NeedImports", + "NeedDeps", + "NeedExportsFile", + "NeedTypes", + "NeedSyntax", + "NeedTypesInfo", + "NeedTypesSizes", +} + +func (mod LoadMode) String() string { + m := mod + if m == 0 { + return fmt.Sprintf("LoadMode(0)") + } + var out []string + for i, x := range allModes { + if x > m { + break + } + if (m & x) != 0 { + out = append(out, modeStrings[i]) + m = m ^ x + } + } + if m != 0 { + out = append(out, "Unknown") + } + return fmt.Sprintf("LoadMode(%s)", strings.Join(out, "|")) +} diff --git a/vendor/golang.org/x/tools/go/packages/packages.go b/vendor/golang.org/x/tools/go/packages/packages.go index 050cca43a2..1ac6558c1d 100644 --- a/vendor/golang.org/x/tools/go/packages/packages.go +++ b/vendor/golang.org/x/tools/go/packages/packages.go @@ -23,6 +23,7 @@ import ( "sync" "golang.org/x/tools/go/gcexportdata" + "golang.org/x/tools/internal/packagesinternal" ) // A LoadMode controls the amount of detail to return when loading. @@ -34,6 +35,9 @@ import ( // Load may return more information than requested. type LoadMode int +// TODO(matloob): When a V2 of go/packages is released, rename NeedExportsFile to +// NeedExportFile to make it consistent with the Package field it's adding. + const ( // NeedName adds Name and PkgPath. NeedName LoadMode = 1 << iota @@ -51,7 +55,7 @@ const ( // NeedDeps adds the fields requested by the LoadMode in the packages in Imports. NeedDeps - // NeedExportsFile adds ExportsFile. + // NeedExportsFile adds ExportFile. NeedExportsFile // NeedTypes adds Types, Fset, and IllTyped. @@ -160,7 +164,7 @@ type Config struct { Tests bool // Overlay provides a mapping of absolute file paths to file contents. - // If the file with the given path already exists, the parser will use the + // If the file with the given path already exists, the parser will use the // alternative file contents provided by the map. // // Overlays provide incomplete support for when a given file doesn't @@ -292,6 +296,21 @@ type Package struct { // TypesSizes provides the effective size function for types in TypesInfo. TypesSizes types.Sizes + + // forTest is the package under test, if any. + forTest string + + // module is the module information for the package if it exists. + module *packagesinternal.Module +} + +func init() { + packagesinternal.GetForTest = func(p interface{}) string { + return p.(*Package).forTest + } + packagesinternal.GetModule = func(p interface{}) *packagesinternal.Module { + return p.(*Package).module + } } // An Error describes a problem with a package's metadata, syntax, or types. @@ -500,12 +519,23 @@ func (ld *loader) refine(roots []string, list ...*Package) ([]*Package, error) { if i, found := rootMap[pkg.ID]; found { rootIndex = i } + + // Overlays can invalidate export data. + // TODO(matloob): make this check fine-grained based on dependencies on overlaid files + exportDataInvalid := len(ld.Overlay) > 0 || pkg.ExportFile == "" && pkg.PkgPath != "unsafe" + // This package needs type information if the caller requested types and the package is + // either a root, or it's a non-root and the user requested dependencies ... + needtypes := (ld.Mode&NeedTypes|NeedTypesInfo != 0 && (rootIndex >= 0 || ld.Mode&NeedDeps != 0)) + // This package needs source if the call requested source (or types info, which implies source) + // and the package is either a root, or itas a non- root and the user requested dependencies... + needsrc := ((ld.Mode&(NeedSyntax|NeedTypesInfo) != 0 && (rootIndex >= 0 || ld.Mode&NeedDeps != 0)) || + // ... or if we need types and the exportData is invalid. We fall back to (incompletely) + // typechecking packages from source if they fail to compile. + (ld.Mode&NeedTypes|NeedTypesInfo != 0 && exportDataInvalid)) && pkg.PkgPath != "unsafe" lpkg := &loaderPackage{ Package: pkg, - needtypes: (ld.Mode&(NeedTypes|NeedTypesInfo) != 0 && ld.Mode&NeedDeps != 0 && rootIndex < 0) || rootIndex >= 0, - needsrc: (ld.Mode&(NeedSyntax|NeedTypesInfo) != 0 && ld.Mode&NeedDeps != 0 && rootIndex < 0) || rootIndex >= 0 || - len(ld.Overlay) > 0 || // Overlays can invalidate export data. TODO(matloob): make this check fine-grained based on dependencies on overlaid files - pkg.ExportFile == "" && pkg.PkgPath != "unsafe", + needtypes: needtypes, + needsrc: needsrc, } ld.pkgs[lpkg.ID] = lpkg if rootIndex >= 0 { @@ -713,7 +743,7 @@ func (ld *loader) loadPackage(lpkg *loaderPackage) { // which would then require that such created packages be explicitly // inserted back into the Import graph as a final step after export data loading. // The Diamond test exercises this case. - if !lpkg.needtypes { + if !lpkg.needtypes && !lpkg.needsrc { return } if !lpkg.needsrc { diff --git a/vendor/golang.org/x/tools/internal/fastwalk/fastwalk.go b/vendor/golang.org/x/tools/internal/fastwalk/fastwalk.go index 7219c8e9ff..9887f7e7a0 100644 --- a/vendor/golang.org/x/tools/internal/fastwalk/fastwalk.go +++ b/vendor/golang.org/x/tools/internal/fastwalk/fastwalk.go @@ -14,14 +14,14 @@ import ( "sync" ) -// TraverseLink is used as a return value from WalkFuncs to indicate that the +// ErrTraverseLink is used as a return value from WalkFuncs to indicate that the // symlink named in the call may be traversed. -var TraverseLink = errors.New("fastwalk: traverse symlink, assuming target is a directory") +var ErrTraverseLink = errors.New("fastwalk: traverse symlink, assuming target is a directory") -// SkipFiles is a used as a return value from WalkFuncs to indicate that the +// ErrSkipFiles is a used as a return value from WalkFuncs to indicate that the // callback should not be called for any other files in the current directory. // Child directories will still be traversed. -var SkipFiles = errors.New("fastwalk: skip remaining files in directory") +var ErrSkipFiles = errors.New("fastwalk: skip remaining files in directory") // Walk is a faster implementation of filepath.Walk. // @@ -167,7 +167,7 @@ func (w *walker) onDirEnt(dirName, baseName string, typ os.FileMode) error { err := w.fn(joined, typ) if typ == os.ModeSymlink { - if err == TraverseLink { + if err == ErrTraverseLink { // Set callbackDone so we don't call it twice for both the // symlink-as-symlink and the symlink-as-directory later: w.enqueue(walkItem{dir: joined, callbackDone: true}) diff --git a/vendor/golang.org/x/tools/internal/fastwalk/fastwalk_portable.go b/vendor/golang.org/x/tools/internal/fastwalk/fastwalk_portable.go index a906b87595..b0d6327a9e 100644 --- a/vendor/golang.org/x/tools/internal/fastwalk/fastwalk_portable.go +++ b/vendor/golang.org/x/tools/internal/fastwalk/fastwalk_portable.go @@ -26,7 +26,7 @@ func readDir(dirName string, fn func(dirName, entName string, typ os.FileMode) e continue } if err := fn(dirName, fi.Name(), fi.Mode()&os.ModeType); err != nil { - if err == SkipFiles { + if err == ErrSkipFiles { skipFiles = true continue } diff --git a/vendor/golang.org/x/tools/internal/fastwalk/fastwalk_unix.go b/vendor/golang.org/x/tools/internal/fastwalk/fastwalk_unix.go index 3369b1a0b2..5901a8f616 100644 --- a/vendor/golang.org/x/tools/internal/fastwalk/fastwalk_unix.go +++ b/vendor/golang.org/x/tools/internal/fastwalk/fastwalk_unix.go @@ -66,7 +66,7 @@ func readDir(dirName string, fn func(dirName, entName string, typ os.FileMode) e continue } if err := fn(dirName, name, typ); err != nil { - if err == SkipFiles { + if err == ErrSkipFiles { skipFiles = true continue } @@ -76,8 +76,9 @@ func readDir(dirName string, fn func(dirName, entName string, typ os.FileMode) e } func parseDirEnt(buf []byte) (consumed int, name string, typ os.FileMode) { - // golang.org/issue/15653 - dirent := (*syscall.Dirent)(unsafe.Pointer(&buf[0])) + // golang.org/issue/37269 + dirent := &syscall.Dirent{} + copy((*[unsafe.Sizeof(syscall.Dirent{})]byte)(unsafe.Pointer(dirent))[:], buf) if v := unsafe.Offsetof(dirent.Reclen) + unsafe.Sizeof(dirent.Reclen); uintptr(len(buf)) < v { panic(fmt.Sprintf("buf size of %d smaller than dirent header size %d", len(buf), v)) } diff --git a/vendor/golang.org/x/tools/internal/gocommand/invoke.go b/vendor/golang.org/x/tools/internal/gocommand/invoke.go new file mode 100644 index 0000000000..75d73e744f --- /dev/null +++ b/vendor/golang.org/x/tools/internal/gocommand/invoke.go @@ -0,0 +1,121 @@ +// Package gocommand is a helper for calling the go command. +package gocommand + +import ( + "bytes" + "context" + "fmt" + "os" + "os/exec" + "strings" + "time" +) + +// An Invocation represents a call to the go command. +type Invocation struct { + Verb string + Args []string + BuildFlags []string + Env []string + WorkingDir string + Logf func(format string, args ...interface{}) +} + +// Run runs the invocation, returning its stdout and an error suitable for +// human consumption, including stderr. +func (i *Invocation) Run(ctx context.Context) (*bytes.Buffer, error) { + stdout, _, friendly, _ := i.RunRaw(ctx) + return stdout, friendly +} + +// RunRaw is like Run, but also returns the raw stderr and error for callers +// that want to do low-level error handling/recovery. +func (i *Invocation) RunRaw(ctx context.Context) (stdout *bytes.Buffer, stderr *bytes.Buffer, friendlyError error, rawError error) { + log := i.Logf + if log == nil { + log = func(string, ...interface{}) {} + } + + goArgs := []string{i.Verb} + switch i.Verb { + case "mod": + // mod needs the sub-verb before build flags. + goArgs = append(goArgs, i.Args[0]) + goArgs = append(goArgs, i.BuildFlags...) + goArgs = append(goArgs, i.Args[1:]...) + case "env": + // env doesn't take build flags. + goArgs = append(goArgs, i.Args...) + default: + goArgs = append(goArgs, i.BuildFlags...) + goArgs = append(goArgs, i.Args...) + } + cmd := exec.Command("go", goArgs...) + stdout = &bytes.Buffer{} + stderr = &bytes.Buffer{} + cmd.Stdout = stdout + cmd.Stderr = stderr + // On darwin the cwd gets resolved to the real path, which breaks anything that + // expects the working directory to keep the original path, including the + // go command when dealing with modules. + // The Go stdlib has a special feature where if the cwd and the PWD are the + // same node then it trusts the PWD, so by setting it in the env for the child + // process we fix up all the paths returned by the go command. + cmd.Env = append(append([]string{}, i.Env...), "PWD="+i.WorkingDir) + cmd.Dir = i.WorkingDir + + defer func(start time.Time) { log("%s for %v", time.Since(start), cmdDebugStr(cmd)) }(time.Now()) + + rawError = runCmdContext(ctx, cmd) + friendlyError = rawError + if rawError != nil { + // Check for 'go' executable not being found. + if ee, ok := rawError.(*exec.Error); ok && ee.Err == exec.ErrNotFound { + friendlyError = fmt.Errorf("go command required, not found: %v", ee) + } + if ctx.Err() != nil { + friendlyError = ctx.Err() + } + friendlyError = fmt.Errorf("err: %v: stderr: %s", rawError, stderr) + } + return +} + +// runCmdContext is like exec.CommandContext except it sends os.Interrupt +// before os.Kill. +func runCmdContext(ctx context.Context, cmd *exec.Cmd) error { + if err := cmd.Start(); err != nil { + return err + } + resChan := make(chan error, 1) + go func() { + resChan <- cmd.Wait() + }() + + select { + case err := <-resChan: + return err + case <-ctx.Done(): + } + // Cancelled. Interrupt and see if it ends voluntarily. + cmd.Process.Signal(os.Interrupt) + select { + case err := <-resChan: + return err + case <-time.After(time.Second): + } + // Didn't shut down in response to interrupt. Kill it hard. + cmd.Process.Kill() + return <-resChan +} + +func cmdDebugStr(cmd *exec.Cmd) string { + env := make(map[string]string) + for _, kv := range cmd.Env { + split := strings.Split(kv, "=") + k, v := split[0], split[1] + env[k] = v + } + + return fmt.Sprintf("GOROOT=%v GOPATH=%v GO111MODULE=%v GOPROXY=%v PWD=%v go %v", env["GOROOT"], env["GOPATH"], env["GO111MODULE"], env["GOPROXY"], env["PWD"], cmd.Args) +} diff --git a/vendor/golang.org/x/tools/internal/gopathwalk/walk.go b/vendor/golang.org/x/tools/internal/gopathwalk/walk.go index 9a61bdbf5d..390cb9db79 100644 --- a/vendor/golang.org/x/tools/internal/gopathwalk/walk.go +++ b/vendor/golang.org/x/tools/internal/gopathwalk/walk.go @@ -23,8 +23,10 @@ import ( // Options controls the behavior of a Walk call. type Options struct { - Debug bool // Enable debug logging - ModulesEnabled bool // Search module caches. Also disables legacy goimports ignore rules. + // If Logf is non-nil, debug logging is enabled through this function. + Logf func(format string, args ...interface{}) + // Search module caches. Also disables legacy goimports ignore rules. + ModulesEnabled bool } // RootType indicates the type of a Root. @@ -77,16 +79,17 @@ func WalkSkip(roots []Root, add func(root Root, dir string), skip func(root Root } } +// walkDir creates a walker and starts fastwalk with this walker. func walkDir(root Root, add func(Root, string), skip func(root Root, dir string) bool, opts Options) { if _, err := os.Stat(root.Path); os.IsNotExist(err) { - if opts.Debug { - log.Printf("skipping nonexistent directory: %v", root.Path) + if opts.Logf != nil { + opts.Logf("skipping nonexistent directory: %v", root.Path) } return } start := time.Now() - if opts.Debug { - log.Printf("gopathwalk: scanning %s", root.Path) + if opts.Logf != nil { + opts.Logf("gopathwalk: scanning %s", root.Path) } w := &walker{ root: root, @@ -99,8 +102,8 @@ func walkDir(root Root, add func(Root, string), skip func(root Root, dir string) log.Printf("gopathwalk: scanning directory %v: %v", root.Path, err) } - if opts.Debug { - log.Printf("gopathwalk: scanned %s in %v", root.Path, time.Since(start)) + if opts.Logf != nil { + opts.Logf("gopathwalk: scanned %s in %v", root.Path, time.Since(start)) } } @@ -114,7 +117,7 @@ type walker struct { ignoredDirs []os.FileInfo // The ignored directories, loaded from .goimportsignore files. } -// init initializes the walker based on its Options. +// init initializes the walker based on its Options func (w *walker) init() { var ignoredPaths []string if w.root.Type == RootModuleCache { @@ -129,11 +132,11 @@ func (w *walker) init() { full := filepath.Join(w.root.Path, p) if fi, err := os.Stat(full); err == nil { w.ignoredDirs = append(w.ignoredDirs, fi) - if w.opts.Debug { - log.Printf("Directory added to ignore list: %s", full) + if w.opts.Logf != nil { + w.opts.Logf("Directory added to ignore list: %s", full) } - } else if w.opts.Debug { - log.Printf("Error statting ignored directory: %v", err) + } else if w.opts.Logf != nil { + w.opts.Logf("Error statting ignored directory: %v", err) } } } @@ -144,11 +147,11 @@ func (w *walker) init() { func (w *walker) getIgnoredDirs(path string) []string { file := filepath.Join(path, ".goimportsignore") slurp, err := ioutil.ReadFile(file) - if w.opts.Debug { + if w.opts.Logf != nil { if err != nil { - log.Print(err) + w.opts.Logf("%v", err) } else { - log.Printf("Read %s", file) + w.opts.Logf("Read %s", file) } } if err != nil { @@ -167,6 +170,7 @@ func (w *walker) getIgnoredDirs(path string) []string { return ignoredDirs } +// shouldSkipDir reports whether the file should be skipped or not. func (w *walker) shouldSkipDir(fi os.FileInfo, dir string) bool { for _, ignoredDir := range w.ignoredDirs { if os.SameFile(fi, ignoredDir) { @@ -180,20 +184,21 @@ func (w *walker) shouldSkipDir(fi os.FileInfo, dir string) bool { return false } +// walk walks through the given path. func (w *walker) walk(path string, typ os.FileMode) error { dir := filepath.Dir(path) if typ.IsRegular() { if dir == w.root.Path && (w.root.Type == RootGOROOT || w.root.Type == RootGOPATH) { // Doesn't make sense to have regular files // directly in your $GOPATH/src or $GOROOT/src. - return fastwalk.SkipFiles + return fastwalk.ErrSkipFiles } if !strings.HasSuffix(path, ".go") { return nil } w.add(w.root, dir) - return fastwalk.SkipFiles + return fastwalk.ErrSkipFiles } if typ == os.ModeDir { base := filepath.Base(path) @@ -221,7 +226,7 @@ func (w *walker) walk(path string, typ os.FileMode) error { return nil } if w.shouldTraverse(dir, fi) { - return fastwalk.TraverseLink + return fastwalk.ErrTraverseLink } } return nil diff --git a/vendor/golang.org/x/tools/internal/imports/fix.go b/vendor/golang.org/x/tools/internal/imports/fix.go index cdaa57b9bd..92a23439ff 100644 --- a/vendor/golang.org/x/tools/internal/imports/fix.go +++ b/vendor/golang.org/x/tools/internal/imports/fix.go @@ -14,7 +14,6 @@ import ( "go/token" "io/ioutil" "os" - "os/exec" "path" "path/filepath" "reflect" @@ -22,12 +21,11 @@ import ( "strconv" "strings" "sync" - "time" "unicode" "unicode/utf8" "golang.org/x/tools/go/ast/astutil" - "golang.org/x/tools/go/packages" + "golang.org/x/tools/internal/gocommand" "golang.org/x/tools/internal/gopathwalk" ) @@ -82,7 +80,8 @@ type ImportFix struct { // IdentName is the identifier that this fix will add or remove. IdentName string // FixType is the type of fix this is (AddImport, DeleteImport, SetImportName). - FixType ImportFixType + FixType ImportFixType + Relevance int // see pkg } // An ImportInfo represents a single import statement. @@ -263,7 +262,7 @@ type pass struct { // loadPackageNames saves the package names for everything referenced by imports. func (p *pass) loadPackageNames(imports []*ImportInfo) error { - if p.env.Debug { + if p.env.Logf != nil { p.env.Logf("loading package names for %v packages", len(imports)) defer func() { p.env.Logf("done loading package names for %v packages", len(imports)) @@ -302,7 +301,7 @@ func (p *pass) importIdentifier(imp *ImportInfo) string { if known != nil && known.name != "" { return known.name } - return importPathToAssumedName(imp.ImportPath) + return ImportPathToAssumedName(imp.ImportPath) } // load reads in everything necessary to run a pass, and reports whether the @@ -335,7 +334,7 @@ func (p *pass) load() ([]*ImportFix, bool) { if p.loadRealPackageNames { err := p.loadPackageNames(append(imports, p.candidates...)) if err != nil { - if p.env.Debug { + if p.env.Logf != nil { p.env.Logf("loading package names: %v", err) } return nil, false @@ -435,7 +434,7 @@ func (p *pass) importSpecName(imp *ImportInfo) string { } ident := p.importIdentifier(imp) - if ident == importPathToAssumedName(imp.ImportPath) { + if ident == ImportPathToAssumedName(imp.ImportPath) { return "" // ident not needed since the assumed and real names are the same. } return ident @@ -529,7 +528,7 @@ func getFixes(fset *token.FileSet, f *ast.File, filename string, env *ProcessEnv return nil, err } srcDir := filepath.Dir(abs) - if env.Debug { + if env.Logf != nil { env.Logf("fixImports(filename=%q), abs=%q, srcDir=%q ...", filename, abs, srcDir) } @@ -537,7 +536,7 @@ func getFixes(fset *token.FileSet, f *ast.File, filename string, env *ProcessEnv // derive package names from import paths, see if the file is already // complete. We can't add any imports yet, because we don't know // if missing references are actually package vars. - p := &pass{fset: fset, f: f, srcDir: srcDir} + p := &pass{fset: fset, f: f, srcDir: srcDir, env: env} if fixes, done := p.load(); done { return fixes, nil } @@ -559,8 +558,7 @@ func getFixes(fset *token.FileSet, f *ast.File, filename string, env *ProcessEnv } // Third pass: get real package names where we had previously used - // the naive algorithm. This is the first step that will use the - // environment, so we provide it here for the first time. + // the naive algorithm. p = &pass{fset: fset, f: f, srcDir: srcDir, env: env} p.loadRealPackageNames = true p.otherFiles = otherFiles @@ -585,89 +583,127 @@ func getFixes(fset *token.FileSet, f *ast.File, filename string, env *ProcessEnv return fixes, nil } -// getCandidatePkgs returns the list of pkgs that are accessible from filename, -// optionall filtered to only packages named pkgName. -func getCandidatePkgs(pkgName, filename string, env *ProcessEnv) ([]*pkg, error) { - // TODO(heschi): filter out current package. (Don't forget x_test can import x.) +// Highest relevance, used for the standard library. Chosen arbitrarily to +// match pre-existing gopls code. +const MaxRelevance = 7 - var result []*pkg +// getCandidatePkgs works with the passed callback to find all acceptable packages. +// It deduplicates by import path, and uses a cached stdlib rather than reading +// from disk. +func getCandidatePkgs(ctx context.Context, wrappedCallback *scanCallback, filename, filePkg string, env *ProcessEnv) error { + notSelf := func(p *pkg) bool { + return p.packageName != filePkg || p.dir != filepath.Dir(filename) + } // Start off with the standard library. - for importPath := range stdlib { - if pkgName != "" && path.Base(importPath) != pkgName { - continue - } - result = append(result, &pkg{ + for importPath, exports := range stdlib { + p := &pkg{ dir: filepath.Join(env.GOROOT, "src", importPath), importPathShort: importPath, packageName: path.Base(importPath), - relevance: 0, - }) - } - - // Exclude goroot results -- getting them is relatively expensive, not cached, - // and generally redundant with the in-memory version. - exclude := []gopathwalk.RootType{gopathwalk.RootGOROOT} - // Only the go/packages resolver uses the first argument, and nobody uses that resolver. - scannedPkgs, err := env.GetResolver().scan(nil, true, exclude) - if err != nil { - return nil, err + relevance: MaxRelevance, + } + if notSelf(p) && wrappedCallback.packageNameLoaded(p) { + wrappedCallback.exportsLoaded(p, exports) + } } + var mu sync.Mutex dupCheck := map[string]struct{}{} - for _, pkg := range scannedPkgs { - if pkgName != "" && pkg.packageName != pkgName { - continue - } - if !canUse(filename, pkg.dir) { - continue - } - if _, ok := dupCheck[pkg.importPathShort]; ok { - continue - } - dupCheck[pkg.importPathShort] = struct{}{} - result = append(result, pkg) + + scanFilter := &scanCallback{ + rootFound: func(root gopathwalk.Root) bool { + // Exclude goroot results -- getting them is relatively expensive, not cached, + // and generally redundant with the in-memory version. + return root.Type != gopathwalk.RootGOROOT && wrappedCallback.rootFound(root) + }, + dirFound: wrappedCallback.dirFound, + packageNameLoaded: func(pkg *pkg) bool { + mu.Lock() + defer mu.Unlock() + if _, ok := dupCheck[pkg.importPathShort]; ok { + return false + } + dupCheck[pkg.importPathShort] = struct{}{} + return notSelf(pkg) && wrappedCallback.packageNameLoaded(pkg) + }, + exportsLoaded: func(pkg *pkg, exports []string) { + // If we're an x_test, load the package under test's test variant. + if strings.HasSuffix(filePkg, "_test") && pkg.dir == filepath.Dir(filename) { + var err error + _, exports, err = loadExportsFromFiles(ctx, env, pkg.dir, true) + if err != nil { + return + } + } + wrappedCallback.exportsLoaded(pkg, exports) + }, } + return env.GetResolver().scan(ctx, scanFilter) +} - // Sort first by relevance, then by package name, with import path as a tiebreaker. - sort.Slice(result, func(i, j int) bool { - pi, pj := result[i], result[j] - if pi.relevance != pj.relevance { - return pi.relevance < pj.relevance - } - if pi.packageName != pj.packageName { - return pi.packageName < pj.packageName - } - return pi.importPathShort < pj.importPathShort - }) +func ScoreImportPaths(ctx context.Context, env *ProcessEnv, paths []string) map[string]int { + result := make(map[string]int) + for _, path := range paths { + result[path] = env.GetResolver().scoreImportPath(ctx, path) + } + return result +} - return result, nil +func PrimeCache(ctx context.Context, env *ProcessEnv) error { + // Fully scan the disk for directories, but don't actually read any Go files. + callback := &scanCallback{ + rootFound: func(gopathwalk.Root) bool { + return true + }, + dirFound: func(pkg *pkg) bool { + return false + }, + packageNameLoaded: func(pkg *pkg) bool { + return false + }, + } + return getCandidatePkgs(ctx, callback, "", "", env) } func candidateImportName(pkg *pkg) string { - if importPathToAssumedName(pkg.importPathShort) != pkg.packageName { + if ImportPathToAssumedName(pkg.importPathShort) != pkg.packageName { return pkg.packageName } return "" } // getAllCandidates gets all of the candidates to be imported, regardless of if they are needed. -func getAllCandidates(filename string, env *ProcessEnv) ([]ImportFix, error) { - pkgs, err := getCandidatePkgs("", filename, env) - if err != nil { - return nil, err - } - result := make([]ImportFix, 0, len(pkgs)) - for _, pkg := range pkgs { - result = append(result, ImportFix{ - StmtInfo: ImportInfo{ - ImportPath: pkg.importPathShort, - Name: candidateImportName(pkg), - }, - IdentName: pkg.packageName, - FixType: AddImport, - }) +func getAllCandidates(ctx context.Context, wrapped func(ImportFix), searchPrefix, filename, filePkg string, env *ProcessEnv) error { + callback := &scanCallback{ + rootFound: func(gopathwalk.Root) bool { + return true + }, + dirFound: func(pkg *pkg) bool { + if !canUse(filename, pkg.dir) { + return false + } + // Try the assumed package name first, then a simpler path match + // in case of packages named vN, which are not uncommon. + return strings.HasPrefix(ImportPathToAssumedName(pkg.importPathShort), searchPrefix) || + strings.HasPrefix(path.Base(pkg.importPathShort), searchPrefix) + }, + packageNameLoaded: func(pkg *pkg) bool { + if !strings.HasPrefix(pkg.packageName, searchPrefix) { + return false + } + wrapped(ImportFix{ + StmtInfo: ImportInfo{ + ImportPath: pkg.importPathShort, + Name: candidateImportName(pkg), + }, + IdentName: pkg.packageName, + FixType: AddImport, + Relevance: pkg.relevance, + }) + return false + }, } - return result, nil + return getCandidatePkgs(ctx, callback, filename, filePkg, env) } // A PackageExport is a package and its exports. @@ -676,64 +712,61 @@ type PackageExport struct { Exports []string } -func getPackageExports(completePackage, filename string, env *ProcessEnv) ([]PackageExport, error) { - pkgs, err := getCandidatePkgs(completePackage, filename, env) - if err != nil { - return nil, err - } - - results := make([]PackageExport, 0, len(pkgs)) - for _, pkg := range pkgs { - fix := &ImportFix{ - StmtInfo: ImportInfo{ - ImportPath: pkg.importPathShort, - Name: candidateImportName(pkg), - }, - IdentName: pkg.packageName, - FixType: AddImport, - } - var exports []string - if e, ok := stdlib[pkg.importPathShort]; ok { - exports = e - } else { - exports, err = loadExportsForPackage(context.Background(), env, completePackage, pkg) - if err != nil { - if env.Debug { - env.Logf("while completing %q, error loading exports from %q: %v", completePackage, pkg.importPathShort, err) - } - continue - } - } - sort.Strings(exports) - results = append(results, PackageExport{ - Fix: fix, - Exports: exports, - }) +func getPackageExports(ctx context.Context, wrapped func(PackageExport), searchPkg, filename, filePkg string, env *ProcessEnv) error { + callback := &scanCallback{ + rootFound: func(gopathwalk.Root) bool { + return true + }, + dirFound: func(pkg *pkg) bool { + return pkgIsCandidate(filename, references{searchPkg: nil}, pkg) + }, + packageNameLoaded: func(pkg *pkg) bool { + return pkg.packageName == searchPkg + }, + exportsLoaded: func(pkg *pkg, exports []string) { + sort.Strings(exports) + wrapped(PackageExport{ + Fix: &ImportFix{ + StmtInfo: ImportInfo{ + ImportPath: pkg.importPathShort, + Name: candidateImportName(pkg), + }, + IdentName: pkg.packageName, + FixType: AddImport, + Relevance: pkg.relevance, + }, + Exports: exports, + }) + }, } - - return results, nil + return getCandidatePkgs(ctx, callback, filename, filePkg, env) } // ProcessEnv contains environment variables and settings that affect the use of // the go command, the go/build package, etc. type ProcessEnv struct { LocalPrefix string - Debug bool + + BuildFlags []string // If non-empty, these will be used instead of the // process-wide values. GOPATH, GOROOT, GO111MODULE, GOPROXY, GOFLAGS, GOSUMDB string WorkingDir string - // If true, use go/packages regardless of the environment. - ForceGoPackages bool - - // Logf is the default logger for the ProcessEnv. + // If Logf is non-nil, debug logging is enabled through this function. Logf func(format string, args ...interface{}) resolver Resolver } +// CopyConfig copies the env's configuration into a new env. +func (e *ProcessEnv) CopyConfig() *ProcessEnv { + copy := *e + copy.resolver = nil + return © +} + func (e *ProcessEnv) env() []string { env := os.Environ() add := func(k, v string) { @@ -757,73 +790,55 @@ func (e *ProcessEnv) GetResolver() Resolver { if e.resolver != nil { return e.resolver } - if e.ForceGoPackages { - e.resolver = &goPackagesResolver{env: e} - return e.resolver - } - - out, err := e.invokeGo("env", "GOMOD") + out, err := e.invokeGo(context.TODO(), "env", "GOMOD") if err != nil || len(bytes.TrimSpace(out.Bytes())) == 0 { - e.resolver = &gopathResolver{env: e} + e.resolver = newGopathResolver(e) return e.resolver } - e.resolver = &ModuleResolver{env: e} + e.resolver = newModuleResolver(e) return e.resolver } -func (e *ProcessEnv) newPackagesConfig(mode packages.LoadMode) *packages.Config { - return &packages.Config{ - Mode: mode, - Dir: e.WorkingDir, - Env: e.env(), - } -} - func (e *ProcessEnv) buildContext() *build.Context { ctx := build.Default ctx.GOROOT = e.GOROOT ctx.GOPATH = e.GOPATH - // As of Go 1.14, build.Context has a WorkingDir field + // As of Go 1.14, build.Context has a Dir field // (see golang.org/issue/34860). // Populate it only if present. - if wd := reflect.ValueOf(&ctx).Elem().FieldByName("WorkingDir"); wd.IsValid() && wd.Kind() == reflect.String { - wd.SetString(e.WorkingDir) + rc := reflect.ValueOf(&ctx).Elem() + dir := rc.FieldByName("Dir") + if !dir.IsValid() { + // Working drafts of Go 1.14 named the field "WorkingDir" instead. + // TODO(bcmills): Remove this case after the Go 1.14 beta has been released. + dir = rc.FieldByName("WorkingDir") } - return &ctx -} - -func (e *ProcessEnv) invokeGo(args ...string) (*bytes.Buffer, error) { - cmd := exec.Command("go", args...) - stdout := &bytes.Buffer{} - stderr := &bytes.Buffer{} - cmd.Stdout = stdout - cmd.Stderr = stderr - cmd.Env = e.env() - cmd.Dir = e.WorkingDir - - if e.Debug { - defer func(start time.Time) { e.Logf("%s for %v", time.Since(start), cmdDebugStr(cmd)) }(time.Now()) + if dir.IsValid() && dir.Kind() == reflect.String { + dir.SetString(e.WorkingDir) } - if err := cmd.Run(); err != nil { - return nil, fmt.Errorf("running go: %v (stderr:\n%s)", err, stderr) - } - return stdout, nil + + return &ctx } -func cmdDebugStr(cmd *exec.Cmd) string { - env := make(map[string]string) - for _, kv := range cmd.Env { - split := strings.Split(kv, "=") - k, v := split[0], split[1] - env[k] = v +func (e *ProcessEnv) invokeGo(ctx context.Context, verb string, args ...string) (*bytes.Buffer, error) { + inv := gocommand.Invocation{ + Verb: verb, + Args: args, + BuildFlags: e.BuildFlags, + Env: e.env(), + Logf: e.Logf, + WorkingDir: e.WorkingDir, } - - return fmt.Sprintf("GOROOT=%v GOPATH=%v GO111MODULE=%v GOPROXY=%v PWD=%v go %v", env["GOROOT"], env["GOPATH"], env["GO111MODULE"], env["GOPROXY"], env["PWD"], cmd.Args) + return inv.Run(ctx) } func addStdlibCandidates(pass *pass, refs references) { add := func(pkg string) { + // Prevent self-imports. + if path.Base(pkg) == pass.f.Name.Name && filepath.Join(pass.env.GOROOT, "src", pkg) == pass.srcDir { + return + } exports := copyExports(stdlib[pkg]) pass.addCandidate( &ImportInfo{ImportPath: pkg}, @@ -848,94 +863,65 @@ func addStdlibCandidates(pass *pass, refs references) { type Resolver interface { // loadPackageNames loads the package names in importPaths. loadPackageNames(importPaths []string, srcDir string) (map[string]string, error) - // scan finds (at least) the packages satisfying refs. If loadNames is true, - // package names will be set on the results, and dirs whose package name - // could not be determined will be excluded. - scan(refs references, loadNames bool, exclude []gopathwalk.RootType) ([]*pkg, error) + // scan works with callback to search for packages. See scanCallback for details. + scan(ctx context.Context, callback *scanCallback) error // loadExports returns the set of exported symbols in the package at dir. // loadExports may be called concurrently. - loadExports(ctx context.Context, pkg *pkg) (string, []string, error) + loadExports(ctx context.Context, pkg *pkg, includeTest bool) (string, []string, error) + // scoreImportPath returns the relevance for an import path. + scoreImportPath(ctx context.Context, path string) int ClearForNewScan() } -// gopackagesResolver implements resolver for GOPATH and module workspaces using go/packages. -type goPackagesResolver struct { - env *ProcessEnv +// A scanCallback controls a call to scan and receives its results. +// In general, minor errors will be silently discarded; a user should not +// expect to receive a full series of calls for everything. +type scanCallback struct { + // rootFound is called before scanning a new root dir. If it returns true, + // the root will be scanned. Returning false will not necessarily prevent + // directories from that root making it to dirFound. + rootFound func(gopathwalk.Root) bool + // dirFound is called when a directory is found that is possibly a Go package. + // pkg will be populated with everything except packageName. + // If it returns true, the package's name will be loaded. + dirFound func(pkg *pkg) bool + // packageNameLoaded is called when a package is found and its name is loaded. + // If it returns true, the package's exports will be loaded. + packageNameLoaded func(pkg *pkg) bool + // exportsLoaded is called when a package's exports have been loaded. + exportsLoaded func(pkg *pkg, exports []string) } -func (r *goPackagesResolver) ClearForNewScan() {} - -func (r *goPackagesResolver) loadPackageNames(importPaths []string, srcDir string) (map[string]string, error) { - if len(importPaths) == 0 { - return nil, nil - } - cfg := r.env.newPackagesConfig(packages.LoadFiles) - pkgs, err := packages.Load(cfg, importPaths...) - if err != nil { - return nil, err - } - names := map[string]string{} - for _, pkg := range pkgs { - names[VendorlessPath(pkg.PkgPath)] = pkg.Name - } - // We may not have found all the packages. Guess the rest. - for _, path := range importPaths { - if _, ok := names[path]; ok { - continue - } - names[path] = importPathToAssumedName(path) - } - return names, nil - -} - -func (r *goPackagesResolver) scan(refs references, _ bool, _ []gopathwalk.RootType) ([]*pkg, error) { - var loadQueries []string - for pkgName := range refs { - loadQueries = append(loadQueries, "iamashamedtousethedisabledqueryname="+pkgName) - } - sort.Strings(loadQueries) - cfg := r.env.newPackagesConfig(packages.LoadFiles) - goPackages, err := packages.Load(cfg, loadQueries...) - if err != nil { - return nil, err - } - - var scan []*pkg - for _, goPackage := range goPackages { - scan = append(scan, &pkg{ - dir: filepath.Dir(goPackage.CompiledGoFiles[0]), - importPathShort: VendorlessPath(goPackage.PkgPath), - goPackage: goPackage, - packageName: goPackage.Name, - }) - } - return scan, nil -} - -func (r *goPackagesResolver) loadExports(ctx context.Context, pkg *pkg) (string, []string, error) { - if pkg.goPackage == nil { - return "", nil, fmt.Errorf("goPackage not set") - } - var exports []string - fset := token.NewFileSet() - for _, fname := range pkg.goPackage.CompiledGoFiles { - f, err := parser.ParseFile(fset, fname, nil, 0) - if err != nil { - return "", nil, fmt.Errorf("parsing %s: %v", fname, err) - } - for name := range f.Scope.Objects { - if ast.IsExported(name) { - exports = append(exports, name) +func addExternalCandidates(pass *pass, refs references, filename string) error { + var mu sync.Mutex + found := make(map[string][]pkgDistance) + callback := &scanCallback{ + rootFound: func(gopathwalk.Root) bool { + return true // We want everything. + }, + dirFound: func(pkg *pkg) bool { + return pkgIsCandidate(filename, refs, pkg) + }, + packageNameLoaded: func(pkg *pkg) bool { + if _, want := refs[pkg.packageName]; !want { + return false } - } + if pkg.dir == pass.srcDir && pass.f.Name.Name == pkg.packageName { + // The candidate is in the same directory and has the + // same package name. Don't try to import ourselves. + return false + } + if !canUse(filename, pkg.dir) { + return false + } + mu.Lock() + defer mu.Unlock() + found[pkg.packageName] = append(found[pkg.packageName], pkgDistance{pkg, distance(pass.srcDir, pkg.dir)}) + return false // We'll do our own loading after we sort. + }, } - return pkg.goPackage.Name, exports, nil -} - -func addExternalCandidates(pass *pass, refs references, filename string) error { - dirScan, err := pass.env.GetResolver().scan(refs, false, nil) + err := pass.env.GetResolver().scan(context.Background(), callback) if err != nil { return err } @@ -962,7 +948,7 @@ func addExternalCandidates(pass *pass, refs references, filename string) error { go func(pkgName string, symbols map[string]bool) { defer wg.Done() - found, err := findImport(ctx, pass, dirScan, pkgName, symbols, filename) + found, err := findImport(ctx, pass, found[pkgName], pkgName, symbols, filename) if err != nil { firstErrOnce.Do(func() { @@ -1006,7 +992,7 @@ func notIdentifier(ch rune) bool { ch >= utf8.RuneSelf && (unicode.IsLetter(ch) || unicode.IsDigit(ch))) } -// importPathToAssumedName returns the assumed package name of an import path. +// ImportPathToAssumedName returns the assumed package name of an import path. // It does this using only string parsing of the import path. // It picks the last element of the path that does not look like a major // version, and then picks the valid identifier off the start of that element. @@ -1014,7 +1000,7 @@ func notIdentifier(ch rune) bool { // clarity. // This function could be moved to a standard package and exported if we want // for use in other tools. -func importPathToAssumedName(importPath string) string { +func ImportPathToAssumedName(importPath string) string { base := path.Base(importPath) if strings.HasPrefix(base, "v") { if _, err := strconv.Atoi(base[1:]); err == nil { @@ -1033,24 +1019,36 @@ func importPathToAssumedName(importPath string) string { // gopathResolver implements resolver for GOPATH workspaces. type gopathResolver struct { - env *ProcessEnv - cache *dirInfoCache + env *ProcessEnv + walked bool + cache *dirInfoCache + scanSema chan struct{} // scanSema prevents concurrent scans. } -func (r *gopathResolver) init() { - if r.cache == nil { - r.cache = &dirInfoCache{ - dirs: map[string]*directoryPackageInfo{}, - } +func newGopathResolver(env *ProcessEnv) *gopathResolver { + r := &gopathResolver{ + env: env, + cache: &dirInfoCache{ + dirs: map[string]*directoryPackageInfo{}, + listeners: map[*int]cacheListener{}, + }, + scanSema: make(chan struct{}, 1), } + r.scanSema <- struct{}{} + return r } func (r *gopathResolver) ClearForNewScan() { - r.cache = nil + <-r.scanSema + r.cache = &dirInfoCache{ + dirs: map[string]*directoryPackageInfo{}, + listeners: map[*int]cacheListener{}, + } + r.walked = false + r.scanSema <- struct{}{} } func (r *gopathResolver) loadPackageNames(importPaths []string, srcDir string) (map[string]string, error) { - r.init() names := map[string]string{} for _, path := range importPaths { names[path] = importPathToName(r.env, path, srcDir) @@ -1130,7 +1128,6 @@ func packageDirToName(dir string) (packageName string, err error) { } type pkg struct { - goPackage *packages.Package dir string // absolute file path to pkg directory ("/usr/lib/go/src/net/http") importPathShort string // vendorless import path ("net/http", "a/b") packageName string // package name loaded from source if requested @@ -1178,8 +1175,7 @@ func distance(basepath, targetpath string) int { return strings.Count(p, string(filepath.Separator)) + 1 } -func (r *gopathResolver) scan(_ references, loadNames bool, exclude []gopathwalk.RootType) ([]*pkg, error) { - r.init() +func (r *gopathResolver) scan(ctx context.Context, callback *scanCallback) error { add := func(root gopathwalk.Root, dir string) { // We assume cached directories have not changed. We can skip them and their // children. @@ -1196,56 +1192,84 @@ func (r *gopathResolver) scan(_ references, loadNames bool, exclude []gopathwalk } r.cache.Store(dir, info) } - roots := filterRoots(gopathwalk.SrcDirsRoots(r.env.buildContext()), exclude) - gopathwalk.Walk(roots, add, gopathwalk.Options{Debug: r.env.Debug, ModulesEnabled: false}) - var result []*pkg - for _, dir := range r.cache.Keys() { - info, ok := r.cache.Load(dir) - if !ok { - continue - } - if loadNames { - var err error - info, err = r.cache.CachePackageName(info) - if err != nil { - continue - } + processDir := func(info directoryPackageInfo) { + // Skip this directory if we were not able to get the package information successfully. + if scanned, err := info.reachedStatus(directoryScanned); !scanned || err != nil { + return } p := &pkg{ importPathShort: info.nonCanonicalImportPath, - dir: dir, - relevance: 1, - packageName: info.packageName, + dir: info.dir, + relevance: MaxRelevance - 1, } if info.rootType == gopathwalk.RootGOROOT { - p.relevance = 0 + p.relevance = MaxRelevance + } + + if !callback.dirFound(p) { + return } - result = append(result, p) + var err error + p.packageName, err = r.cache.CachePackageName(info) + if err != nil { + return + } + + if !callback.packageNameLoaded(p) { + return + } + if _, exports, err := r.loadExports(ctx, p, false); err == nil { + callback.exportsLoaded(p, exports) + } + } + stop := r.cache.ScanAndListen(ctx, processDir) + defer stop() + // The callback is not necessarily safe to use in the goroutine below. Process roots eagerly. + roots := filterRoots(gopathwalk.SrcDirsRoots(r.env.buildContext()), callback.rootFound) + // We can't cancel walks, because we need them to finish to have a usable + // cache. Instead, run them in a separate goroutine and detach. + scanDone := make(chan struct{}) + go func() { + select { + case <-ctx.Done(): + return + case <-r.scanSema: + } + defer func() { r.scanSema <- struct{}{} }() + gopathwalk.Walk(roots, add, gopathwalk.Options{Logf: r.env.Logf, ModulesEnabled: false}) + close(scanDone) + }() + select { + case <-ctx.Done(): + case <-scanDone: } - return result, nil + return nil } -func filterRoots(roots []gopathwalk.Root, exclude []gopathwalk.RootType) []gopathwalk.Root { +func (r *gopathResolver) scoreImportPath(ctx context.Context, path string) int { + if _, ok := stdlib[path]; ok { + return MaxRelevance + } + return MaxRelevance - 1 +} + +func filterRoots(roots []gopathwalk.Root, include func(gopathwalk.Root) bool) []gopathwalk.Root { var result []gopathwalk.Root -outer: for _, root := range roots { - for _, i := range exclude { - if i == root.Type { - continue outer - } + if !include(root) { + continue } result = append(result, root) } return result } -func (r *gopathResolver) loadExports(ctx context.Context, pkg *pkg) (string, []string, error) { - r.init() - if info, ok := r.cache.Load(pkg.dir); ok { +func (r *gopathResolver) loadExports(ctx context.Context, pkg *pkg, includeTest bool) (string, []string, error) { + if info, ok := r.cache.Load(pkg.dir); ok && !includeTest { return r.cache.CacheExports(ctx, r.env, info) } - return loadExportsFromFiles(ctx, r.env, pkg.dir) + return loadExportsFromFiles(ctx, r.env, pkg.dir, includeTest) } // VendorlessPath returns the devendorized version of the import path ipath. @@ -1261,7 +1285,7 @@ func VendorlessPath(ipath string) string { return ipath } -func loadExportsFromFiles(ctx context.Context, env *ProcessEnv, dir string) (string, []string, error) { +func loadExportsFromFiles(ctx context.Context, env *ProcessEnv, dir string, includeTest bool) (string, []string, error) { var exports []string // Look for non-test, buildable .go files which could provide exports. @@ -1272,7 +1296,7 @@ func loadExportsFromFiles(ctx context.Context, env *ProcessEnv, dir string) (str var files []os.FileInfo for _, fi := range all { name := fi.Name() - if !strings.HasSuffix(name, ".go") || strings.HasSuffix(name, "_test.go") { + if !strings.HasSuffix(name, ".go") || (!includeTest && strings.HasSuffix(name, "_test.go")) { continue } match, err := env.buildContext().MatchFile(dir, fi.Name()) @@ -1305,6 +1329,10 @@ func loadExportsFromFiles(ctx context.Context, env *ProcessEnv, dir string) (str // handled by MatchFile above. continue } + if includeTest && strings.HasSuffix(f.Name.Name, "_test") { + // x_test package. We want internal test files only. + continue + } pkgName = f.Name.Name for name := range f.Scope.Objects { if ast.IsExported(name) { @@ -1313,7 +1341,7 @@ func loadExportsFromFiles(ctx context.Context, env *ProcessEnv, dir string) (str } } - if env.Debug { + if env.Logf != nil { sortedExports := append([]string(nil), exports...) sort.Strings(sortedExports) env.Logf("loaded exports in dir %v (package %v): %v", dir, pkgName, strings.Join(sortedExports, ", ")) @@ -1323,42 +1351,19 @@ func loadExportsFromFiles(ctx context.Context, env *ProcessEnv, dir string) (str // findImport searches for a package with the given symbols. // If no package is found, findImport returns ("", false, nil) -func findImport(ctx context.Context, pass *pass, dirScan []*pkg, pkgName string, symbols map[string]bool, filename string) (*pkg, error) { - pkgDir, err := filepath.Abs(filename) - if err != nil { - return nil, err - } - pkgDir = filepath.Dir(pkgDir) - - // Find candidate packages, looking only at their directory names first. - var candidates []pkgDistance - for _, pkg := range dirScan { - if pkg.dir == pkgDir && pass.f.Name.Name == pkgName { - // The candidate is in the same directory and has the - // same package name. Don't try to import ourselves. - continue - } - if pkgIsCandidate(filename, pkgName, pkg) { - candidates = append(candidates, pkgDistance{ - pkg: pkg, - distance: distance(pkgDir, pkg.dir), - }) - } - } - +func findImport(ctx context.Context, pass *pass, candidates []pkgDistance, pkgName string, symbols map[string]bool, filename string) (*pkg, error) { // Sort the candidates by their import package length, // assuming that shorter package names are better than long // ones. Note that this sorts by the de-vendored name, so // there's no "penalty" for vendoring. sort.Sort(byDistanceOrImportPathShortLength(candidates)) - if pass.env.Debug { + if pass.env.Logf != nil { for i, c := range candidates { pass.env.Logf("%s candidate %d/%d: %v in %v", pkgName, i+1, len(candidates), c.pkg.importPathShort, c.pkg.dir) } } // Collect exports for packages with matching names. - rescv := make([]chan *pkg, len(candidates)) for i := range candidates { rescv[i] = make(chan *pkg, 1) @@ -1390,12 +1395,14 @@ func findImport(ctx context.Context, pass *pass, dirScan []*pkg, pkgName string, wg.Done() }() - if pass.env.Debug { + if pass.env.Logf != nil { pass.env.Logf("loading exports in dir %s (seeking package %s)", c.pkg.dir, pkgName) } - exports, err := loadExportsForPackage(ctx, pass.env, pkgName, c.pkg) + // If we're an x_test, load the package under test's test variant. + includeTest := strings.HasSuffix(pass.f.Name.Name, "_test") && c.pkg.dir == pass.srcDir + _, exports, err := pass.env.GetResolver().loadExports(ctx, c.pkg, includeTest) if err != nil { - if pass.env.Debug { + if pass.env.Logf != nil { pass.env.Logf("loading exports in dir %s (seeking package %s): %v", c.pkg.dir, pkgName, err) } resc <- nil @@ -1430,17 +1437,6 @@ func findImport(ctx context.Context, pass *pass, dirScan []*pkg, pkgName string, return nil, nil } -func loadExportsForPackage(ctx context.Context, env *ProcessEnv, expectPkg string, pkg *pkg) ([]string, error) { - pkgName, exports, err := env.GetResolver().loadExports(ctx, pkg) - if err != nil { - return nil, err - } - if expectPkg != pkgName { - return nil, fmt.Errorf("dir %v is package %v, wanted %v", pkg.dir, pkgName, expectPkg) - } - return exports, err -} - // pkgIsCandidate reports whether pkg is a candidate for satisfying the // finding which package pkgIdent in the file named by filename is trying // to refer to. @@ -1453,7 +1449,7 @@ func loadExportsForPackage(ctx context.Context, env *ProcessEnv, expectPkg strin // filename is the file being formatted. // pkgIdent is the package being searched for, like "client" (if // searching for "client.New") -func pkgIsCandidate(filename, pkgIdent string, pkg *pkg) bool { +func pkgIsCandidate(filename string, refs references, pkg *pkg) bool { // Check "internal" and "vendor" visibility: if !canUse(filename, pkg.dir) { return false @@ -1471,17 +1467,18 @@ func pkgIsCandidate(filename, pkgIdent string, pkg *pkg) bool { // "bar", which is strongly discouraged // anyway. There's no reason goimports needs // to be slow just to accommodate that. - lastTwo := lastTwoComponents(pkg.importPathShort) - if strings.Contains(lastTwo, pkgIdent) { - return true - } - if hasHyphenOrUpperASCII(lastTwo) && !hasHyphenOrUpperASCII(pkgIdent) { - lastTwo = lowerASCIIAndRemoveHyphen(lastTwo) + for pkgIdent := range refs { + lastTwo := lastTwoComponents(pkg.importPathShort) if strings.Contains(lastTwo, pkgIdent) { return true } + if hasHyphenOrUpperASCII(lastTwo) && !hasHyphenOrUpperASCII(pkgIdent) { + lastTwo = lowerASCIIAndRemoveHyphen(lastTwo) + if strings.Contains(lastTwo, pkgIdent) { + return true + } + } } - return false } diff --git a/vendor/golang.org/x/tools/internal/imports/imports.go b/vendor/golang.org/x/tools/internal/imports/imports.go index ed3867bb59..b18daea290 100644 --- a/vendor/golang.org/x/tools/internal/imports/imports.go +++ b/vendor/golang.org/x/tools/internal/imports/imports.go @@ -11,6 +11,7 @@ package imports import ( "bufio" "bytes" + "context" "fmt" "go/ast" "go/build" @@ -20,7 +21,7 @@ import ( "go/token" "io" "io/ioutil" - "log" + "os" "regexp" "strconv" "strings" @@ -83,42 +84,54 @@ func FixImports(filename string, src []byte, opt *Options) (fixes []*ImportFix, return getFixes(fileSet, file, filename, opt.Env) } -// ApplyFix will apply all of the fixes to the file and format it. -func ApplyFixes(fixes []*ImportFix, filename string, src []byte, opt *Options) (formatted []byte, err error) { +// ApplyFixes applies all of the fixes to the file and formats it. extraMode +// is added in when parsing the file. +func ApplyFixes(fixes []*ImportFix, filename string, src []byte, opt *Options, extraMode parser.Mode) (formatted []byte, err error) { src, opt, err = initialize(filename, src, opt) if err != nil { return nil, err } + // Don't use parse() -- we don't care about fragments or statement lists + // here, and we need to work with unparseable files. fileSet := token.NewFileSet() - file, adjust, err := parse(fileSet, filename, src, opt) - if err != nil { + parserMode := parser.Mode(0) + if opt.Comments { + parserMode |= parser.ParseComments + } + if opt.AllErrors { + parserMode |= parser.AllErrors + } + parserMode |= extraMode + + file, err := parser.ParseFile(fileSet, filename, src, parserMode) + if file == nil { return nil, err } // Apply the fixes to the file. apply(fileSet, file, fixes) - return formatFile(fileSet, file, src, adjust, opt) + return formatFile(fileSet, file, src, nil, opt) } -// GetAllCandidates gets all of the standard library candidate packages to import in -// sorted order on import path. -func GetAllCandidates(filename string, opt *Options) (pkgs []ImportFix, err error) { - _, opt, err = initialize(filename, nil, opt) +// GetAllCandidates gets all of the packages starting with prefix that can be +// imported by filename, sorted by import path. +func GetAllCandidates(ctx context.Context, callback func(ImportFix), searchPrefix, filename, filePkg string, opt *Options) error { + _, opt, err := initialize(filename, []byte{}, opt) if err != nil { - return nil, err + return err } - return getAllCandidates(filename, opt.Env) + return getAllCandidates(ctx, callback, searchPrefix, filename, filePkg, opt.Env) } // GetPackageExports returns all known packages with name pkg and their exports. -func GetPackageExports(pkg, filename string, opt *Options) (exports []PackageExport, err error) { - _, opt, err = initialize(filename, nil, opt) +func GetPackageExports(ctx context.Context, callback func(PackageExport), searchPkg, filename, filePkg string, opt *Options) error { + _, opt, err := initialize(filename, []byte{}, opt) if err != nil { - return nil, err + return err } - return getPackageExports(pkg, filename, opt.Env) + return getPackageExports(ctx, callback, searchPkg, filename, filePkg, opt.Env) } // initialize sets the values for opt and src. @@ -133,16 +146,14 @@ func initialize(filename string, src []byte, opt *Options) ([]byte, *Options, er // Set the env if the user has not provided it. if opt.Env == nil { opt.Env = &ProcessEnv{ - GOPATH: build.Default.GOPATH, - GOROOT: build.Default.GOROOT, + GOPATH: build.Default.GOPATH, + GOROOT: build.Default.GOROOT, + GOFLAGS: os.Getenv("GOFLAGS"), + GO111MODULE: os.Getenv("GO111MODULE"), + GOPROXY: os.Getenv("GOPROXY"), + GOSUMDB: os.Getenv("GOSUMDB"), } } - - // Set the logger if the user has not provided it. - if opt.Env.Logf == nil { - opt.Env.Logf = log.Printf - } - if src == nil { b, err := ioutil.ReadFile(filename) if err != nil { diff --git a/vendor/golang.org/x/tools/internal/imports/mod.go b/vendor/golang.org/x/tools/internal/imports/mod.go index 0f9b87eb73..69e3eecc4c 100644 --- a/vendor/golang.org/x/tools/internal/imports/mod.go +++ b/vendor/golang.org/x/tools/internal/imports/mod.go @@ -13,11 +13,10 @@ import ( "sort" "strconv" "strings" - "sync" + "golang.org/x/mod/module" + "golang.org/x/mod/semver" "golang.org/x/tools/internal/gopathwalk" - "golang.org/x/tools/internal/module" - "golang.org/x/tools/internal/semver" ) // ModuleResolver implements resolver for modules using the go command as little @@ -26,11 +25,14 @@ type ModuleResolver struct { env *ProcessEnv moduleCacheDir string dummyVendorMod *ModuleJSON // If vendoring is enabled, the pseudo-module that represents the /vendor directory. + roots []gopathwalk.Root + scanSema chan struct{} // scanSema prevents concurrent scans and guards scannedRoots. + scannedRoots map[gopathwalk.Root]bool - Initialized bool - Main *ModuleJSON - ModsByModPath []*ModuleJSON // All modules, ordered by # of path components in module Path... - ModsByDir []*ModuleJSON // ...or Dir. + initialized bool + main *ModuleJSON + modsByModPath []*ModuleJSON // All modules, ordered by # of path components in module Path... + modsByDir []*ModuleJSON // ...or Dir. // moduleCacheCache stores information about the module cache. moduleCacheCache *dirInfoCache @@ -41,13 +43,23 @@ type ModuleJSON struct { Path string // module path Replace *ModuleJSON // replaced by this module Main bool // is this the main module? + Indirect bool // is this module only an indirect dependency of main module? Dir string // directory holding files for this module, if any GoMod string // path to go.mod file for this module, if any GoVersion string // go version used in module } +func newModuleResolver(e *ProcessEnv) *ModuleResolver { + r := &ModuleResolver{ + env: e, + scanSema: make(chan struct{}, 1), + } + r.scanSema <- struct{}{} + return r +} + func (r *ModuleResolver) init() error { - if r.Initialized { + if r.initialized { return nil } mainMod, vendorEnabled, err := vendorEnabled(r.env) @@ -58,13 +70,13 @@ func (r *ModuleResolver) init() error { if mainMod != nil && vendorEnabled { // Vendor mode is on, so all the non-Main modules are irrelevant, // and we need to search /vendor for everything. - r.Main = mainMod + r.main = mainMod r.dummyVendorMod = &ModuleJSON{ Path: "", Dir: filepath.Join(mainMod.Dir, "vendor"), } - r.ModsByModPath = []*ModuleJSON{mainMod, r.dummyVendorMod} - r.ModsByDir = []*ModuleJSON{mainMod, r.dummyVendorMod} + r.modsByModPath = []*ModuleJSON{mainMod, r.dummyVendorMod} + r.modsByDir = []*ModuleJSON{mainMod, r.dummyVendorMod} } else { // Vendor mode is off, so run go list -m ... to find everything. r.initAllMods() @@ -72,35 +84,69 @@ func (r *ModuleResolver) init() error { r.moduleCacheDir = filepath.Join(filepath.SplitList(r.env.GOPATH)[0], "/pkg/mod") - sort.Slice(r.ModsByModPath, func(i, j int) bool { + sort.Slice(r.modsByModPath, func(i, j int) bool { count := func(x int) int { - return strings.Count(r.ModsByModPath[x].Path, "/") + return strings.Count(r.modsByModPath[x].Path, "/") } return count(j) < count(i) // descending order }) - sort.Slice(r.ModsByDir, func(i, j int) bool { + sort.Slice(r.modsByDir, func(i, j int) bool { count := func(x int) int { - return strings.Count(r.ModsByDir[x].Dir, "/") + return strings.Count(r.modsByDir[x].Dir, "/") } return count(j) < count(i) // descending order }) + r.roots = []gopathwalk.Root{ + {filepath.Join(r.env.GOROOT, "/src"), gopathwalk.RootGOROOT}, + } + if r.main != nil { + r.roots = append(r.roots, gopathwalk.Root{r.main.Dir, gopathwalk.RootCurrentModule}) + } + if vendorEnabled { + r.roots = append(r.roots, gopathwalk.Root{r.dummyVendorMod.Dir, gopathwalk.RootOther}) + } else { + addDep := func(mod *ModuleJSON) { + if mod.Replace == nil { + // This is redundant with the cache, but we'll skip it cheaply enough. + r.roots = append(r.roots, gopathwalk.Root{mod.Dir, gopathwalk.RootModuleCache}) + } else { + r.roots = append(r.roots, gopathwalk.Root{mod.Dir, gopathwalk.RootOther}) + } + } + // Walk dependent modules before scanning the full mod cache, direct deps first. + for _, mod := range r.modsByModPath { + if !mod.Indirect && !mod.Main { + addDep(mod) + } + } + for _, mod := range r.modsByModPath { + if mod.Indirect && !mod.Main { + addDep(mod) + } + } + r.roots = append(r.roots, gopathwalk.Root{r.moduleCacheDir, gopathwalk.RootModuleCache}) + } + + r.scannedRoots = map[gopathwalk.Root]bool{} if r.moduleCacheCache == nil { r.moduleCacheCache = &dirInfoCache{ - dirs: map[string]*directoryPackageInfo{}, + dirs: map[string]*directoryPackageInfo{}, + listeners: map[*int]cacheListener{}, } } if r.otherCache == nil { r.otherCache = &dirInfoCache{ - dirs: map[string]*directoryPackageInfo{}, + dirs: map[string]*directoryPackageInfo{}, + listeners: map[*int]cacheListener{}, } } - r.Initialized = true + r.initialized = true return nil } func (r *ModuleResolver) initAllMods() error { - stdout, err := r.env.invokeGo("list", "-m", "-json", "...") + stdout, err := r.env.invokeGo(context.TODO(), "list", "-m", "-json", "...") if err != nil { return err } @@ -110,33 +156,43 @@ func (r *ModuleResolver) initAllMods() error { return err } if mod.Dir == "" { - if r.env.Debug { + if r.env.Logf != nil { r.env.Logf("module %v has not been downloaded and will be ignored", mod.Path) } // Can't do anything with a module that's not downloaded. continue } - r.ModsByModPath = append(r.ModsByModPath, mod) - r.ModsByDir = append(r.ModsByDir, mod) + // golang/go#36193: the go command doesn't always clean paths. + mod.Dir = filepath.Clean(mod.Dir) + r.modsByModPath = append(r.modsByModPath, mod) + r.modsByDir = append(r.modsByDir, mod) if mod.Main { - r.Main = mod + r.main = mod } } return nil } func (r *ModuleResolver) ClearForNewScan() { + <-r.scanSema + r.scannedRoots = map[gopathwalk.Root]bool{} r.otherCache = &dirInfoCache{ - dirs: map[string]*directoryPackageInfo{}, + dirs: map[string]*directoryPackageInfo{}, + listeners: map[*int]cacheListener{}, } + r.scanSema <- struct{}{} } func (r *ModuleResolver) ClearForNewMod() { - env := r.env + <-r.scanSema *r = ModuleResolver{ - env: env, + env: r.env, + moduleCacheCache: r.moduleCacheCache, + otherCache: r.otherCache, + scanSema: r.scanSema, } r.init() + r.scanSema <- struct{}{} } // findPackage returns the module and directory that contains the package at @@ -144,7 +200,7 @@ func (r *ModuleResolver) ClearForNewMod() { func (r *ModuleResolver) findPackage(importPath string) (*ModuleJSON, string) { // This can't find packages in the stdlib, but that's harmless for all // the existing code paths. - for _, m := range r.ModsByModPath { + for _, m := range r.modsByModPath { if !strings.HasPrefix(importPath, m.Path) { continue } @@ -211,7 +267,7 @@ func (r *ModuleResolver) cacheKeys() []string { } // cachePackageName caches the package name for a dir already in the cache. -func (r *ModuleResolver) cachePackageName(info directoryPackageInfo) (directoryPackageInfo, error) { +func (r *ModuleResolver) cachePackageName(info directoryPackageInfo) (string, error) { if info.rootType == gopathwalk.RootModuleCache { return r.moduleCacheCache.CachePackageName(info) } @@ -238,7 +294,7 @@ func (r *ModuleResolver) findModuleByDir(dir string) *ModuleJSON { // - in /vendor/ in -mod=vendor mode. // - nested module? Dunno. // Rumor has it that replace targets cannot contain other replace targets. - for _, m := range r.ModsByDir { + for _, m := range r.modsByDir { if !strings.HasPrefix(dir, m.Dir) { continue } @@ -333,41 +389,49 @@ func (r *ModuleResolver) loadPackageNames(importPaths []string, srcDir string) ( return names, nil } -func (r *ModuleResolver) scan(_ references, loadNames bool, exclude []gopathwalk.RootType) ([]*pkg, error) { +func (r *ModuleResolver) scan(ctx context.Context, callback *scanCallback) error { if err := r.init(); err != nil { - return nil, err + return err } - // Walk GOROOT, GOPATH/pkg/mod, and the main module. - roots := []gopathwalk.Root{ - {filepath.Join(r.env.GOROOT, "/src"), gopathwalk.RootGOROOT}, - } - if r.Main != nil { - roots = append(roots, gopathwalk.Root{r.Main.Dir, gopathwalk.RootCurrentModule}) - } - if r.dummyVendorMod != nil { - roots = append(roots, gopathwalk.Root{r.dummyVendorMod.Dir, gopathwalk.RootOther}) - } else { - roots = append(roots, gopathwalk.Root{r.moduleCacheDir, gopathwalk.RootModuleCache}) - // Walk replace targets, just in case they're not in any of the above. - for _, mod := range r.ModsByModPath { - if mod.Replace != nil { - roots = append(roots, gopathwalk.Root{mod.Dir, gopathwalk.RootOther}) - } + processDir := func(info directoryPackageInfo) { + // Skip this directory if we were not able to get the package information successfully. + if scanned, err := info.reachedStatus(directoryScanned); !scanned || err != nil { + return + } + pkg, err := r.canonicalize(info) + if err != nil { + return + } + + if !callback.dirFound(pkg) { + return + } + pkg.packageName, err = r.cachePackageName(info) + if err != nil { + return } - } - roots = filterRoots(roots, exclude) + if !callback.packageNameLoaded(pkg) { + return + } + _, exports, err := r.loadExports(ctx, pkg, false) + if err != nil { + return + } + callback.exportsLoaded(pkg, exports) + } - var result []*pkg - var mu sync.Mutex + // Start processing everything in the cache, and listen for the new stuff + // we discover in the walk below. + stop1 := r.moduleCacheCache.ScanAndListen(ctx, processDir) + defer stop1() + stop2 := r.otherCache.ScanAndListen(ctx, processDir) + defer stop2() - // We assume cached directories have not changed. We can skip them and their - // children. + // We assume cached directories are fully cached, including all their + // children, and have not changed. We can skip them. skip := func(root gopathwalk.Root, dir string) bool { - mu.Lock() - defer mu.Unlock() - info, ok := r.cacheLoad(dir) if !ok { return false @@ -379,44 +443,64 @@ func (r *ModuleResolver) scan(_ references, loadNames bool, exclude []gopathwalk return packageScanned } - // Add anything new to the cache. We'll process everything in it below. + // Add anything new to the cache, and process it if we're still listening. add := func(root gopathwalk.Root, dir string) { - mu.Lock() - defer mu.Unlock() - r.cacheStore(r.scanDirForPackage(root, dir)) } - gopathwalk.WalkSkip(roots, add, skip, gopathwalk.Options{Debug: r.env.Debug, ModulesEnabled: true}) - - // Everything we already had, and everything new, is now in the cache. - for _, dir := range r.cacheKeys() { - info, ok := r.cacheLoad(dir) - if !ok { - continue - } - - // Skip this directory if we were not able to get the package information successfully. - if scanned, err := info.reachedStatus(directoryScanned); !scanned || err != nil { - continue - } + // r.roots and the callback are not necessarily safe to use in the + // goroutine below. Process them eagerly. + roots := filterRoots(r.roots, callback.rootFound) + // We can't cancel walks, because we need them to finish to have a usable + // cache. Instead, run them in a separate goroutine and detach. + scanDone := make(chan struct{}) + go func() { + select { + case <-ctx.Done(): + return + case <-r.scanSema: + } + defer func() { r.scanSema <- struct{}{} }() + // We have the lock on r.scannedRoots, and no other scans can run. + for _, root := range roots { + if ctx.Err() != nil { + return + } - // If we want package names, make sure the cache has them. - if loadNames { - var err error - if info, err = r.cachePackageName(info); err != nil { + if r.scannedRoots[root] { continue } + gopathwalk.WalkSkip([]gopathwalk.Root{root}, add, skip, gopathwalk.Options{Logf: r.env.Logf, ModulesEnabled: true}) + r.scannedRoots[root] = true } + close(scanDone) + }() + select { + case <-ctx.Done(): + case <-scanDone: + } + return nil +} - res, err := r.canonicalize(info) - if err != nil { - continue - } - result = append(result, res) +func (r *ModuleResolver) scoreImportPath(ctx context.Context, path string) int { + if _, ok := stdlib[path]; ok { + return MaxRelevance } + mod, _ := r.findPackage(path) + return modRelevance(mod) +} - return result, nil +func modRelevance(mod *ModuleJSON) int { + switch { + case mod == nil: // out of scope + return MaxRelevance - 4 + case mod.Indirect: + return MaxRelevance - 3 + case !mod.Main: + return MaxRelevance - 2 + default: + return MaxRelevance - 1 // main module ties with stdlib + } } // canonicalize gets the result of canonicalizing the packages using the results @@ -428,15 +512,14 @@ func (r *ModuleResolver) canonicalize(info directoryPackageInfo) (*pkg, error) { importPathShort: info.nonCanonicalImportPath, dir: info.dir, packageName: path.Base(info.nonCanonicalImportPath), - relevance: 0, + relevance: MaxRelevance, }, nil } importPath := info.nonCanonicalImportPath - relevance := 2 + mod := r.findModuleByDir(info.dir) // Check if the directory is underneath a module that's in scope. - if mod := r.findModuleByDir(info.dir); mod != nil { - relevance = 1 + if mod != nil { // It is. If dir is the target of a replace directive, // our guessed import path is wrong. Use the real one. if mod.Dir == info.dir { @@ -445,15 +528,16 @@ func (r *ModuleResolver) canonicalize(info directoryPackageInfo) (*pkg, error) { dirInMod := info.dir[len(mod.Dir)+len("/"):] importPath = path.Join(mod.Path, filepath.ToSlash(dirInMod)) } - } else if info.needsReplace { + } else if !strings.HasPrefix(importPath, info.moduleName) { + // The module's name doesn't match the package's import path. It + // probably needs a replace directive we don't have. return nil, fmt.Errorf("package in %q is not valid without a replace statement", info.dir) } res := &pkg{ importPathShort: importPath, dir: info.dir, - packageName: info.packageName, // may not be populated if the caller didn't ask for it - relevance: relevance, + relevance: modRelevance(mod), } // We may have discovered a package that has a different version // in scope already. Canonicalize to that one if possible. @@ -463,14 +547,14 @@ func (r *ModuleResolver) canonicalize(info directoryPackageInfo) (*pkg, error) { return res, nil } -func (r *ModuleResolver) loadExports(ctx context.Context, pkg *pkg) (string, []string, error) { +func (r *ModuleResolver) loadExports(ctx context.Context, pkg *pkg, includeTest bool) (string, []string, error) { if err := r.init(); err != nil { return "", nil, err } - if info, ok := r.cacheLoad(pkg.dir); ok { + if info, ok := r.cacheLoad(pkg.dir); ok && !includeTest { return r.cacheExports(ctx, r.env, info) } - return loadExportsFromFiles(ctx, r.env, pkg.dir) + return loadExportsFromFiles(ctx, r.env, pkg.dir, includeTest) } func (r *ModuleResolver) scanDirForPackage(root gopathwalk.Root, dir string) directoryPackageInfo { @@ -488,7 +572,7 @@ func (r *ModuleResolver) scanDirForPackage(root gopathwalk.Root, dir string) dir } switch root.Type { case gopathwalk.RootCurrentModule: - importPath = path.Join(r.Main.Path, filepath.ToSlash(subdir)) + importPath = path.Join(r.main.Path, filepath.ToSlash(subdir)) case gopathwalk.RootModuleCache: matches := modCacheRegexp.FindStringSubmatch(subdir) if len(matches) == 0 { @@ -497,9 +581,9 @@ func (r *ModuleResolver) scanDirForPackage(root gopathwalk.Root, dir string) dir err: fmt.Errorf("invalid module cache path: %v", subdir), } } - modPath, err := module.DecodePath(filepath.ToSlash(matches[1])) + modPath, err := module.UnescapePath(filepath.ToSlash(matches[1])) if err != nil { - if r.env.Debug { + if r.env.Logf != nil { r.env.Logf("decoding module cache path %q: %v", subdir, err) } return directoryPackageInfo{ @@ -516,7 +600,6 @@ func (r *ModuleResolver) scanDirForPackage(root gopathwalk.Root, dir string) dir dir: dir, rootType: root.Type, nonCanonicalImportPath: importPath, - needsReplace: false, moduleDir: modDir, moduleName: modName, } @@ -524,14 +607,6 @@ func (r *ModuleResolver) scanDirForPackage(root gopathwalk.Root, dir string) dir // stdlib packages are always in scope, despite the confusing go.mod return result } - // Check that this package is not obviously impossible to import. - if !strings.HasPrefix(importPath, modName) { - // The module's declared path does not match - // its expected path. It probably needs a - // replace directive we don't have. - result.needsReplace = true - } - return result } @@ -624,7 +699,7 @@ func getMainModuleAnd114(env *ProcessEnv) (*ModuleJSON, bool, error) { {{.GoVersion}} {{range context.ReleaseTags}}{{if eq . "go1.14"}}{{.}}{{end}}{{end}} ` - stdout, err := env.invokeGo("list", "-m", "-f", format) + stdout, err := env.invokeGo(context.TODO(), "list", "-m", "-f", format) if err != nil { return nil, false, nil } diff --git a/vendor/golang.org/x/tools/internal/imports/mod_cache.go b/vendor/golang.org/x/tools/internal/imports/mod_cache.go index f6b070a3f6..5b4f03accd 100644 --- a/vendor/golang.org/x/tools/internal/imports/mod_cache.go +++ b/vendor/golang.org/x/tools/internal/imports/mod_cache.go @@ -49,10 +49,6 @@ type directoryPackageInfo struct { // nonCanonicalImportPath is the package's expected import path. It may // not actually be importable at that path. nonCanonicalImportPath string - // needsReplace is true if the nonCanonicalImportPath does not match the - // module's declared path, making it impossible to import without a - // replace directive. - needsReplace bool // Module-related information. moduleDir string // The directory that is the module root of this dir. @@ -97,15 +93,86 @@ func (info *directoryPackageInfo) reachedStatus(target directoryPackageStatus) ( type dirInfoCache struct { mu sync.Mutex // dirs stores information about packages in directories, keyed by absolute path. - dirs map[string]*directoryPackageInfo + dirs map[string]*directoryPackageInfo + listeners map[*int]cacheListener +} + +type cacheListener func(directoryPackageInfo) + +// ScanAndListen calls listener on all the items in the cache, and on anything +// newly added. The returned stop function waits for all in-flight callbacks to +// finish and blocks new ones. +func (d *dirInfoCache) ScanAndListen(ctx context.Context, listener cacheListener) func() { + ctx, cancel := context.WithCancel(ctx) + + // Flushing out all the callbacks is tricky without knowing how many there + // are going to be. Setting an arbitrary limit makes it much easier. + const maxInFlight = 10 + sema := make(chan struct{}, maxInFlight) + for i := 0; i < maxInFlight; i++ { + sema <- struct{}{} + } + + cookie := new(int) // A unique ID we can use for the listener. + + // We can't hold mu while calling the listener. + d.mu.Lock() + var keys []string + for key := range d.dirs { + keys = append(keys, key) + } + d.listeners[cookie] = func(info directoryPackageInfo) { + select { + case <-ctx.Done(): + return + case <-sema: + } + listener(info) + sema <- struct{}{} + } + d.mu.Unlock() + + stop := func() { + cancel() + d.mu.Lock() + delete(d.listeners, cookie) + d.mu.Unlock() + for i := 0; i < maxInFlight; i++ { + <-sema + } + } + + // Process the pre-existing keys. + for _, k := range keys { + select { + case <-ctx.Done(): + return stop + default: + } + if v, ok := d.Load(k); ok { + listener(v) + } + } + + return stop } // Store stores the package info for dir. func (d *dirInfoCache) Store(dir string, info directoryPackageInfo) { d.mu.Lock() - defer d.mu.Unlock() - stored := info // defensive copy - d.dirs[dir] = &stored + _, old := d.dirs[dir] + d.dirs[dir] = &info + var listeners []cacheListener + for _, l := range d.listeners { + listeners = append(listeners, l) + } + d.mu.Unlock() + + if !old { + for _, l := range listeners { + l(info) + } + } } // Load returns a copy of the directoryPackageInfo for absolute directory dir. @@ -129,17 +196,17 @@ func (d *dirInfoCache) Keys() (keys []string) { return keys } -func (d *dirInfoCache) CachePackageName(info directoryPackageInfo) (directoryPackageInfo, error) { +func (d *dirInfoCache) CachePackageName(info directoryPackageInfo) (string, error) { if loaded, err := info.reachedStatus(nameLoaded); loaded { - return info, err + return info.packageName, err } if scanned, err := info.reachedStatus(directoryScanned); !scanned || err != nil { - return info, fmt.Errorf("cannot read package name, scan error: %v", err) + return "", fmt.Errorf("cannot read package name, scan error: %v", err) } info.packageName, info.err = packageDirToName(info.dir) info.status = nameLoaded d.Store(info.dir, info) - return info, info.err + return info.packageName, info.err } func (d *dirInfoCache) CacheExports(ctx context.Context, env *ProcessEnv, info directoryPackageInfo) (string, []string, error) { @@ -149,8 +216,8 @@ func (d *dirInfoCache) CacheExports(ctx context.Context, env *ProcessEnv, info d if reached, err := info.reachedStatus(nameLoaded); reached && err != nil { return "", nil, err } - info.packageName, info.exports, info.err = loadExportsFromFiles(ctx, env, info.dir) - if info.err == context.Canceled { + info.packageName, info.exports, info.err = loadExportsFromFiles(ctx, env, info.dir, false) + if info.err == context.Canceled || info.err == context.DeadlineExceeded { return info.packageName, info.exports, info.err } // The cache structure wants things to proceed linearly. We can skip a diff --git a/vendor/golang.org/x/tools/internal/packagesinternal/packages.go b/vendor/golang.org/x/tools/internal/packagesinternal/packages.go new file mode 100644 index 0000000000..b13ce33a39 --- /dev/null +++ b/vendor/golang.org/x/tools/internal/packagesinternal/packages.go @@ -0,0 +1,27 @@ +// Package packagesinternal exposes internal-only fields from go/packages. +package packagesinternal + +import "time" + +// Fields must match go list; +type Module struct { + Path string // module path + Version string // module version + Versions []string // available module versions (with -versions) + Replace *Module // replaced by this module + Time *time.Time // time version was created + Update *Module // available update, if any (with -u) + Main bool // is this the main module? + Indirect bool // is this module only an indirect dependency of main module? + Dir string // directory holding files for this module, if any + GoMod string // path to go.mod file used when loading this module, if any + GoVersion string // go version used in module + Error *ModuleError // error loading module +} +type ModuleError struct { + Err string // the error itself +} + +var GetForTest = func(p interface{}) string { return "" } + +var GetModule = func(p interface{}) *Module { return nil } diff --git a/vendor/golang.org/x/tools/internal/span/parse.go b/vendor/golang.org/x/tools/internal/span/parse.go deleted file mode 100644 index b3f268a38a..0000000000 --- a/vendor/golang.org/x/tools/internal/span/parse.go +++ /dev/null @@ -1,100 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package span - -import ( - "strconv" - "strings" - "unicode/utf8" -) - -// Parse returns the location represented by the input. -// All inputs are valid locations, as they can always be a pure filename. -// The returned span will be normalized, and thus if printed may produce a -// different string. -func Parse(input string) Span { - // :0:0#0-0:0#0 - valid := input - var hold, offset int - hadCol := false - suf := rstripSuffix(input) - if suf.sep == "#" { - offset = suf.num - suf = rstripSuffix(suf.remains) - } - if suf.sep == ":" { - valid = suf.remains - hold = suf.num - hadCol = true - suf = rstripSuffix(suf.remains) - } - switch { - case suf.sep == ":": - return New(NewURI(suf.remains), NewPoint(suf.num, hold, offset), Point{}) - case suf.sep == "-": - // we have a span, fall out of the case to continue - default: - // separator not valid, rewind to either the : or the start - return New(NewURI(valid), NewPoint(hold, 0, offset), Point{}) - } - // only the span form can get here - // at this point we still don't know what the numbers we have mean - // if have not yet seen a : then we might have either a line or a column depending - // on whether start has a column or not - // we build an end point and will fix it later if needed - end := NewPoint(suf.num, hold, offset) - hold, offset = 0, 0 - suf = rstripSuffix(suf.remains) - if suf.sep == "#" { - offset = suf.num - suf = rstripSuffix(suf.remains) - } - if suf.sep != ":" { - // turns out we don't have a span after all, rewind - return New(NewURI(valid), end, Point{}) - } - valid = suf.remains - hold = suf.num - suf = rstripSuffix(suf.remains) - if suf.sep != ":" { - // line#offset only - return New(NewURI(valid), NewPoint(hold, 0, offset), end) - } - // we have a column, so if end only had one number, it is also the column - if !hadCol { - end = NewPoint(suf.num, end.v.Line, end.v.Offset) - } - return New(NewURI(suf.remains), NewPoint(suf.num, hold, offset), end) -} - -type suffix struct { - remains string - sep string - num int -} - -func rstripSuffix(input string) suffix { - if len(input) == 0 { - return suffix{"", "", -1} - } - remains := input - num := -1 - // first see if we have a number at the end - last := strings.LastIndexFunc(remains, func(r rune) bool { return r < '0' || r > '9' }) - if last >= 0 && last < len(remains)-1 { - number, err := strconv.ParseInt(remains[last+1:], 10, 64) - if err == nil { - num = int(number) - remains = remains[:last+1] - } - } - // now see if we have a trailing separator - r, w := utf8.DecodeLastRuneInString(remains) - if r != ':' && r != '#' && r == '#' { - return suffix{input, "", -1} - } - remains = remains[:len(remains)-w] - return suffix{remains, string(r), num} -} diff --git a/vendor/golang.org/x/tools/internal/span/span.go b/vendor/golang.org/x/tools/internal/span/span.go deleted file mode 100644 index 4d2ad09866..0000000000 --- a/vendor/golang.org/x/tools/internal/span/span.go +++ /dev/null @@ -1,285 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package span contains support for representing with positions and ranges in -// text files. -package span - -import ( - "encoding/json" - "fmt" - "path" -) - -// Span represents a source code range in standardized form. -type Span struct { - v span -} - -// Point represents a single point within a file. -// In general this should only be used as part of a Span, as on its own it -// does not carry enough information. -type Point struct { - v point -} - -type span struct { - URI URI `json:"uri"` - Start point `json:"start"` - End point `json:"end"` -} - -type point struct { - Line int `json:"line"` - Column int `json:"column"` - Offset int `json:"offset"` -} - -// Invalid is a span that reports false from IsValid -var Invalid = Span{v: span{Start: invalidPoint.v, End: invalidPoint.v}} - -var invalidPoint = Point{v: point{Line: 0, Column: 0, Offset: -1}} - -// Converter is the interface to an object that can convert between line:column -// and offset forms for a single file. -type Converter interface { - //ToPosition converts from an offset to a line:column pair. - ToPosition(offset int) (int, int, error) - //ToOffset converts from a line:column pair to an offset. - ToOffset(line, col int) (int, error) -} - -func New(uri URI, start Point, end Point) Span { - s := Span{v: span{URI: uri, Start: start.v, End: end.v}} - s.v.clean() - return s -} - -func NewPoint(line, col, offset int) Point { - p := Point{v: point{Line: line, Column: col, Offset: offset}} - p.v.clean() - return p -} - -func Compare(a, b Span) int { - if r := CompareURI(a.URI(), b.URI()); r != 0 { - return r - } - if r := comparePoint(a.v.Start, b.v.Start); r != 0 { - return r - } - return comparePoint(a.v.End, b.v.End) -} - -func ComparePoint(a, b Point) int { - return comparePoint(a.v, b.v) -} - -func comparePoint(a, b point) int { - if !a.hasPosition() { - if a.Offset < b.Offset { - return -1 - } - if a.Offset > b.Offset { - return 1 - } - return 0 - } - if a.Line < b.Line { - return -1 - } - if a.Line > b.Line { - return 1 - } - if a.Column < b.Column { - return -1 - } - if a.Column > b.Column { - return 1 - } - return 0 -} - -func (s Span) HasPosition() bool { return s.v.Start.hasPosition() } -func (s Span) HasOffset() bool { return s.v.Start.hasOffset() } -func (s Span) IsValid() bool { return s.v.Start.isValid() } -func (s Span) IsPoint() bool { return s.v.Start == s.v.End } -func (s Span) URI() URI { return s.v.URI } -func (s Span) Start() Point { return Point{s.v.Start} } -func (s Span) End() Point { return Point{s.v.End} } -func (s *Span) MarshalJSON() ([]byte, error) { return json.Marshal(&s.v) } -func (s *Span) UnmarshalJSON(b []byte) error { return json.Unmarshal(b, &s.v) } - -func (p Point) HasPosition() bool { return p.v.hasPosition() } -func (p Point) HasOffset() bool { return p.v.hasOffset() } -func (p Point) IsValid() bool { return p.v.isValid() } -func (p *Point) MarshalJSON() ([]byte, error) { return json.Marshal(&p.v) } -func (p *Point) UnmarshalJSON(b []byte) error { return json.Unmarshal(b, &p.v) } -func (p Point) Line() int { - if !p.v.hasPosition() { - panic(fmt.Errorf("position not set in %v", p.v)) - } - return p.v.Line -} -func (p Point) Column() int { - if !p.v.hasPosition() { - panic(fmt.Errorf("position not set in %v", p.v)) - } - return p.v.Column -} -func (p Point) Offset() int { - if !p.v.hasOffset() { - panic(fmt.Errorf("offset not set in %v", p.v)) - } - return p.v.Offset -} - -func (p point) hasPosition() bool { return p.Line > 0 } -func (p point) hasOffset() bool { return p.Offset >= 0 } -func (p point) isValid() bool { return p.hasPosition() || p.hasOffset() } -func (p point) isZero() bool { - return (p.Line == 1 && p.Column == 1) || (!p.hasPosition() && p.Offset == 0) -} - -func (s *span) clean() { - //this presumes the points are already clean - if !s.End.isValid() || (s.End == point{}) { - s.End = s.Start - } -} - -func (p *point) clean() { - if p.Line < 0 { - p.Line = 0 - } - if p.Column <= 0 { - if p.Line > 0 { - p.Column = 1 - } else { - p.Column = 0 - } - } - if p.Offset == 0 && (p.Line > 1 || p.Column > 1) { - p.Offset = -1 - } -} - -// Format implements fmt.Formatter to print the Location in a standard form. -// The format produced is one that can be read back in using Parse. -func (s Span) Format(f fmt.State, c rune) { - fullForm := f.Flag('+') - preferOffset := f.Flag('#') - // we should always have a uri, simplify if it is file format - //TODO: make sure the end of the uri is unambiguous - uri := string(s.v.URI) - if c == 'f' { - uri = path.Base(uri) - } else if !fullForm { - uri = s.v.URI.Filename() - } - fmt.Fprint(f, uri) - if !s.IsValid() || (!fullForm && s.v.Start.isZero() && s.v.End.isZero()) { - return - } - // see which bits of start to write - printOffset := s.HasOffset() && (fullForm || preferOffset || !s.HasPosition()) - printLine := s.HasPosition() && (fullForm || !printOffset) - printColumn := printLine && (fullForm || (s.v.Start.Column > 1 || s.v.End.Column > 1)) - fmt.Fprint(f, ":") - if printLine { - fmt.Fprintf(f, "%d", s.v.Start.Line) - } - if printColumn { - fmt.Fprintf(f, ":%d", s.v.Start.Column) - } - if printOffset { - fmt.Fprintf(f, "#%d", s.v.Start.Offset) - } - // start is written, do we need end? - if s.IsPoint() { - return - } - // we don't print the line if it did not change - printLine = fullForm || (printLine && s.v.End.Line > s.v.Start.Line) - fmt.Fprint(f, "-") - if printLine { - fmt.Fprintf(f, "%d", s.v.End.Line) - } - if printColumn { - if printLine { - fmt.Fprint(f, ":") - } - fmt.Fprintf(f, "%d", s.v.End.Column) - } - if printOffset { - fmt.Fprintf(f, "#%d", s.v.End.Offset) - } -} - -func (s Span) WithPosition(c Converter) (Span, error) { - if err := s.update(c, true, false); err != nil { - return Span{}, err - } - return s, nil -} - -func (s Span) WithOffset(c Converter) (Span, error) { - if err := s.update(c, false, true); err != nil { - return Span{}, err - } - return s, nil -} - -func (s Span) WithAll(c Converter) (Span, error) { - if err := s.update(c, true, true); err != nil { - return Span{}, err - } - return s, nil -} - -func (s *Span) update(c Converter, withPos, withOffset bool) error { - if !s.IsValid() { - return fmt.Errorf("cannot add information to an invalid span") - } - if withPos && !s.HasPosition() { - if err := s.v.Start.updatePosition(c); err != nil { - return err - } - if s.v.End.Offset == s.v.Start.Offset { - s.v.End = s.v.Start - } else if err := s.v.End.updatePosition(c); err != nil { - return err - } - } - if withOffset && (!s.HasOffset() || (s.v.End.hasPosition() && !s.v.End.hasOffset())) { - if err := s.v.Start.updateOffset(c); err != nil { - return err - } - if s.v.End.Line == s.v.Start.Line && s.v.End.Column == s.v.Start.Column { - s.v.End.Offset = s.v.Start.Offset - } else if err := s.v.End.updateOffset(c); err != nil { - return err - } - } - return nil -} - -func (p *point) updatePosition(c Converter) error { - line, col, err := c.ToPosition(p.Offset) - if err != nil { - return err - } - p.Line = line - p.Column = col - return nil -} - -func (p *point) updateOffset(c Converter) error { - offset, err := c.ToOffset(p.Line, p.Column) - if err != nil { - return err - } - p.Offset = offset - return nil -} diff --git a/vendor/golang.org/x/tools/internal/span/token.go b/vendor/golang.org/x/tools/internal/span/token.go deleted file mode 100644 index ce44541b2f..0000000000 --- a/vendor/golang.org/x/tools/internal/span/token.go +++ /dev/null @@ -1,151 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package span - -import ( - "fmt" - "go/token" -) - -// Range represents a source code range in token.Pos form. -// It also carries the FileSet that produced the positions, so that it is -// self contained. -type Range struct { - FileSet *token.FileSet - Start token.Pos - End token.Pos -} - -// TokenConverter is a Converter backed by a token file set and file. -// It uses the file set methods to work out the conversions, which -// makes it fast and does not require the file contents. -type TokenConverter struct { - fset *token.FileSet - file *token.File -} - -// NewRange creates a new Range from a FileSet and two positions. -// To represent a point pass a 0 as the end pos. -func NewRange(fset *token.FileSet, start, end token.Pos) Range { - return Range{ - FileSet: fset, - Start: start, - End: end, - } -} - -// NewTokenConverter returns an implementation of Converter backed by a -// token.File. -func NewTokenConverter(fset *token.FileSet, f *token.File) *TokenConverter { - return &TokenConverter{fset: fset, file: f} -} - -// NewContentConverter returns an implementation of Converter for the -// given file content. -func NewContentConverter(filename string, content []byte) *TokenConverter { - fset := token.NewFileSet() - f := fset.AddFile(filename, -1, len(content)) - f.SetLinesForContent(content) - return &TokenConverter{fset: fset, file: f} -} - -// IsPoint returns true if the range represents a single point. -func (r Range) IsPoint() bool { - return r.Start == r.End -} - -// Span converts a Range to a Span that represents the Range. -// It will fill in all the members of the Span, calculating the line and column -// information. -func (r Range) Span() (Span, error) { - f := r.FileSet.File(r.Start) - if f == nil { - return Span{}, fmt.Errorf("file not found in FileSet") - } - s := Span{v: span{URI: FileURI(f.Name())}} - var err error - s.v.Start.Offset, err = offset(f, r.Start) - if err != nil { - return Span{}, err - } - if r.End.IsValid() { - s.v.End.Offset, err = offset(f, r.End) - if err != nil { - return Span{}, err - } - } - s.v.Start.clean() - s.v.End.clean() - s.v.clean() - converter := NewTokenConverter(r.FileSet, f) - return s.WithPosition(converter) -} - -// offset is a copy of the Offset function in go/token, but with the adjustment -// that it does not panic on invalid positions. -func offset(f *token.File, pos token.Pos) (int, error) { - if int(pos) < f.Base() || int(pos) > f.Base()+f.Size() { - return 0, fmt.Errorf("invalid pos") - } - return int(pos) - f.Base(), nil -} - -// Range converts a Span to a Range that represents the Span for the supplied -// File. -func (s Span) Range(converter *TokenConverter) (Range, error) { - s, err := s.WithOffset(converter) - if err != nil { - return Range{}, err - } - // go/token will panic if the offset is larger than the file's size, - // so check here to avoid panicking. - if s.Start().Offset() > converter.file.Size() { - return Range{}, fmt.Errorf("start offset %v is past the end of the file %v", s.Start(), converter.file.Size()) - } - if s.End().Offset() > converter.file.Size() { - return Range{}, fmt.Errorf("end offset %v is past the end of the file %v", s.End(), converter.file.Size()) - } - return Range{ - FileSet: converter.fset, - Start: converter.file.Pos(s.Start().Offset()), - End: converter.file.Pos(s.End().Offset()), - }, nil -} - -func (l *TokenConverter) ToPosition(offset int) (int, int, error) { - if offset > l.file.Size() { - return 0, 0, fmt.Errorf("offset %v is past the end of the file %v", offset, l.file.Size()) - } - pos := l.file.Pos(offset) - p := l.fset.Position(pos) - if offset == l.file.Size() { - return p.Line + 1, 1, nil - } - return p.Line, p.Column, nil -} - -func (l *TokenConverter) ToOffset(line, col int) (int, error) { - if line < 0 { - return -1, fmt.Errorf("line is not valid") - } - lineMax := l.file.LineCount() + 1 - if line > lineMax { - return -1, fmt.Errorf("line is beyond end of file %v", lineMax) - } else if line == lineMax { - if col > 1 { - return -1, fmt.Errorf("column is beyond end of file") - } - // at the end of the file, allowing for a trailing eol - return l.file.Size(), nil - } - pos := lineStart(l.file, line) - if !pos.IsValid() { - return -1, fmt.Errorf("line is not in file") - } - // we assume that column is in bytes here, and that the first byte of a - // line is at column 1 - pos += token.Pos(col - 1) - return offset(l.file, pos) -} diff --git a/vendor/golang.org/x/tools/internal/span/token111.go b/vendor/golang.org/x/tools/internal/span/token111.go deleted file mode 100644 index bf7a5406b6..0000000000 --- a/vendor/golang.org/x/tools/internal/span/token111.go +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build !go1.12 - -package span - -import ( - "go/token" -) - -// lineStart is the pre-Go 1.12 version of (*token.File).LineStart. For Go -// versions <= 1.11, we borrow logic from the analysisutil package. -// TODO(rstambler): Delete this file when we no longer support Go 1.11. -func lineStart(f *token.File, line int) token.Pos { - // Use binary search to find the start offset of this line. - - min := 0 // inclusive - max := f.Size() // exclusive - for { - offset := (min + max) / 2 - pos := f.Pos(offset) - posn := f.Position(pos) - if posn.Line == line { - return pos - (token.Pos(posn.Column) - 1) - } - - if min+1 >= max { - return token.NoPos - } - - if posn.Line < line { - min = offset - } else { - max = offset - } - } -} diff --git a/vendor/golang.org/x/tools/internal/span/token112.go b/vendor/golang.org/x/tools/internal/span/token112.go deleted file mode 100644 index 017aec9c13..0000000000 --- a/vendor/golang.org/x/tools/internal/span/token112.go +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build go1.12 - -package span - -import ( - "go/token" -) - -// TODO(rstambler): Delete this file when we no longer support Go 1.11. -func lineStart(f *token.File, line int) token.Pos { - return f.LineStart(line) -} diff --git a/vendor/golang.org/x/tools/internal/span/uri.go b/vendor/golang.org/x/tools/internal/span/uri.go deleted file mode 100644 index e05a9e6ef5..0000000000 --- a/vendor/golang.org/x/tools/internal/span/uri.go +++ /dev/null @@ -1,152 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package span - -import ( - "fmt" - "net/url" - "os" - "path" - "path/filepath" - "runtime" - "strings" - "unicode" -) - -const fileScheme = "file" - -// URI represents the full URI for a file. -type URI string - -// Filename returns the file path for the given URI. -// It is an error to call this on a URI that is not a valid filename. -func (uri URI) Filename() string { - filename, err := filename(uri) - if err != nil { - panic(err) - } - return filepath.FromSlash(filename) -} - -func filename(uri URI) (string, error) { - if uri == "" { - return "", nil - } - u, err := url.ParseRequestURI(string(uri)) - if err != nil { - return "", err - } - if u.Scheme != fileScheme { - return "", fmt.Errorf("only file URIs are supported, got %q from %q", u.Scheme, uri) - } - if isWindowsDriveURI(u.Path) { - u.Path = u.Path[1:] - } - return u.Path, nil -} - -// NewURI returns a span URI for the string. -// It will attempt to detect if the string is a file path or uri. -func NewURI(s string) URI { - if u, err := url.PathUnescape(s); err == nil { - s = u - } - if strings.HasPrefix(s, fileScheme+"://") { - return URI(s) - } - return FileURI(s) -} - -func CompareURI(a, b URI) int { - if equalURI(a, b) { - return 0 - } - if a < b { - return -1 - } - return 1 -} - -func equalURI(a, b URI) bool { - if a == b { - return true - } - // If we have the same URI basename, we may still have the same file URIs. - if !strings.EqualFold(path.Base(string(a)), path.Base(string(b))) { - return false - } - fa, err := filename(a) - if err != nil { - return false - } - fb, err := filename(b) - if err != nil { - return false - } - // Stat the files to check if they are equal. - infoa, err := os.Stat(filepath.FromSlash(fa)) - if err != nil { - return false - } - infob, err := os.Stat(filepath.FromSlash(fb)) - if err != nil { - return false - } - return os.SameFile(infoa, infob) -} - -// FileURI returns a span URI for the supplied file path. -// It will always have the file scheme. -func FileURI(path string) URI { - if path == "" { - return "" - } - // Handle standard library paths that contain the literal "$GOROOT". - // TODO(rstambler): The go/packages API should allow one to determine a user's $GOROOT. - const prefix = "$GOROOT" - if len(path) >= len(prefix) && strings.EqualFold(prefix, path[:len(prefix)]) { - suffix := path[len(prefix):] - path = runtime.GOROOT() + suffix - } - if !isWindowsDrivePath(path) { - if abs, err := filepath.Abs(path); err == nil { - path = abs - } - } - // Check the file path again, in case it became absolute. - if isWindowsDrivePath(path) { - path = "/" + path - } - path = filepath.ToSlash(path) - u := url.URL{ - Scheme: fileScheme, - Path: path, - } - uri := u.String() - if unescaped, err := url.PathUnescape(uri); err == nil { - uri = unescaped - } - return URI(uri) -} - -// isWindowsDrivePath returns true if the file path is of the form used by -// Windows. We check if the path begins with a drive letter, followed by a ":". -func isWindowsDrivePath(path string) bool { - if len(path) < 4 { - return false - } - return unicode.IsLetter(rune(path[0])) && path[1] == ':' -} - -// isWindowsDriveURI returns true if the file URI is of the format used by -// Windows URIs. The url.Parse package does not specially handle Windows paths -// (see https://golang.org/issue/6027). We check if the URI path has -// a drive prefix (e.g. "/C:"). If so, we trim the leading "/". -func isWindowsDriveURI(uri string) bool { - if len(uri) < 4 { - return false - } - return uri[0] == '/' && unicode.IsLetter(rune(uri[1])) && uri[2] == ':' -} diff --git a/vendor/golang.org/x/tools/internal/span/utf16.go b/vendor/golang.org/x/tools/internal/span/utf16.go deleted file mode 100644 index 561b3fa50a..0000000000 --- a/vendor/golang.org/x/tools/internal/span/utf16.go +++ /dev/null @@ -1,94 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package span - -import ( - "fmt" - "unicode/utf16" - "unicode/utf8" -) - -// ToUTF16Column calculates the utf16 column expressed by the point given the -// supplied file contents. -// This is used to convert from the native (always in bytes) column -// representation and the utf16 counts used by some editors. -func ToUTF16Column(p Point, content []byte) (int, error) { - if content == nil { - return -1, fmt.Errorf("ToUTF16Column: missing content") - } - if !p.HasPosition() { - return -1, fmt.Errorf("ToUTF16Column: point is missing position") - } - if !p.HasOffset() { - return -1, fmt.Errorf("ToUTF16Column: point is missing offset") - } - offset := p.Offset() // 0-based - colZero := p.Column() - 1 // 0-based - if colZero == 0 { - // 0-based column 0, so it must be chr 1 - return 1, nil - } else if colZero < 0 { - return -1, fmt.Errorf("ToUTF16Column: column is invalid (%v)", colZero) - } - // work out the offset at the start of the line using the column - lineOffset := offset - colZero - if lineOffset < 0 || offset > len(content) { - return -1, fmt.Errorf("ToUTF16Column: offsets %v-%v outside file contents (%v)", lineOffset, offset, len(content)) - } - // Use the offset to pick out the line start. - // This cannot panic: offset > len(content) and lineOffset < offset. - start := content[lineOffset:] - - // Now, truncate down to the supplied column. - start = start[:colZero] - - // and count the number of utf16 characters - // in theory we could do this by hand more efficiently... - return len(utf16.Encode([]rune(string(start)))) + 1, nil -} - -// FromUTF16Column advances the point by the utf16 character offset given the -// supplied line contents. -// This is used to convert from the utf16 counts used by some editors to the -// native (always in bytes) column representation. -func FromUTF16Column(p Point, chr int, content []byte) (Point, error) { - if !p.HasOffset() { - return Point{}, fmt.Errorf("FromUTF16Column: point is missing offset") - } - // if chr is 1 then no adjustment needed - if chr <= 1 { - return p, nil - } - if p.Offset() >= len(content) { - return p, fmt.Errorf("FromUTF16Column: offset (%v) greater than length of content (%v)", p.Offset(), len(content)) - } - remains := content[p.Offset():] - // scan forward the specified number of characters - for count := 1; count < chr; count++ { - if len(remains) <= 0 { - return Point{}, fmt.Errorf("FromUTF16Column: chr goes beyond the content") - } - r, w := utf8.DecodeRune(remains) - if r == '\n' { - // Per the LSP spec: - // - // > If the character value is greater than the line length it - // > defaults back to the line length. - break - } - remains = remains[w:] - if r >= 0x10000 { - // a two point rune - count++ - // if we finished in a two point rune, do not advance past the first - if count >= chr { - break - } - } - p.v.Column += w - p.v.Offset += w - } - return p, nil -} diff --git a/vendor/golang.org/x/xerrors/LICENSE b/vendor/golang.org/x/xerrors/LICENSE new file mode 100644 index 0000000000..e4a47e17f1 --- /dev/null +++ b/vendor/golang.org/x/xerrors/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) 2019 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/golang.org/x/xerrors/PATENTS b/vendor/golang.org/x/xerrors/PATENTS new file mode 100644 index 0000000000..733099041f --- /dev/null +++ b/vendor/golang.org/x/xerrors/PATENTS @@ -0,0 +1,22 @@ +Additional IP Rights Grant (Patents) + +"This implementation" means the copyrightable works distributed by +Google as part of the Go project. + +Google hereby grants to You a perpetual, worldwide, non-exclusive, +no-charge, royalty-free, irrevocable (except as stated in this section) +patent license to make, have made, use, offer to sell, sell, import, +transfer and otherwise run, modify and propagate the contents of this +implementation of Go, where such license applies only to those patent +claims, both currently owned or controlled by Google and acquired in +the future, licensable by Google that are necessarily infringed by this +implementation of Go. This grant does not include claims that would be +infringed only as a consequence of further modification of this +implementation. If you or your agent or exclusive licensee institute or +order or agree to the institution of patent litigation against any +entity (including a cross-claim or counterclaim in a lawsuit) alleging +that this implementation of Go or any code incorporated within this +implementation of Go constitutes direct or contributory patent +infringement, or inducement of patent infringement, then any patent +rights granted to you under this License for this implementation of Go +shall terminate as of the date such litigation is filed. diff --git a/vendor/golang.org/x/xerrors/README b/vendor/golang.org/x/xerrors/README new file mode 100644 index 0000000000..aac7867a56 --- /dev/null +++ b/vendor/golang.org/x/xerrors/README @@ -0,0 +1,2 @@ +This repository holds the transition packages for the new Go 1.13 error values. +See golang.org/design/29934-error-values. diff --git a/vendor/golang.org/x/xerrors/adaptor.go b/vendor/golang.org/x/xerrors/adaptor.go new file mode 100644 index 0000000000..4317f24833 --- /dev/null +++ b/vendor/golang.org/x/xerrors/adaptor.go @@ -0,0 +1,193 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package xerrors + +import ( + "bytes" + "fmt" + "io" + "reflect" + "strconv" +) + +// FormatError calls the FormatError method of f with an errors.Printer +// configured according to s and verb, and writes the result to s. +func FormatError(f Formatter, s fmt.State, verb rune) { + // Assuming this function is only called from the Format method, and given + // that FormatError takes precedence over Format, it cannot be called from + // any package that supports errors.Formatter. It is therefore safe to + // disregard that State may be a specific printer implementation and use one + // of our choice instead. + + // limitations: does not support printing error as Go struct. + + var ( + sep = " " // separator before next error + p = &state{State: s} + direct = true + ) + + var err error = f + + switch verb { + // Note that this switch must match the preference order + // for ordinary string printing (%#v before %+v, and so on). + + case 'v': + if s.Flag('#') { + if stringer, ok := err.(fmt.GoStringer); ok { + io.WriteString(&p.buf, stringer.GoString()) + goto exit + } + // proceed as if it were %v + } else if s.Flag('+') { + p.printDetail = true + sep = "\n - " + } + case 's': + case 'q', 'x', 'X': + // Use an intermediate buffer in the rare cases that precision, + // truncation, or one of the alternative verbs (q, x, and X) are + // specified. + direct = false + + default: + p.buf.WriteString("%!") + p.buf.WriteRune(verb) + p.buf.WriteByte('(') + switch { + case err != nil: + p.buf.WriteString(reflect.TypeOf(f).String()) + default: + p.buf.WriteString("") + } + p.buf.WriteByte(')') + io.Copy(s, &p.buf) + return + } + +loop: + for { + switch v := err.(type) { + case Formatter: + err = v.FormatError((*printer)(p)) + case fmt.Formatter: + v.Format(p, 'v') + break loop + default: + io.WriteString(&p.buf, v.Error()) + break loop + } + if err == nil { + break + } + if p.needColon || !p.printDetail { + p.buf.WriteByte(':') + p.needColon = false + } + p.buf.WriteString(sep) + p.inDetail = false + p.needNewline = false + } + +exit: + width, okW := s.Width() + prec, okP := s.Precision() + + if !direct || (okW && width > 0) || okP { + // Construct format string from State s. + format := []byte{'%'} + if s.Flag('-') { + format = append(format, '-') + } + if s.Flag('+') { + format = append(format, '+') + } + if s.Flag(' ') { + format = append(format, ' ') + } + if okW { + format = strconv.AppendInt(format, int64(width), 10) + } + if okP { + format = append(format, '.') + format = strconv.AppendInt(format, int64(prec), 10) + } + format = append(format, string(verb)...) + fmt.Fprintf(s, string(format), p.buf.String()) + } else { + io.Copy(s, &p.buf) + } +} + +var detailSep = []byte("\n ") + +// state tracks error printing state. It implements fmt.State. +type state struct { + fmt.State + buf bytes.Buffer + + printDetail bool + inDetail bool + needColon bool + needNewline bool +} + +func (s *state) Write(b []byte) (n int, err error) { + if s.printDetail { + if len(b) == 0 { + return 0, nil + } + if s.inDetail && s.needColon { + s.needNewline = true + if b[0] == '\n' { + b = b[1:] + } + } + k := 0 + for i, c := range b { + if s.needNewline { + if s.inDetail && s.needColon { + s.buf.WriteByte(':') + s.needColon = false + } + s.buf.Write(detailSep) + s.needNewline = false + } + if c == '\n' { + s.buf.Write(b[k:i]) + k = i + 1 + s.needNewline = true + } + } + s.buf.Write(b[k:]) + if !s.inDetail { + s.needColon = true + } + } else if !s.inDetail { + s.buf.Write(b) + } + return len(b), nil +} + +// printer wraps a state to implement an xerrors.Printer. +type printer state + +func (s *printer) Print(args ...interface{}) { + if !s.inDetail || s.printDetail { + fmt.Fprint((*state)(s), args...) + } +} + +func (s *printer) Printf(format string, args ...interface{}) { + if !s.inDetail || s.printDetail { + fmt.Fprintf((*state)(s), format, args...) + } +} + +func (s *printer) Detail() bool { + s.inDetail = true + return s.printDetail +} diff --git a/vendor/golang.org/x/xerrors/codereview.cfg b/vendor/golang.org/x/xerrors/codereview.cfg new file mode 100644 index 0000000000..3f8b14b64e --- /dev/null +++ b/vendor/golang.org/x/xerrors/codereview.cfg @@ -0,0 +1 @@ +issuerepo: golang/go diff --git a/vendor/golang.org/x/xerrors/doc.go b/vendor/golang.org/x/xerrors/doc.go new file mode 100644 index 0000000000..eef99d9d54 --- /dev/null +++ b/vendor/golang.org/x/xerrors/doc.go @@ -0,0 +1,22 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package xerrors implements functions to manipulate errors. +// +// This package is based on the Go 2 proposal for error values: +// https://golang.org/design/29934-error-values +// +// These functions were incorporated into the standard library's errors package +// in Go 1.13: +// - Is +// - As +// - Unwrap +// +// Also, Errorf's %w verb was incorporated into fmt.Errorf. +// +// Use this package to get equivalent behavior in all supported Go versions. +// +// No other features of this package were included in Go 1.13, and at present +// there are no plans to include any of them. +package xerrors // import "golang.org/x/xerrors" diff --git a/vendor/golang.org/x/xerrors/errors.go b/vendor/golang.org/x/xerrors/errors.go new file mode 100644 index 0000000000..e88d3772d8 --- /dev/null +++ b/vendor/golang.org/x/xerrors/errors.go @@ -0,0 +1,33 @@ +// 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 xerrors + +import "fmt" + +// errorString is a trivial implementation of error. +type errorString struct { + s string + frame Frame +} + +// New returns an error that formats as the given text. +// +// The returned error contains a Frame set to the caller's location and +// implements Formatter to show this information when printed with details. +func New(text string) error { + return &errorString{text, Caller(1)} +} + +func (e *errorString) Error() string { + return e.s +} + +func (e *errorString) Format(s fmt.State, v rune) { FormatError(e, s, v) } + +func (e *errorString) FormatError(p Printer) (next error) { + p.Print(e.s) + e.frame.Format(p) + return nil +} diff --git a/vendor/golang.org/x/xerrors/fmt.go b/vendor/golang.org/x/xerrors/fmt.go new file mode 100644 index 0000000000..829862ddf6 --- /dev/null +++ b/vendor/golang.org/x/xerrors/fmt.go @@ -0,0 +1,187 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package xerrors + +import ( + "fmt" + "strings" + "unicode" + "unicode/utf8" + + "golang.org/x/xerrors/internal" +) + +const percentBangString = "%!" + +// Errorf formats according to a format specifier and returns the string as a +// value that satisfies error. +// +// The returned error includes the file and line number of the caller when +// formatted with additional detail enabled. If the last argument is an error +// the returned error's Format method will return it if the format string ends +// with ": %s", ": %v", or ": %w". If the last argument is an error and the +// format string ends with ": %w", the returned error implements an Unwrap +// method returning it. +// +// If the format specifier includes a %w verb with an error operand in a +// position other than at the end, the returned error will still implement an +// Unwrap method returning the operand, but the error's Format method will not +// return the wrapped error. +// +// It is invalid to include more than one %w verb or to supply it with an +// operand that does not implement the error interface. The %w verb is otherwise +// a synonym for %v. +func Errorf(format string, a ...interface{}) error { + format = formatPlusW(format) + // Support a ": %[wsv]" suffix, which works well with xerrors.Formatter. + wrap := strings.HasSuffix(format, ": %w") + idx, format2, ok := parsePercentW(format) + percentWElsewhere := !wrap && idx >= 0 + if !percentWElsewhere && (wrap || strings.HasSuffix(format, ": %s") || strings.HasSuffix(format, ": %v")) { + err := errorAt(a, len(a)-1) + if err == nil { + return &noWrapError{fmt.Sprintf(format, a...), nil, Caller(1)} + } + // TODO: this is not entirely correct. The error value could be + // printed elsewhere in format if it mixes numbered with unnumbered + // substitutions. With relatively small changes to doPrintf we can + // have it optionally ignore extra arguments and pass the argument + // list in its entirety. + msg := fmt.Sprintf(format[:len(format)-len(": %s")], a[:len(a)-1]...) + frame := Frame{} + if internal.EnableTrace { + frame = Caller(1) + } + if wrap { + return &wrapError{msg, err, frame} + } + return &noWrapError{msg, err, frame} + } + // Support %w anywhere. + // TODO: don't repeat the wrapped error's message when %w occurs in the middle. + msg := fmt.Sprintf(format2, a...) + if idx < 0 { + return &noWrapError{msg, nil, Caller(1)} + } + err := errorAt(a, idx) + if !ok || err == nil { + // Too many %ws or argument of %w is not an error. Approximate the Go + // 1.13 fmt.Errorf message. + return &noWrapError{fmt.Sprintf("%sw(%s)", percentBangString, msg), nil, Caller(1)} + } + frame := Frame{} + if internal.EnableTrace { + frame = Caller(1) + } + return &wrapError{msg, err, frame} +} + +func errorAt(args []interface{}, i int) error { + if i < 0 || i >= len(args) { + return nil + } + err, ok := args[i].(error) + if !ok { + return nil + } + return err +} + +// formatPlusW is used to avoid the vet check that will barf at %w. +func formatPlusW(s string) string { + return s +} + +// Return the index of the only %w in format, or -1 if none. +// Also return a rewritten format string with %w replaced by %v, and +// false if there is more than one %w. +// TODO: handle "%[N]w". +func parsePercentW(format string) (idx int, newFormat string, ok bool) { + // Loosely copied from golang.org/x/tools/go/analysis/passes/printf/printf.go. + idx = -1 + ok = true + n := 0 + sz := 0 + var isW bool + for i := 0; i < len(format); i += sz { + if format[i] != '%' { + sz = 1 + continue + } + // "%%" is not a format directive. + if i+1 < len(format) && format[i+1] == '%' { + sz = 2 + continue + } + sz, isW = parsePrintfVerb(format[i:]) + if isW { + if idx >= 0 { + ok = false + } else { + idx = n + } + // "Replace" the last character, the 'w', with a 'v'. + p := i + sz - 1 + format = format[:p] + "v" + format[p+1:] + } + n++ + } + return idx, format, ok +} + +// Parse the printf verb starting with a % at s[0]. +// Return how many bytes it occupies and whether the verb is 'w'. +func parsePrintfVerb(s string) (int, bool) { + // Assume only that the directive is a sequence of non-letters followed by a single letter. + sz := 0 + var r rune + for i := 1; i < len(s); i += sz { + r, sz = utf8.DecodeRuneInString(s[i:]) + if unicode.IsLetter(r) { + return i + sz, r == 'w' + } + } + return len(s), false +} + +type noWrapError struct { + msg string + err error + frame Frame +} + +func (e *noWrapError) Error() string { + return fmt.Sprint(e) +} + +func (e *noWrapError) Format(s fmt.State, v rune) { FormatError(e, s, v) } + +func (e *noWrapError) FormatError(p Printer) (next error) { + p.Print(e.msg) + e.frame.Format(p) + return e.err +} + +type wrapError struct { + msg string + err error + frame Frame +} + +func (e *wrapError) Error() string { + return fmt.Sprint(e) +} + +func (e *wrapError) Format(s fmt.State, v rune) { FormatError(e, s, v) } + +func (e *wrapError) FormatError(p Printer) (next error) { + p.Print(e.msg) + e.frame.Format(p) + return e.err +} + +func (e *wrapError) Unwrap() error { + return e.err +} diff --git a/vendor/golang.org/x/xerrors/format.go b/vendor/golang.org/x/xerrors/format.go new file mode 100644 index 0000000000..1bc9c26b97 --- /dev/null +++ b/vendor/golang.org/x/xerrors/format.go @@ -0,0 +1,34 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package xerrors + +// A Formatter formats error messages. +type Formatter interface { + error + + // FormatError prints the receiver's first error and returns the next error in + // the error chain, if any. + FormatError(p Printer) (next error) +} + +// A Printer formats error messages. +// +// The most common implementation of Printer is the one provided by package fmt +// during Printf (as of Go 1.13). Localization packages such as golang.org/x/text/message +// typically provide their own implementations. +type Printer interface { + // Print appends args to the message output. + Print(args ...interface{}) + + // Printf writes a formatted string. + Printf(format string, args ...interface{}) + + // Detail reports whether error detail is requested. + // After the first call to Detail, all text written to the Printer + // is formatted as additional detail, or ignored when + // detail has not been requested. + // If Detail returns false, the caller can avoid printing the detail at all. + Detail() bool +} diff --git a/vendor/golang.org/x/xerrors/frame.go b/vendor/golang.org/x/xerrors/frame.go new file mode 100644 index 0000000000..0de628ec50 --- /dev/null +++ b/vendor/golang.org/x/xerrors/frame.go @@ -0,0 +1,56 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package xerrors + +import ( + "runtime" +) + +// A Frame contains part of a call stack. +type Frame struct { + // Make room for three PCs: the one we were asked for, what it called, + // and possibly a PC for skipPleaseUseCallersFrames. See: + // https://go.googlesource.com/go/+/032678e0fb/src/runtime/extern.go#169 + frames [3]uintptr +} + +// Caller returns a Frame that describes a frame on the caller's stack. +// The argument skip is the number of frames to skip over. +// Caller(0) returns the frame for the caller of Caller. +func Caller(skip int) Frame { + var s Frame + runtime.Callers(skip+1, s.frames[:]) + return s +} + +// location reports the file, line, and function of a frame. +// +// The returned function may be "" even if file and line are not. +func (f Frame) location() (function, file string, line int) { + frames := runtime.CallersFrames(f.frames[:]) + if _, ok := frames.Next(); !ok { + return "", "", 0 + } + fr, ok := frames.Next() + if !ok { + return "", "", 0 + } + return fr.Function, fr.File, fr.Line +} + +// Format prints the stack as error detail. +// It should be called from an error's Format implementation +// after printing any other error detail. +func (f Frame) Format(p Printer) { + if p.Detail() { + function, file, line := f.location() + if function != "" { + p.Printf("%s\n ", function) + } + if file != "" { + p.Printf("%s:%d\n", file, line) + } + } +} diff --git a/vendor/golang.org/x/xerrors/go.mod b/vendor/golang.org/x/xerrors/go.mod new file mode 100644 index 0000000000..870d4f612d --- /dev/null +++ b/vendor/golang.org/x/xerrors/go.mod @@ -0,0 +1,3 @@ +module golang.org/x/xerrors + +go 1.11 diff --git a/vendor/golang.org/x/xerrors/internal/internal.go b/vendor/golang.org/x/xerrors/internal/internal.go new file mode 100644 index 0000000000..89f4eca5df --- /dev/null +++ b/vendor/golang.org/x/xerrors/internal/internal.go @@ -0,0 +1,8 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package internal + +// EnableTrace indicates whether stack information should be recorded in errors. +var EnableTrace = true diff --git a/vendor/golang.org/x/xerrors/wrap.go b/vendor/golang.org/x/xerrors/wrap.go new file mode 100644 index 0000000000..9a3b510374 --- /dev/null +++ b/vendor/golang.org/x/xerrors/wrap.go @@ -0,0 +1,106 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package xerrors + +import ( + "reflect" +) + +// A Wrapper provides context around another error. +type Wrapper interface { + // Unwrap returns the next error in the error chain. + // If there is no next error, Unwrap returns nil. + Unwrap() error +} + +// Opaque returns an error with the same error formatting as err +// but that does not match err and cannot be unwrapped. +func Opaque(err error) error { + return noWrapper{err} +} + +type noWrapper struct { + error +} + +func (e noWrapper) FormatError(p Printer) (next error) { + if f, ok := e.error.(Formatter); ok { + return f.FormatError(p) + } + p.Print(e.error) + return nil +} + +// Unwrap returns the result of calling the Unwrap method on err, if err implements +// Unwrap. Otherwise, Unwrap returns nil. +func Unwrap(err error) error { + u, ok := err.(Wrapper) + if !ok { + return nil + } + return u.Unwrap() +} + +// Is reports whether any error in err's chain matches target. +// +// An error is considered to match a target if it is equal to that target or if +// it implements a method Is(error) bool such that Is(target) returns true. +func Is(err, target error) bool { + if target == nil { + return err == target + } + + isComparable := reflect.TypeOf(target).Comparable() + for { + if isComparable && err == target { + return true + } + if x, ok := err.(interface{ Is(error) bool }); ok && x.Is(target) { + return true + } + // TODO: consider supporing target.Is(err). This would allow + // user-definable predicates, but also may allow for coping with sloppy + // APIs, thereby making it easier to get away with them. + if err = Unwrap(err); err == nil { + return false + } + } +} + +// As finds the first error in err's chain that matches the type to which target +// points, and if so, sets the target to its value and returns true. An error +// matches a type if it is assignable to the target type, or if it has a method +// As(interface{}) bool such that As(target) returns true. As will panic if target +// is not a non-nil pointer to a type which implements error or is of interface type. +// +// The As method should set the target to its value and return true if err +// matches the type to which target points. +func As(err error, target interface{}) bool { + if target == nil { + panic("errors: target cannot be nil") + } + val := reflect.ValueOf(target) + typ := val.Type() + if typ.Kind() != reflect.Ptr || val.IsNil() { + panic("errors: target must be a non-nil pointer") + } + if e := typ.Elem(); e.Kind() != reflect.Interface && !e.Implements(errorType) { + panic("errors: *target must be interface or implement error") + } + targetType := typ.Elem() + for err != nil { + if reflect.TypeOf(err).AssignableTo(targetType) { + val.Elem().Set(reflect.ValueOf(err)) + return true + } + if x, ok := err.(interface{ As(interface{}) bool }); ok && x.As(target) { + return true + } + err = Unwrap(err) + } + return false +} + +var errorType = reflect.TypeOf((*error)(nil)).Elem() diff --git a/vendor/modules.txt b/vendor/modules.txt index 1af147354e..c23bc172ac 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -360,7 +360,7 @@ github.com/opentracing-contrib/go-stdlib/nethttp github.com/opentracing/opentracing-go github.com/opentracing/opentracing-go/ext github.com/opentracing/opentracing-go/log -# github.com/pkg/errors v0.8.1 +# github.com/pkg/errors v0.9.1 github.com/pkg/errors # github.com/pmezard/go-difflib v1.0.0 github.com/pmezard/go-difflib/difflib @@ -515,7 +515,7 @@ github.com/stretchr/objx github.com/stretchr/testify/assert github.com/stretchr/testify/mock github.com/stretchr/testify/require -# github.com/thanos-io/thanos v0.11.0 +# github.com/thanos-io/thanos v0.8.1-0.20200326105947-214ff4480e93 github.com/thanos-io/thanos/pkg/block github.com/thanos-io/thanos/pkg/block/indexheader github.com/thanos-io/thanos/pkg/block/metadata @@ -540,6 +540,7 @@ github.com/thanos-io/thanos/pkg/shipper github.com/thanos-io/thanos/pkg/store github.com/thanos-io/thanos/pkg/store/cache github.com/thanos-io/thanos/pkg/store/storepb +github.com/thanos-io/thanos/pkg/store/storepb/prompb github.com/thanos-io/thanos/pkg/strutil github.com/thanos-io/thanos/pkg/testutil github.com/thanos-io/thanos/pkg/tracing @@ -711,7 +712,10 @@ golang.org/x/exp/cmd/apidiff # golang.org/x/lint v0.0.0-20190930215403-16217165b5de golang.org/x/lint golang.org/x/lint/golint -# golang.org/x/net v0.0.0-20191112182307-2180aed22343 +# golang.org/x/mod v0.2.0 +golang.org/x/mod/module +golang.org/x/mod/semver +# golang.org/x/net v0.0.0-20200226121028-0de0cce0169b golang.org/x/net/bpf golang.org/x/net/context golang.org/x/net/context/ctxhttp @@ -749,7 +753,7 @@ golang.org/x/text/unicode/norm golang.org/x/text/width # golang.org/x/time v0.0.0-20191024005414-555d28b269f0 golang.org/x/time/rate -# golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2 +# golang.org/x/tools v0.0.0-20200306191617-51e69f71924f golang.org/x/tools/cmd/goimports golang.org/x/tools/go/analysis golang.org/x/tools/go/analysis/passes/inspect @@ -763,11 +767,13 @@ golang.org/x/tools/go/packages golang.org/x/tools/go/types/objectpath golang.org/x/tools/go/types/typeutil golang.org/x/tools/internal/fastwalk +golang.org/x/tools/internal/gocommand golang.org/x/tools/internal/gopathwalk golang.org/x/tools/internal/imports -golang.org/x/tools/internal/module -golang.org/x/tools/internal/semver -golang.org/x/tools/internal/span +golang.org/x/tools/internal/packagesinternal +# golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 +golang.org/x/xerrors +golang.org/x/xerrors/internal # google.golang.org/api v0.14.0 google.golang.org/api/cloudresourcemanager/v1 google.golang.org/api/compute/v1 From a1cc47baf97b12af878b5fe0d588e261debd7d22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20S=CC=8Ctibrany=CC=81?= Date: Thu, 26 Mar 2020 17:12:59 +0100 Subject: [PATCH 02/12] Integrate Compactor and Store changes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Deletion delay, blocks cleaner - Postings compression Signed-off-by: Peter Štibraný --- pkg/compactor/compactor.go | 51 +++++++- pkg/compactor/compactor_test.go | 160 ++++++++++++++++++++++++- pkg/querier/block_store.go | 14 ++- pkg/storage/tsdb/bucket_client_mock.go | 22 ++-- pkg/storage/tsdb/config.go | 27 +++-- pkg/storage/tsdb/index_cache.go | 13 +- 6 files changed, 252 insertions(+), 35 deletions(-) diff --git a/pkg/compactor/compactor.go b/pkg/compactor/compactor.go index b506b1976f..48f0bed66d 100644 --- a/pkg/compactor/compactor.go +++ b/pkg/compactor/compactor.go @@ -34,6 +34,7 @@ type Config struct { DataDir string `yaml:"data_dir"` CompactionInterval time.Duration `yaml:"compaction_interval"` CompactionRetries int `yaml:"compaction_retries"` + DeletionDelay time.Duration `yaml:"deletion_delay"` // Compactors sharding. ShardingEnabled bool `yaml:"sharding_enabled"` @@ -62,6 +63,10 @@ func (cfg *Config) RegisterFlags(f *flag.FlagSet) { f.DurationVar(&cfg.CompactionInterval, "compactor.compaction-interval", time.Hour, "The frequency at which the compaction runs") f.IntVar(&cfg.CompactionRetries, "compactor.compaction-retries", 3, "How many times to retry a failed compaction during a single compaction interval") f.BoolVar(&cfg.ShardingEnabled, "compactor.sharding-enabled", false, "Shard tenants across multiple compactor instances. Sharding is required if you run multiple compactor instances, in order to coordinate compactions and avoid race conditions leading to the same tenant blocks simultaneously compacted by different instances.") + f.DurationVar(&cfg.DeletionDelay, "compactor.deletion-delay", 48*time.Hour, "Time before a block marked for deletion is deleted from bucket. "+ + "If not 0, blocks will be marked for deletion and compactor component will delete blocks marked for deletion from the bucket. "+ + "If delete-delay is 0, blocks will be deleted straight away. Note that deleting blocks immediately can cause query failures, "+ + "if store gateway still has the block loaded, or compactor is ignoring the deletion because it's compacting the block at the same time.") } // Compactor is a multi-tenant TSDB blocks compactor based on Thanos. @@ -95,6 +100,10 @@ type Compactor struct { compactionRunsCompleted prometheus.Counter compactionRunsFailed prometheus.Counter + blocksCleaned prometheus.Counter + blockCleanupFailures prometheus.Counter + blocksMarkedForDeletion prometheus.Counter + // TSDB syncer metrics syncerMetrics *syncerMetrics } @@ -149,11 +158,24 @@ func newCompactor( Name: "cortex_compactor_runs_failed_total", Help: "Total number of compaction runs failed.", }), + + blocksCleaned: prometheus.NewCounter(prometheus.CounterOpts{ + Name: "cortex_compactor_blocks_cleaned_total", + Help: "Total number of blocks deleted in compactor.", + }), + blockCleanupFailures: prometheus.NewCounter(prometheus.CounterOpts{ + Name: "cortex_compactor_block_cleanup_failures_total", + Help: "Failures encountered while deleting blocks in compactor.", + }), + blocksMarkedForDeletion: prometheus.NewCounter(prometheus.CounterOpts{ + Name: "cortex_compactor_blocks_marked_for_deletion_total", + Help: "Total number of blocks marked for deletion in compactor.", + }), } // Register metrics. if registerer != nil { - registerer.MustRegister(c.compactionRunsStarted, c.compactionRunsCompleted, c.compactionRunsFailed) + registerer.MustRegister(c.compactionRunsStarted, c.compactionRunsCompleted, c.compactionRunsFailed, c.blocksCleaned, c.blockCleanupFailures, c.blocksMarkedForDeletion) } c.Service = services.NewBasicService(c.starting, c.running, c.stopping) @@ -311,6 +333,10 @@ func (c *Compactor) compactUser(ctx context.Context, userID string) error { // blocks that fully submatches the source blocks of the older blocks. deduplicateBlocksFilter := block.NewDeduplicateFilter() + // While fetching blocks, we filter out blocks that were marked for deletion by using IgnoreDeletionMarkFilter. + // The delay of deleteDelay/2 is added to ensure we fetch blocks that are meant to be deleted but do not have a replacement yet. + ignoreDeletionMarkFilter := block.NewIgnoreDeletionMarkFilter(ulogger, bucket, time.Duration(c.compactorCfg.DeletionDelay.Seconds()/2)*time.Second) + fetcher, err := block.NewMetaFetcher( ulogger, c.compactorCfg.MetaSyncConcurrency, @@ -320,9 +346,12 @@ func (c *Compactor) compactUser(ctx context.Context, userID string) error { // the directory used by the Thanos Syncer, whatever is the user ID. path.Join(c.compactorCfg.DataDir, "meta-"+userID), reg, - // List of filters to apply (order matters). - block.NewConsistencyDelayMetaFilter(ulogger, c.compactorCfg.ConsistencyDelay, reg).Filter, - deduplicateBlocksFilter.Filter, + []block.MetadataFilter{ + // List of filters to apply (order matters). + block.NewConsistencyDelayMetaFilter(ulogger, c.compactorCfg.ConsistencyDelay, reg), + ignoreDeletionMarkFilter, + deduplicateBlocksFilter, + }, ) if err != nil { return err @@ -334,6 +363,8 @@ func (c *Compactor) compactUser(ctx context.Context, userID string) error { bucket, fetcher, deduplicateBlocksFilter, + ignoreDeletionMarkFilter, + c.blocksMarkedForDeletion, c.compactorCfg.BlockSyncConcurrency, false, // Do not accept malformed indexes true, // Enable vertical compaction @@ -357,7 +388,17 @@ func (c *Compactor) compactUser(ctx context.Context, userID string) error { return errors.Wrap(err, "failed to create bucket compactor") } - return compactor.Compact(ctx) + if err := compactor.Compact(ctx); err != nil { + return errors.Wrap(err, "compaction") + } + + blocksCleaner := compact.NewBlocksCleaner(ulogger, bucket, ignoreDeletionMarkFilter, c.compactorCfg.DeletionDelay, c.blocksCleaned, c.blockCleanupFailures) + + if err := blocksCleaner.DeleteMarkedBlocks(ctx); err != nil { + return errors.Wrap(err, "error cleaning blocks") + } + + return nil } func (c *Compactor) discoverUsers(ctx context.Context) ([]string, error) { diff --git a/pkg/compactor/compactor_test.go b/pkg/compactor/compactor_test.go index 0b863c5acf..80926e529d 100644 --- a/pkg/compactor/compactor_test.go +++ b/pkg/compactor/compactor_test.go @@ -21,6 +21,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" + "github.com/thanos-io/thanos/pkg/block/metadata" "github.com/thanos-io/thanos/pkg/objstore" "gopkg.in/yaml.v2" @@ -165,6 +166,18 @@ func TestCompactor_ShouldDoNothingOnNoUserBlocks(t *testing.T) { # HELP cortex_compactor_group_vertical_compactions_total TSDB Syncer: Total number of group compaction attempts that resulted in a new block based on overlapping blocks. # TYPE cortex_compactor_group_vertical_compactions_total counter cortex_compactor_group_vertical_compactions_total 0 + + # HELP cortex_compactor_block_cleanup_failures_total Failures encountered while deleting blocks in compactor. + # TYPE cortex_compactor_block_cleanup_failures_total counter + cortex_compactor_block_cleanup_failures_total 0 + + # HELP cortex_compactor_blocks_cleaned_total Total number of blocks deleted in compactor. + # TYPE cortex_compactor_blocks_cleaned_total counter + cortex_compactor_blocks_cleaned_total 0 + + # HELP cortex_compactor_blocks_marked_for_deletion_total Total number of blocks marked for deletion in compactor. + # TYPE cortex_compactor_blocks_marked_for_deletion_total counter + cortex_compactor_blocks_marked_for_deletion_total 0 `))) } @@ -266,6 +279,18 @@ func TestCompactor_ShouldRetryOnFailureWhileDiscoveringUsersFromBucket(t *testin # HELP cortex_compactor_group_vertical_compactions_total TSDB Syncer: Total number of group compaction attempts that resulted in a new block based on overlapping blocks. # TYPE cortex_compactor_group_vertical_compactions_total counter cortex_compactor_group_vertical_compactions_total 0 + + # HELP cortex_compactor_block_cleanup_failures_total Failures encountered while deleting blocks in compactor. + # TYPE cortex_compactor_block_cleanup_failures_total counter + cortex_compactor_block_cleanup_failures_total 0 + + # HELP cortex_compactor_blocks_cleaned_total Total number of blocks deleted in compactor. + # TYPE cortex_compactor_blocks_cleaned_total counter + cortex_compactor_blocks_cleaned_total 0 + + # HELP cortex_compactor_blocks_marked_for_deletion_total Total number of blocks marked for deletion in compactor. + # TYPE cortex_compactor_blocks_marked_for_deletion_total counter + cortex_compactor_blocks_marked_for_deletion_total 0 `))) } @@ -278,7 +303,9 @@ func TestCompactor_ShouldIterateOverUsersAndRunCompaction(t *testing.T) { bucketClient.MockIter("user-1/", []string{"user-1/01DTVP434PA9VFXSW2JKB3392D"}, nil) bucketClient.MockIter("user-2/", []string{"user-2/01DTW0ZCPDDNV4BV83Q2SV4QAZ"}, nil) bucketClient.MockGet("user-1/01DTVP434PA9VFXSW2JKB3392D/meta.json", mockBlockMetaJSON("01DTVP434PA9VFXSW2JKB3392D"), nil) + bucketClient.MockGet("user-1/01DTVP434PA9VFXSW2JKB3392D/deletion-mark.json", "", nil) bucketClient.MockGet("user-2/01DTW0ZCPDDNV4BV83Q2SV4QAZ/meta.json", mockBlockMetaJSON("01DTW0ZCPDDNV4BV83Q2SV4QAZ"), nil) + bucketClient.MockGet("user-2/01DTW0ZCPDDNV4BV83Q2SV4QAZ/deletion-mark.json", "", nil) c, tsdbCompactor, logs, registry, cleanup := prepare(t, prepareConfig(), bucketClient) defer cleanup() @@ -308,18 +335,115 @@ func TestCompactor_ShouldIterateOverUsersAndRunCompaction(t *testing.T) { `level=info org_id=user-1 msg="start of GC"`, `level=info org_id=user-1 msg="start of compaction"`, `level=info org_id=user-1 msg="compaction iterations done"`, + `level=info org_id=user-1 msg="started cleaning of blocks marked for deletion"`, + `level=info org_id=user-1 msg="cleaning of blocks marked for deletion done"`, `level=info msg="successfully compacted user blocks" user=user-1`, `level=info msg="starting compaction of user blocks" user=user-2`, `level=info org_id=user-2 msg="start sync of metas"`, `level=info org_id=user-2 msg="start of GC"`, `level=info org_id=user-2 msg="start of compaction"`, `level=info org_id=user-2 msg="compaction iterations done"`, + `level=info org_id=user-2 msg="started cleaning of blocks marked for deletion"`, + `level=info org_id=user-2 msg="cleaning of blocks marked for deletion done"`, `level=info msg="successfully compacted user blocks" user=user-2`, }, removeMetaFetcherLogs(strings.Split(strings.TrimSpace(logs.String()), "\n"))) // Instead of testing for shipper metrics, we only check our metrics here. // Real shipper metrics are too variable to embed into a test. - testedMetrics := []string{"cortex_compactor_runs_started_total", "cortex_compactor_runs_completed_total", "cortex_compactor_runs_failed_total"} + testedMetrics := []string{ + "cortex_compactor_runs_started_total", "cortex_compactor_runs_completed_total", "cortex_compactor_runs_failed_total", + "cortex_compactor_blocks_cleaned_total", "cortex_compactor_block_cleanup_failures_total", "cortex_compactor_blocks_marked_for_deletion_total", + } + assert.NoError(t, prom_testutil.GatherAndCompare(registry, strings.NewReader(` + # TYPE cortex_compactor_runs_started_total counter + # HELP cortex_compactor_runs_started_total Total number of compaction runs started. + cortex_compactor_runs_started_total 1 + + # TYPE cortex_compactor_runs_completed_total counter + # HELP cortex_compactor_runs_completed_total Total number of compaction runs successfully completed. + cortex_compactor_runs_completed_total 1 + + # TYPE cortex_compactor_runs_failed_total counter + # HELP cortex_compactor_runs_failed_total Total number of compaction runs failed. + cortex_compactor_runs_failed_total 0 + + # HELP cortex_compactor_block_cleanup_failures_total Failures encountered while deleting blocks in compactor. + # TYPE cortex_compactor_block_cleanup_failures_total counter + cortex_compactor_block_cleanup_failures_total 0 + + # HELP cortex_compactor_blocks_cleaned_total Total number of blocks deleted in compactor. + # TYPE cortex_compactor_blocks_cleaned_total counter + cortex_compactor_blocks_cleaned_total 0 + + # HELP cortex_compactor_blocks_marked_for_deletion_total Total number of blocks marked for deletion in compactor. + # TYPE cortex_compactor_blocks_marked_for_deletion_total counter + cortex_compactor_blocks_marked_for_deletion_total 0 + `), testedMetrics...)) +} + +func TestCompactor_ShouldNotCompactBlocksMarkedForDeletion(t *testing.T) { + t.Parallel() + + cfg := prepareConfig() + cfg.DeletionDelay = 10 * time.Minute // Delete block after 10 minutes + + // Mock the bucket to contain two users, each one with one block. + bucketClient := &cortex_tsdb.BucketClientMock{} + bucketClient.MockIter("", []string{"user-1"}, nil) + bucketClient.MockIter("user-1/", []string{"user-1/01DTVP434PA9VFXSW2JKB3392D", "user-1/01DTW0ZCPDDNV4BV83Q2SV4QAZ"}, nil) + + bucketClient.MockGet("user-1/01DTVP434PA9VFXSW2JKB3392D/meta.json", mockBlockMetaJSON("01DTVP434PA9VFXSW2JKB3392D"), nil) + bucketClient.MockGet("user-1/01DTVP434PA9VFXSW2JKB3392D/deletion-mark.json", mockDeletionMarkJson("01DTVP434PA9VFXSW2JKB3392D", time.Now()), nil) + + bucketClient.MockGet("user-1/01DTW0ZCPDDNV4BV83Q2SV4QAZ/meta.json", mockBlockMetaJSON("01DTW0ZCPDDNV4BV83Q2SV4QAZ"), nil) + bucketClient.MockGet("user-1/01DTW0ZCPDDNV4BV83Q2SV4QAZ/deletion-mark.json", mockDeletionMarkJson("01DTW0ZCPDDNV4BV83Q2SV4QAZ", time.Now().Add(-cfg.DeletionDelay)), nil) + bucketClient.MockIter("user-1/01DTW0ZCPDDNV4BV83Q2SV4QAZ", []string{"user-1/01DTW0ZCPDDNV4BV83Q2SV4QAZ/meta.json", "user-1/01DTW0ZCPDDNV4BV83Q2SV4QAZ/deletion-mark.json"}, nil) + bucketClient.MockDelete("user-1/01DTW0ZCPDDNV4BV83Q2SV4QAZ/meta.json", nil) + bucketClient.MockDelete("user-1/01DTW0ZCPDDNV4BV83Q2SV4QAZ/deletion-mark.json", nil) + bucketClient.MockDelete("user-1/01DTW0ZCPDDNV4BV83Q2SV4QAZ", nil) + + c, tsdbCompactor, logs, registry, cleanup := prepare(t, cfg, bucketClient) + defer cleanup() + require.NoError(t, services.StartAndAwaitRunning(context.Background(), c)) + + // Mock the compactor as if there's no compaction to do, + // in order to simplify tests (all in all, we just want to + // test our logic and not TSDB compactor which we expect to + // be already tested). + tsdbCompactor.On("Plan", mock.Anything).Return([]string{}, nil) + + // Wait until a run has completed. + cortex_testutil.Poll(t, time.Second, 1.0, func() interface{} { + return prom_testutil.ToFloat64(c.compactionRunsCompleted) + }) + + require.NoError(t, services.StopAndAwaitTerminated(context.Background(), c)) + + // Only one user's block is compacted. + tsdbCompactor.AssertNumberOfCalls(t, "Plan", 1) + + assert.Equal(t, []string{ + `level=info msg="discovering users from bucket"`, + `level=info msg="discovered users from bucket" users=1`, + `level=info msg="starting compaction of user blocks" user=user-1`, + `level=info org_id=user-1 msg="start sync of metas"`, + `level=info org_id=user-1 msg="start of GC"`, + `level=info org_id=user-1 msg="start of compaction"`, + `level=info org_id=user-1 msg="compaction iterations done"`, + `level=info org_id=user-1 msg="started cleaning of blocks marked for deletion"`, + `level=debug org_id=user-1 msg="deleted file" file=01DTW0ZCPDDNV4BV83Q2SV4QAZ/meta.json bucket=mock`, + `level=debug org_id=user-1 msg="deleted file" file=01DTW0ZCPDDNV4BV83Q2SV4QAZ/deletion-mark.json bucket=mock`, + `level=info org_id=user-1 msg="deleted block marked for deletion" block=01DTW0ZCPDDNV4BV83Q2SV4QAZ`, + `level=info org_id=user-1 msg="cleaning of blocks marked for deletion done"`, + `level=info msg="successfully compacted user blocks" user=user-1`, + }, removeMetaFetcherLogs(strings.Split(strings.TrimSpace(logs.String()), "\n"))) + + // Instead of testing for shipper metrics, we only check our metrics here. + // Real shipper metrics are too variable to embed into a test. + testedMetrics := []string{ + "cortex_compactor_runs_started_total", "cortex_compactor_runs_completed_total", "cortex_compactor_runs_failed_total", + "cortex_compactor_blocks_cleaned_total", "cortex_compactor_block_cleanup_failures_total", "cortex_compactor_blocks_marked_for_deletion_total", + } assert.NoError(t, prom_testutil.GatherAndCompare(registry, strings.NewReader(` # TYPE cortex_compactor_runs_started_total counter # HELP cortex_compactor_runs_started_total Total number of compaction runs started. @@ -332,6 +456,18 @@ func TestCompactor_ShouldIterateOverUsersAndRunCompaction(t *testing.T) { # TYPE cortex_compactor_runs_failed_total counter # HELP cortex_compactor_runs_failed_total Total number of compaction runs failed. cortex_compactor_runs_failed_total 0 + + # HELP cortex_compactor_block_cleanup_failures_total Failures encountered while deleting blocks in compactor. + # TYPE cortex_compactor_block_cleanup_failures_total counter + cortex_compactor_block_cleanup_failures_total 0 + + # HELP cortex_compactor_blocks_cleaned_total Total number of blocks deleted in compactor. + # TYPE cortex_compactor_blocks_cleaned_total counter + cortex_compactor_blocks_cleaned_total 1 + + # HELP cortex_compactor_blocks_marked_for_deletion_total Total number of blocks marked for deletion in compactor. + # TYPE cortex_compactor_blocks_marked_for_deletion_total counter + cortex_compactor_blocks_marked_for_deletion_total 0 `), testedMetrics...)) } @@ -344,7 +480,9 @@ func TestCompactor_ShouldCompactAllUsersOnShardingEnabledButOnlyOneInstanceRunni bucketClient.MockIter("user-1/", []string{"user-1/01DTVP434PA9VFXSW2JKB3392D"}, nil) bucketClient.MockIter("user-2/", []string{"user-2/01DTW0ZCPDDNV4BV83Q2SV4QAZ"}, nil) bucketClient.MockGet("user-1/01DTVP434PA9VFXSW2JKB3392D/meta.json", mockBlockMetaJSON("01DTVP434PA9VFXSW2JKB3392D"), nil) + bucketClient.MockGet("user-1/01DTVP434PA9VFXSW2JKB3392D/deletion-mark.json", "", nil) bucketClient.MockGet("user-2/01DTW0ZCPDDNV4BV83Q2SV4QAZ/meta.json", mockBlockMetaJSON("01DTW0ZCPDDNV4BV83Q2SV4QAZ"), nil) + bucketClient.MockGet("user-2/01DTW0ZCPDDNV4BV83Q2SV4QAZ/deletion-mark.json", "", nil) cfg := prepareConfig() cfg.ShardingEnabled = true @@ -382,12 +520,16 @@ func TestCompactor_ShouldCompactAllUsersOnShardingEnabledButOnlyOneInstanceRunni `level=info org_id=user-1 msg="start of GC"`, `level=info org_id=user-1 msg="start of compaction"`, `level=info org_id=user-1 msg="compaction iterations done"`, + `level=info org_id=user-1 msg="started cleaning of blocks marked for deletion"`, + `level=info org_id=user-1 msg="cleaning of blocks marked for deletion done"`, `level=info msg="successfully compacted user blocks" user=user-1`, `level=info msg="starting compaction of user blocks" user=user-2`, `level=info org_id=user-2 msg="start sync of metas"`, `level=info org_id=user-2 msg="start of GC"`, `level=info org_id=user-2 msg="start of compaction"`, `level=info org_id=user-2 msg="compaction iterations done"`, + `level=info org_id=user-2 msg="started cleaning of blocks marked for deletion"`, + `level=info org_id=user-2 msg="cleaning of blocks marked for deletion done"`, `level=info msg="successfully compacted user blocks" user=user-2`, }, removeMetaFetcherLogs(strings.Split(strings.TrimSpace(logs.String()), "\n"))) } @@ -409,6 +551,7 @@ func TestCompactor_ShouldCompactOnlyUsersOwnedByTheInstanceOnShardingEnabledAndM for _, userID := range userIDs { bucketClient.MockIter(userID+"/", []string{"user-1/01DTVP434PA9VFXSW2JKB3392D"}, nil) bucketClient.MockGet(userID+"/01DTVP434PA9VFXSW2JKB3392D/meta.json", mockBlockMetaJSON("01DTVP434PA9VFXSW2JKB3392D"), nil) + bucketClient.MockGet(userID+"/01DTVP434PA9VFXSW2JKB3392D/deletion-mark.json", "", nil) } // Create a shared KV Store @@ -593,3 +736,18 @@ func mockBlockMetaJSON(id string) string { return string(content) } + +func mockDeletionMarkJson(id string, deletionTime time.Time) string { + meta := metadata.DeletionMark{ + Version: metadata.DeletionMarkVersion1, + ID: ulid.MustParse(id), + DeletionTime: deletionTime.Unix(), + } + + content, err := json.Marshal(meta) + if err != nil { + panic("failed to marshal mocked block meta") + } + + return string(content) +} diff --git a/pkg/querier/block_store.go b/pkg/querier/block_store.go index 3443a38767..35b7ea4fd4 100644 --- a/pkg/querier/block_store.go +++ b/pkg/querier/block_store.go @@ -266,11 +266,14 @@ func (u *UserStore) getOrCreateStore(userID string) (*store.BucketStore, error) userBkt, filepath.Join(u.cfg.BucketStore.SyncDir, userID), // The fetcher stores cached metas in the "meta-syncer/" sub directory reg, - // List of filters to apply (order matters). - block.NewConsistencyDelayMetaFilter(userLogger, u.cfg.BucketStore.ConsistencyDelay, reg).Filter, - // Filters out duplicate blocks that can be formed from two or more overlapping - // blocks that fully submatches the source blocks of the older blocks. - block.NewDeduplicateFilter().Filter, + []block.MetadataFilter{ + // List of filters to apply (order matters). + block.NewConsistencyDelayMetaFilter(userLogger, u.cfg.BucketStore.ConsistencyDelay, reg), + block.NewIgnoreDeletionMarkFilter(userLogger, userBkt, u.cfg.BucketStore.IgnoreDeletionMarksDelay), + // Filters out duplicate blocks that can be formed from two or more overlapping + // blocks that fully submatches the source blocks of the older blocks. + block.NewDeduplicateFilter(), + }, ) if err != nil { return nil, err @@ -291,6 +294,7 @@ func (u *UserStore) getOrCreateStore(userID string) (*store.BucketStore, error) nil, // Do not limit timerange. false, // No need to enable backward compatibility with Thanos pre 0.8.0 queriers u.cfg.BucketStore.BinaryIndexHeader, + u.cfg.BucketStore.IndexCache.PostingsCompression, ) if err != nil { return nil, err diff --git a/pkg/storage/tsdb/bucket_client_mock.go b/pkg/storage/tsdb/bucket_client_mock.go index cd9033cff0..ed25ca2828 100644 --- a/pkg/storage/tsdb/bucket_client_mock.go +++ b/pkg/storage/tsdb/bucket_client_mock.go @@ -10,6 +10,8 @@ import ( "github.com/stretchr/testify/mock" ) +var errObjectDoesNotExist = errors.New("object does not exist") + // BucketClientMock mocks objstore.Bucket type BucketClientMock struct { mock.Mock @@ -54,7 +56,12 @@ func (m *BucketClientMock) MockIter(prefix string, objects []string, err error) // Get mocks objstore.Bucket.Get() func (m *BucketClientMock) Get(ctx context.Context, name string) (io.ReadCloser, error) { args := m.Called(ctx, name) - return args.Get(0).(io.ReadCloser), args.Error(1) + val, err := args.Get(0), args.Error(1) + if val == nil { + return nil, err + } else { + return val.(io.ReadCloser), err + } } // MockGet is a convenient method to mock Get() and Exists() @@ -64,10 +71,14 @@ func (m *BucketClientMock) MockGet(name, content string, err error) { m.On("Get", mock.Anything, name).Return(ioutil.NopCloser(bytes.NewReader([]byte(content))), err) } else { m.On("Exists", mock.Anything, name).Return(false, err) - m.On("Get", mock.Anything, name).Return(nil, errors.New("object does not exist")) + m.On("Get", mock.Anything, name).Return(nil, errObjectDoesNotExist) } } +func (m *BucketClientMock) MockDelete(name string, err error) { + m.On("Delete", mock.Anything, name).Return(err) +} + // GetRange mocks objstore.Bucket.GetRange() func (m *BucketClientMock) GetRange(ctx context.Context, name string, off, length int64) (io.ReadCloser, error) { args := m.Called(ctx, name, off, length) @@ -82,12 +93,7 @@ func (m *BucketClientMock) Exists(ctx context.Context, name string) (bool, error // IsObjNotFoundErr mocks objstore.Bucket.IsObjNotFoundErr() func (m *BucketClientMock) IsObjNotFoundErr(err error) bool { - if err == nil { - return false - } - - args := m.Called(err) - return args.Bool(0) + return err == errObjectDoesNotExist } // ObjectSize mocks objstore.Bucket.ObjectSize() diff --git a/pkg/storage/tsdb/config.go b/pkg/storage/tsdb/config.go index cb2671a3c5..b5410ed65c 100644 --- a/pkg/storage/tsdb/config.go +++ b/pkg/storage/tsdb/config.go @@ -156,17 +156,19 @@ func (cfg *Config) Validate() error { // BucketStoreConfig holds the config information for Bucket Stores used by the querier type BucketStoreConfig struct { - SyncDir string `yaml:"sync_dir"` - SyncInterval time.Duration `yaml:"sync_interval"` - MaxChunkPoolBytes uint64 `yaml:"max_chunk_pool_bytes"` - MaxSampleCount uint64 `yaml:"max_sample_count"` - MaxConcurrent int `yaml:"max_concurrent"` - TenantSyncConcurrency int `yaml:"tenant_sync_concurrency"` - BlockSyncConcurrency int `yaml:"block_sync_concurrency"` - MetaSyncConcurrency int `yaml:"meta_sync_concurrency"` - BinaryIndexHeader bool `yaml:"binary_index_header_enabled"` - ConsistencyDelay time.Duration `yaml:"consistency_delay"` - IndexCache IndexCacheConfig `yaml:"index_cache"` + SyncDir string `yaml:"sync_dir"` + SyncInterval time.Duration `yaml:"sync_interval"` + MaxChunkPoolBytes uint64 `yaml:"max_chunk_pool_bytes"` + MaxSampleCount uint64 `yaml:"max_sample_count"` + MaxConcurrent int `yaml:"max_concurrent"` + TenantSyncConcurrency int `yaml:"tenant_sync_concurrency"` + BlockSyncConcurrency int `yaml:"block_sync_concurrency"` + MetaSyncConcurrency int `yaml:"meta_sync_concurrency"` + BinaryIndexHeader bool `yaml:"binary_index_header_enabled"` + PostingsCompressions bool `yaml:"postings_compression_enabled"` + ConsistencyDelay time.Duration `yaml:"consistency_delay"` + IndexCache IndexCacheConfig `yaml:"index_cache"` + IgnoreDeletionMarksDelay time.Duration `yaml:"ignore_deletion_mark_delay"` } // RegisterFlags registers the BucketStore flags @@ -183,6 +185,9 @@ func (cfg *BucketStoreConfig) RegisterFlags(f *flag.FlagSet) { f.IntVar(&cfg.MetaSyncConcurrency, "experimental.tsdb.bucket-store.meta-sync-concurrency", 20, "Number of Go routines to use when syncing block meta files from object storage per tenant.") f.BoolVar(&cfg.BinaryIndexHeader, "experimental.tsdb.bucket-store.binary-index-header-enabled", true, "Whether the bucket store should use the binary index header. If false, it uses the JSON index header.") f.DurationVar(&cfg.ConsistencyDelay, "experimental.tsdb.bucket-store.consistency-delay", 0, "Minimum age of a block before it's being read. Set it to safe value (e.g 30m) if your object storage is eventually consistent. GCS and S3 are (roughly) strongly consistent.") + f.DurationVar(&cfg.IgnoreDeletionMarksDelay, "experimental.tsdb.bucket-store.ignore-deletion-marks-delay", time.Hour*24, "Duration after which the blocks marked for deletion will be filtered out while fetching blocks. "+ + "The idea of ignore-deletion-marks-delay is to ignore blocks that are marked for deletion with some delay. This ensures store can still serve blocks that are meant to be deleted but do not have a replacement yet."+ + "Default is 24h, half of the default value for -compactor.deletion-delay.") } // Validate the config. diff --git a/pkg/storage/tsdb/index_cache.go b/pkg/storage/tsdb/index_cache.go index 950cddb81f..f57b13eeed 100644 --- a/pkg/storage/tsdb/index_cache.go +++ b/pkg/storage/tsdb/index_cache.go @@ -11,6 +11,7 @@ import ( "github.com/pkg/errors" "github.com/prometheus/client_golang/prometheus" "github.com/thanos-io/thanos/pkg/cacheutil" + "github.com/thanos-io/thanos/pkg/model" storecache "github.com/thanos-io/thanos/pkg/store/cache" "github.com/cortexproject/cortex/pkg/util" @@ -26,7 +27,7 @@ const ( // IndexCacheBackendDefault is the value for the default index cache backend. IndexCacheBackendDefault = IndexCacheBackendInMemory - defaultMaxItemSize = storecache.Bytes(128 * units.MiB) + defaultMaxItemSize = model.Bytes(128 * units.MiB) ) var ( @@ -37,9 +38,10 @@ var ( ) type IndexCacheConfig struct { - Backend string `yaml:"backend"` - InMemory InMemoryIndexCacheConfig `yaml:"inmemory"` - Memcached MemcachedIndexCacheConfig `yaml:"memcached"` + Backend string `yaml:"backend"` + InMemory InMemoryIndexCacheConfig `yaml:"inmemory"` + Memcached MemcachedIndexCacheConfig `yaml:"memcached"` + PostingsCompression bool `yaml:"postings_compression_enabled"` } func (cfg *IndexCacheConfig) RegisterFlags(f *flag.FlagSet) { @@ -48,6 +50,7 @@ func (cfg *IndexCacheConfig) RegisterFlags(f *flag.FlagSet) { func (cfg *IndexCacheConfig) RegisterFlagsWithPrefix(f *flag.FlagSet, prefix string) { f.StringVar(&cfg.Backend, prefix+"backend", IndexCacheBackendDefault, fmt.Sprintf("The index cache backend type. Supported values: %s.", strings.Join(supportedIndexCacheBackends, ", "))) + f.BoolVar(&cfg.PostingsCompression, "postings-compression-enabled", false, "Compress postings before storing them to postings cache.") cfg.InMemory.RegisterFlagsWithPrefix(f, prefix+"inmemory.") cfg.Memcached.RegisterFlagsWithPrefix(f, prefix+"memcached.") @@ -126,7 +129,7 @@ func NewIndexCache(cfg IndexCacheConfig, logger log.Logger, registerer prometheu } func newInMemoryIndexCache(cfg InMemoryIndexCacheConfig, logger log.Logger, registerer prometheus.Registerer) (storecache.IndexCache, error) { - maxCacheSize := storecache.Bytes(cfg.MaxSizeBytes) + maxCacheSize := model.Bytes(cfg.MaxSizeBytes) // Calculate the max item size. maxItemSize := defaultMaxItemSize From f5b3be1a803129611a0ce746c3639d1c4ef988fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20S=CC=8Ctibrany=CC=81?= Date: Fri, 27 Mar 2020 16:38:38 +0100 Subject: [PATCH 03/12] Expose max item size for memcached client. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Peter Štibraný --- pkg/storage/tsdb/index_cache.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pkg/storage/tsdb/index_cache.go b/pkg/storage/tsdb/index_cache.go index f57b13eeed..5559c663fb 100644 --- a/pkg/storage/tsdb/index_cache.go +++ b/pkg/storage/tsdb/index_cache.go @@ -87,6 +87,7 @@ type MemcachedIndexCacheConfig struct { MaxAsyncBufferSize int `yaml:"max_async_buffer_size"` MaxGetMultiConcurrency int `yaml:"max_get_multi_concurrency"` MaxGetMultiBatchSize int `yaml:"max_get_multi_batch_size"` + MaxItemSize int `yaml:"max_item_size"` } func (cfg *MemcachedIndexCacheConfig) RegisterFlagsWithPrefix(f *flag.FlagSet, prefix string) { @@ -97,6 +98,7 @@ func (cfg *MemcachedIndexCacheConfig) RegisterFlagsWithPrefix(f *flag.FlagSet, p f.IntVar(&cfg.MaxAsyncBufferSize, prefix+"max-async-buffer-size", 10000, "The maximum number of enqueued asynchronous operations allowed.") f.IntVar(&cfg.MaxGetMultiConcurrency, prefix+"max-get-multi-concurrency", 100, "The maximum number of concurrent connections running get operations. If set to 0, concurrency is unlimited.") f.IntVar(&cfg.MaxGetMultiBatchSize, prefix+"max-get-multi-batch-size", 0, "The maximum number of keys a single underlying get operation should run. If more keys are specified, internally keys are splitted into multiple batches and fetched concurrently, honoring the max concurrency. If set to 0, the max batch size is unlimited.") + f.IntVar(&cfg.MaxItemSize, prefix+"max-item-size", 1000000, "The maximum size of an item stored in memcached. Bigger items are not stored. If set to 0, no maximum size is enforced.") } func (cfg *MemcachedIndexCacheConfig) GetAddresses() []string { @@ -152,6 +154,7 @@ func newMemcachedIndexCache(cfg MemcachedIndexCacheConfig, logger log.Logger, re MaxAsyncBufferSize: cfg.MaxAsyncBufferSize, MaxGetMultiConcurrency: cfg.MaxGetMultiConcurrency, MaxGetMultiBatchSize: cfg.MaxGetMultiBatchSize, + MaxItemSize: model.Bytes(cfg.MaxItemSize), DNSProviderUpdateInterval: 30 * time.Second, } From e1eebffadd4fd55c5daa8ba6bd7bff9e33a71396 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20S=CC=8Ctibrany=CC=81?= Date: Fri, 27 Mar 2020 17:32:54 +0100 Subject: [PATCH 04/12] Added new metrics related to postings compression to block_store_metrics MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Peter Štibraný --- pkg/querier/block_store_metrics.go | 39 ++++++ pkg/querier/bucket_store_metrics_test.go | 163 ++++++++++++++--------- 2 files changed, 142 insertions(+), 60 deletions(-) diff --git a/pkg/querier/block_store_metrics.go b/pkg/querier/block_store_metrics.go index d47bb2ef03..d942a8fc30 100644 --- a/pkg/querier/block_store_metrics.go +++ b/pkg/querier/block_store_metrics.go @@ -35,6 +35,12 @@ type tsdbBucketStoreMetrics struct { metaSyncDuration *prometheus.Desc metaSyncConsistencyDelay *prometheus.Desc + cachedPostingsCompressions *prometheus.Desc + cachedPostingsCompressionErrors *prometheus.Desc + cachedPostingsCompressionTimeSeconds *prometheus.Desc + cachedPostingsOriginalSizeBytes *prometheus.Desc + cachedPostingsCompressedSizeBytes *prometheus.Desc + // Ignored: // blocks_meta_synced } @@ -116,6 +122,27 @@ func newTSDBBucketStoreMetrics() *tsdbBucketStoreMetrics { "cortex_querier_bucket_store_blocks_meta_sync_consistency_delay_seconds", "TSDB: Configured consistency delay in seconds.", nil, nil), + + cachedPostingsCompressions: prometheus.NewDesc( + "cortex_querier_bucket_store_cached_postings_compressions_total", + "Number of postings compressions and decompressions when storing to index cache.", + []string{"op"}, nil), + cachedPostingsCompressionErrors: prometheus.NewDesc( + "cortex_querier_bucket_store_cached_postings_compression_errors_total", + "Number of postings compression and decompression errors.", + []string{"op"}, nil), + cachedPostingsCompressionTimeSeconds: prometheus.NewDesc( + "cortex_querier_bucket_store_cached_postings_compression_time_seconds", + "Time spent compressing and decompressing postings when storing to / reading from postings cache.", + []string{"op"}, nil), + cachedPostingsOriginalSizeBytes: prometheus.NewDesc( + "cortex_querier_bucket_store_cached_postings_original_size_bytes_total", + "Original size of postings stored into cache.", + nil, nil), + cachedPostingsCompressedSizeBytes: prometheus.NewDesc( + "cortex_querier_bucket_store_cached_postings_compressed_size_bytes_total", + "Compressed size of postings stored into cache.", + nil, nil), } } @@ -157,6 +184,12 @@ func (m *tsdbBucketStoreMetrics) Describe(out chan<- *prometheus.Desc) { out <- m.metaSyncFailures out <- m.metaSyncDuration out <- m.metaSyncConsistencyDelay + + out <- m.cachedPostingsCompressions + out <- m.cachedPostingsCompressionErrors + out <- m.cachedPostingsCompressionTimeSeconds + out <- m.cachedPostingsOriginalSizeBytes + out <- m.cachedPostingsCompressedSizeBytes } func (m *tsdbBucketStoreMetrics) Collect(out chan<- prometheus.Metric) { @@ -184,4 +217,10 @@ func (m *tsdbBucketStoreMetrics) Collect(out chan<- prometheus.Metric) { data.SendSumOfCounters(out, m.metaSyncFailures, "blocks_meta_sync_failures_total") data.SendSumOfHistograms(out, m.metaSyncDuration, "blocks_meta_sync_duration_seconds") data.SendMaxOfGauges(out, m.metaSyncConsistencyDelay, "consistency_delay_seconds") + + data.SendSumOfCountersWithLabels(out, m.cachedPostingsCompressions, "thanos_bucket_store_cached_postings_compressions_total", "op") + data.SendSumOfCountersWithLabels(out, m.cachedPostingsCompressionErrors, "thanos_bucket_store_cached_postings_compression_errors_total", "op") + data.SendSumOfCountersWithLabels(out, m.cachedPostingsCompressionTimeSeconds, "thanos_bucket_store_cached_postings_compression_time_seconds", "op") + data.SendSumOfCountersWithLabels(out, m.cachedPostingsOriginalSizeBytes, "thanos_bucket_store_cached_postings_original_size_bytes_total") + data.SendSumOfCountersWithLabels(out, m.cachedPostingsCompressedSizeBytes, "thanos_bucket_store_cached_postings_compressed_size_bytes_total") } diff --git a/pkg/querier/bucket_store_metrics_test.go b/pkg/querier/bucket_store_metrics_test.go index 4e1718845f..2e0d057950 100644 --- a/pkg/querier/bucket_store_metrics_test.go +++ b/pkg/querier/bucket_store_metrics_test.go @@ -6,6 +6,7 @@ import ( "testing" "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promauto" "github.com/prometheus/client_golang/prometheus/testutil" "github.com/stretchr/testify/require" ) @@ -149,6 +150,29 @@ func TestTSDBBucketStoreMetrics(t *testing.T) { # HELP cortex_querier_bucket_store_blocks_meta_sync_consistency_delay_seconds TSDB: Configured consistency delay in seconds. # TYPE cortex_querier_bucket_store_blocks_meta_sync_consistency_delay_seconds gauge cortex_querier_bucket_store_blocks_meta_sync_consistency_delay_seconds 300 + + # HELP cortex_querier_bucket_store_cached_postings_compressions_total Number of postings compressions and decompressions when storing to index cache. + # TYPE cortex_querier_bucket_store_cached_postings_compressions_total counter + cortex_querier_bucket_store_cached_postings_compressions_total{op="encode"} 1125950 + cortex_querier_bucket_store_cached_postings_compressions_total{op="decode"} 1148469 + + # HELP cortex_querier_bucket_store_cached_postings_compression_errors_total Number of postings compression and decompression errors. + # TYPE cortex_querier_bucket_store_cached_postings_compression_errors_total counter + cortex_querier_bucket_store_cached_postings_compression_errors_total{op="encode"} 1170988 + cortex_querier_bucket_store_cached_postings_compression_errors_total{op="decode"} 1193507 + + # HELP cortex_querier_bucket_store_cached_postings_compression_time_seconds Time spent compressing and decompressing postings when storing to / reading from postings cache. + # TYPE cortex_querier_bucket_store_cached_postings_compression_time_seconds counter + cortex_querier_bucket_store_cached_postings_compression_time_seconds{op="encode"} 1216026 + cortex_querier_bucket_store_cached_postings_compression_time_seconds{op="decode"} 1238545 + + # HELP cortex_querier_bucket_store_cached_postings_original_size_bytes_total Original size of postings stored into cache. + # TYPE cortex_querier_bucket_store_cached_postings_original_size_bytes_total counter + cortex_querier_bucket_store_cached_postings_original_size_bytes_total 1261064 + + # HELP cortex_querier_bucket_store_cached_postings_compressed_size_bytes_total Compressed size of postings stored into cache. + # TYPE cortex_querier_bucket_store_cached_postings_compressed_size_bytes_total counter + cortex_querier_bucket_store_cached_postings_compressed_size_bytes_total 1283583 `)) require.NoError(t, err) } @@ -236,97 +260,113 @@ func populateTSDBBucketStoreMetrics(base float64) *prometheus.Registry { m.metaSyncConsistencyDelay.Set(300) + m.cachedPostingsCompressions.WithLabelValues("encode").Add(50 * base) + m.cachedPostingsCompressions.WithLabelValues("decode").Add(51 * base) + + m.cachedPostingsCompressionErrors.WithLabelValues("encode").Add(52 * base) + m.cachedPostingsCompressionErrors.WithLabelValues("decode").Add(53 * base) + + m.cachedPostingsCompressionTimeSeconds.WithLabelValues("encode").Add(54 * base) + m.cachedPostingsCompressionTimeSeconds.WithLabelValues("decode").Add(55 * base) + + m.cachedPostingsOriginalSizeBytes.Add(56 * base) + m.cachedPostingsCompressedSizeBytes.Add(57 * base) + return reg } // copied from Thanos, pkg/store/bucket.go type bucketStoreMetrics struct { - blocksLoaded prometheus.Gauge - blockLoads prometheus.Counter - blockLoadFailures prometheus.Counter - blockDrops prometheus.Counter - blockDropFailures prometheus.Counter - seriesDataTouched *prometheus.SummaryVec - seriesDataFetched *prometheus.SummaryVec - seriesDataSizeTouched *prometheus.SummaryVec - seriesDataSizeFetched *prometheus.SummaryVec - seriesBlocksQueried prometheus.Summary - seriesGetAllDuration prometheus.Histogram - seriesMergeDuration prometheus.Histogram - seriesRefetches prometheus.Counter - resultSeriesCount prometheus.Summary - chunkSizeBytes prometheus.Histogram - queriesDropped prometheus.Counter - queriesLimit prometheus.Gauge + blocksLoaded prometheus.Gauge + blockLoads prometheus.Counter + blockLoadFailures prometheus.Counter + blockDrops prometheus.Counter + blockDropFailures prometheus.Counter + seriesDataTouched *prometheus.SummaryVec + seriesDataFetched *prometheus.SummaryVec + seriesDataSizeTouched *prometheus.SummaryVec + seriesDataSizeFetched *prometheus.SummaryVec + seriesBlocksQueried prometheus.Summary + seriesGetAllDuration prometheus.Histogram + seriesMergeDuration prometheus.Histogram + seriesRefetches prometheus.Counter + resultSeriesCount prometheus.Summary + chunkSizeBytes prometheus.Histogram + queriesDropped prometheus.Counter + queriesLimit prometheus.Gauge + + cachedPostingsCompressions *prometheus.CounterVec + cachedPostingsCompressionErrors *prometheus.CounterVec + cachedPostingsCompressionTimeSeconds *prometheus.CounterVec + cachedPostingsOriginalSizeBytes prometheus.Counter + cachedPostingsCompressedSizeBytes prometheus.Counter + + // not part of bucketStoreMetrics, but injected by ConsistencyDelayMetaFilter metaSyncConsistencyDelay prometheus.Gauge } func newBucketStoreMetrics(reg prometheus.Registerer) *bucketStoreMetrics { var m bucketStoreMetrics - m.blockLoads = prometheus.NewCounter(prometheus.CounterOpts{ + m.blockLoads = promauto.With(reg).NewCounter(prometheus.CounterOpts{ Name: "thanos_bucket_store_block_loads_total", Help: "Total number of remote block loading attempts.", }) - m.blockLoadFailures = prometheus.NewCounter(prometheus.CounterOpts{ + m.blockLoadFailures = promauto.With(reg).NewCounter(prometheus.CounterOpts{ Name: "thanos_bucket_store_block_load_failures_total", Help: "Total number of failed remote block loading attempts.", }) - m.blockDrops = prometheus.NewCounter(prometheus.CounterOpts{ + m.blockDrops = promauto.With(reg).NewCounter(prometheus.CounterOpts{ Name: "thanos_bucket_store_block_drops_total", Help: "Total number of local blocks that were dropped.", }) - m.blockDropFailures = prometheus.NewCounter(prometheus.CounterOpts{ + m.blockDropFailures = promauto.With(reg).NewCounter(prometheus.CounterOpts{ Name: "thanos_bucket_store_block_drop_failures_total", Help: "Total number of local blocks that failed to be dropped.", }) - m.blocksLoaded = prometheus.NewGauge(prometheus.GaugeOpts{ + m.blocksLoaded = promauto.With(reg).NewGauge(prometheus.GaugeOpts{ Name: "thanos_bucket_store_blocks_loaded", Help: "Number of currently loaded blocks.", }) - m.seriesDataTouched = prometheus.NewSummaryVec(prometheus.SummaryOpts{ + m.seriesDataTouched = promauto.With(reg).NewSummaryVec(prometheus.SummaryOpts{ Name: "thanos_bucket_store_series_data_touched", Help: "How many items of a data type in a block were touched for a single series request.", }, []string{"data_type"}) - m.seriesDataFetched = prometheus.NewSummaryVec(prometheus.SummaryOpts{ + m.seriesDataFetched = promauto.With(reg).NewSummaryVec(prometheus.SummaryOpts{ Name: "thanos_bucket_store_series_data_fetched", Help: "How many items of a data type in a block were fetched for a single series request.", }, []string{"data_type"}) - m.seriesDataSizeTouched = prometheus.NewSummaryVec(prometheus.SummaryOpts{ + m.seriesDataSizeTouched = promauto.With(reg).NewSummaryVec(prometheus.SummaryOpts{ Name: "thanos_bucket_store_series_data_size_touched_bytes", Help: "Size of all items of a data type in a block were touched for a single series request.", }, []string{"data_type"}) - m.seriesDataSizeFetched = prometheus.NewSummaryVec(prometheus.SummaryOpts{ + m.seriesDataSizeFetched = promauto.With(reg).NewSummaryVec(prometheus.SummaryOpts{ Name: "thanos_bucket_store_series_data_size_fetched_bytes", Help: "Size of all items of a data type in a block were fetched for a single series request.", }, []string{"data_type"}) - m.seriesBlocksQueried = prometheus.NewSummary(prometheus.SummaryOpts{ + m.seriesBlocksQueried = promauto.With(reg).NewSummary(prometheus.SummaryOpts{ Name: "thanos_bucket_store_series_blocks_queried", Help: "Number of blocks in a bucket store that were touched to satisfy a query.", }) - m.seriesGetAllDuration = prometheus.NewHistogram(prometheus.HistogramOpts{ + m.seriesGetAllDuration = promauto.With(reg).NewHistogram(prometheus.HistogramOpts{ Name: "thanos_bucket_store_series_get_all_duration_seconds", Help: "Time it takes until all per-block prepares and preloads for a query are finished.", Buckets: []float64{0.001, 0.01, 0.1, 0.3, 0.6, 1, 3, 6, 9, 20, 30, 60, 90, 120}, }) - m.seriesMergeDuration = prometheus.NewHistogram(prometheus.HistogramOpts{ + m.seriesMergeDuration = promauto.With(reg).NewHistogram(prometheus.HistogramOpts{ Name: "thanos_bucket_store_series_merge_duration_seconds", Help: "Time it takes to merge sub-results from all queried blocks into a single result.", Buckets: []float64{0.001, 0.01, 0.1, 0.3, 0.6, 1, 3, 6, 9, 20, 30, 60, 90, 120}, }) - m.seriesRefetches = prometheus.NewCounter(prometheus.CounterOpts{ - Name: "thanos_bucket_store_series_refetches_total", - Help: "Total number of cases where the built-in max series size was not enough to fetch series from index, resulting in refetch.", - }) - m.resultSeriesCount = prometheus.NewSummary(prometheus.SummaryOpts{ + m.resultSeriesCount = promauto.With(reg).NewSummary(prometheus.SummaryOpts{ Name: "thanos_bucket_store_series_result_series", Help: "Number of series observed in the final result of a query.", }) - m.chunkSizeBytes = prometheus.NewHistogram(prometheus.HistogramOpts{ + m.chunkSizeBytes = promauto.With(reg).NewHistogram(prometheus.HistogramOpts{ Name: "thanos_bucket_store_sent_chunk_size_bytes", Help: "Size in bytes of the chunks for the single series, which is adequate to the gRPC message size sent to querier.", Buckets: []float64{ @@ -334,41 +374,44 @@ func newBucketStoreMetrics(reg prometheus.Registerer) *bucketStoreMetrics { }, }) - m.queriesDropped = prometheus.NewCounter(prometheus.CounterOpts{ + m.queriesDropped = promauto.With(reg).NewCounter(prometheus.CounterOpts{ Name: "thanos_bucket_store_queries_dropped_total", Help: "Number of queries that were dropped due to the sample limit.", }) - m.queriesLimit = prometheus.NewGauge(prometheus.GaugeOpts{ + m.queriesLimit = promauto.With(reg).NewGauge(prometheus.GaugeOpts{ Name: "thanos_bucket_store_queries_concurrent_max", Help: "Number of maximum concurrent queries.", }) + m.seriesRefetches = promauto.With(reg).NewCounter(prometheus.CounterOpts{ + Name: "thanos_bucket_store_series_refetches_total", + Help: fmt.Sprintf("Total number of cases where %v bytes was not enough was to fetch series from index, resulting in refetch.", 64*1024), + }) - m.metaSyncConsistencyDelay = prometheus.NewGauge(prometheus.GaugeOpts{ + m.cachedPostingsCompressions = promauto.With(reg).NewCounterVec(prometheus.CounterOpts{ + Name: "thanos_bucket_store_cached_postings_compressions_total", + Help: "Number of postings compressions before storing to index cache.", + }, []string{"op"}) + m.cachedPostingsCompressionErrors = promauto.With(reg).NewCounterVec(prometheus.CounterOpts{ + Name: "thanos_bucket_store_cached_postings_compression_errors_total", + Help: "Number of postings compression errors.", + }, []string{"op"}) + m.cachedPostingsCompressionTimeSeconds = promauto.With(reg).NewCounterVec(prometheus.CounterOpts{ + Name: "thanos_bucket_store_cached_postings_compression_time_seconds", + Help: "Time spent compressing postings before storing them into postings cache.", + }, []string{"op"}) + m.cachedPostingsOriginalSizeBytes = promauto.With(reg).NewCounter(prometheus.CounterOpts{ + Name: "thanos_bucket_store_cached_postings_original_size_bytes_total", + Help: "Original size of postings stored into cache.", + }) + m.cachedPostingsCompressedSizeBytes = promauto.With(reg).NewCounter(prometheus.CounterOpts{ + Name: "thanos_bucket_store_cached_postings_compressed_size_bytes_total", + Help: "Compressed size of postings stored into cache.", + }) + + m.metaSyncConsistencyDelay = promauto.With(reg).NewGauge(prometheus.GaugeOpts{ Name: "consistency_delay_seconds", Help: "Configured consistency delay in seconds.", }) - if reg != nil { - reg.MustRegister( - m.blockLoads, - m.blockLoadFailures, - m.blockDrops, - m.blockDropFailures, - m.blocksLoaded, - m.seriesDataTouched, - m.seriesDataFetched, - m.seriesDataSizeTouched, - m.seriesDataSizeFetched, - m.seriesBlocksQueried, - m.seriesGetAllDuration, - m.seriesMergeDuration, - m.seriesRefetches, - m.resultSeriesCount, - m.chunkSizeBytes, - m.queriesDropped, - m.queriesLimit, - m.metaSyncConsistencyDelay, - ) - } return &m } From 401a8a048f9b665ad85ae8da579fd41d98c4f014 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20S=CC=8Ctibrany=CC=81?= Date: Mon, 30 Mar 2020 14:14:50 +0200 Subject: [PATCH 05/12] Lint MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Peter Štibraný --- pkg/compactor/compactor_test.go | 2 +- pkg/storage/tsdb/bucket_client_mock.go | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/pkg/compactor/compactor_test.go b/pkg/compactor/compactor_test.go index 80926e529d..12dad6dbe9 100644 --- a/pkg/compactor/compactor_test.go +++ b/pkg/compactor/compactor_test.go @@ -737,7 +737,7 @@ func mockBlockMetaJSON(id string) string { return string(content) } -func mockDeletionMarkJson(id string, deletionTime time.Time) string { +func mockDeletionMarkJSON(id string, deletionTime time.Time) string { meta := metadata.DeletionMark{ Version: metadata.DeletionMarkVersion1, ID: ulid.MustParse(id), diff --git a/pkg/storage/tsdb/bucket_client_mock.go b/pkg/storage/tsdb/bucket_client_mock.go index ed25ca2828..4a52086f6b 100644 --- a/pkg/storage/tsdb/bucket_client_mock.go +++ b/pkg/storage/tsdb/bucket_client_mock.go @@ -59,9 +59,8 @@ func (m *BucketClientMock) Get(ctx context.Context, name string) (io.ReadCloser, val, err := args.Get(0), args.Error(1) if val == nil { return nil, err - } else { - return val.(io.ReadCloser), err } + return val.(io.ReadCloser), err } // MockGet is a convenient method to mock Get() and Exists() From 739ee7eb7d3e1a6c085765bd1cae613e739e179c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20S=CC=8Ctibrany=CC=81?= Date: Mon, 30 Mar 2020 14:21:00 +0200 Subject: [PATCH 06/12] Lint MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Peter Štibraný --- pkg/compactor/compactor_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/compactor/compactor_test.go b/pkg/compactor/compactor_test.go index 12dad6dbe9..72ac973679 100644 --- a/pkg/compactor/compactor_test.go +++ b/pkg/compactor/compactor_test.go @@ -393,10 +393,10 @@ func TestCompactor_ShouldNotCompactBlocksMarkedForDeletion(t *testing.T) { bucketClient.MockIter("user-1/", []string{"user-1/01DTVP434PA9VFXSW2JKB3392D", "user-1/01DTW0ZCPDDNV4BV83Q2SV4QAZ"}, nil) bucketClient.MockGet("user-1/01DTVP434PA9VFXSW2JKB3392D/meta.json", mockBlockMetaJSON("01DTVP434PA9VFXSW2JKB3392D"), nil) - bucketClient.MockGet("user-1/01DTVP434PA9VFXSW2JKB3392D/deletion-mark.json", mockDeletionMarkJson("01DTVP434PA9VFXSW2JKB3392D", time.Now()), nil) + bucketClient.MockGet("user-1/01DTVP434PA9VFXSW2JKB3392D/deletion-mark.json", mockDeletionMarkJSON("01DTVP434PA9VFXSW2JKB3392D", time.Now()), nil) bucketClient.MockGet("user-1/01DTW0ZCPDDNV4BV83Q2SV4QAZ/meta.json", mockBlockMetaJSON("01DTW0ZCPDDNV4BV83Q2SV4QAZ"), nil) - bucketClient.MockGet("user-1/01DTW0ZCPDDNV4BV83Q2SV4QAZ/deletion-mark.json", mockDeletionMarkJson("01DTW0ZCPDDNV4BV83Q2SV4QAZ", time.Now().Add(-cfg.DeletionDelay)), nil) + bucketClient.MockGet("user-1/01DTW0ZCPDDNV4BV83Q2SV4QAZ/deletion-mark.json", mockDeletionMarkJSON("01DTW0ZCPDDNV4BV83Q2SV4QAZ", time.Now().Add(-cfg.DeletionDelay)), nil) bucketClient.MockIter("user-1/01DTW0ZCPDDNV4BV83Q2SV4QAZ", []string{"user-1/01DTW0ZCPDDNV4BV83Q2SV4QAZ/meta.json", "user-1/01DTW0ZCPDDNV4BV83Q2SV4QAZ/deletion-mark.json"}, nil) bucketClient.MockDelete("user-1/01DTW0ZCPDDNV4BV83Q2SV4QAZ/meta.json", nil) bucketClient.MockDelete("user-1/01DTW0ZCPDDNV4BV83Q2SV4QAZ/deletion-mark.json", nil) From 058249f9dc39e68caa44aa48e7e7b40c8dd0e833 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20S=CC=8Ctibrany=CC=81?= Date: Mon, 30 Mar 2020 14:41:34 +0200 Subject: [PATCH 07/12] CHANGELOG.md, documentation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Peter Štibraný --- CHANGELOG.md | 4 +++ docs/configuration/config-file-reference.md | 31 ++++++++++++++++++++ docs/operations/blocks-storage.md | 32 +++++++++++++++++++++ pkg/storage/tsdb/config.go | 1 + pkg/storage/tsdb/index_cache.go | 2 +- 5 files changed, 69 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9af8e1eba7..0ad5cb76b2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -64,6 +64,10 @@ - `-.memcached.consistent-hash`: Old default: false, new default: true. This allows for better cache hits when the memcaches are scaled up and down. - `-querier.batch-iterators`: Old default: false, new default: true. - `-querier.ingester-streaming`: Old default: false, new default: true. +* [CHANGE] Experimental TSDB: Added `-experimental.tsdb.bucket-store.postings-cache-compression-enabled` to enable postings compression when storing to cache. #2335 +* [CHANGE] Experimental TSDB: Added `-compactor.deletion-delay`, which is time before a block marked for deletion is deleted from bucket. If not 0, blocks will be marked for deletion and compactor component will delete blocks marked for deletion from the bucket. If delete-delay is 0, blocks will be deleted straight away. Note that deleting blocks immediately can cause query failures, if store gateway / querier still has the block loaded, or compactor is ignoring the deletion because it's compacting the block at the same time. Default value is 48h. #2335 +* [CHANGE] Experimental TSDB: Added `-experimental.tsdb.bucket-store.ignore-deletion-marks-delay`, to set duration after which the blocks marked for deletion will be filtered out while fetching blocks used for querying. This option allows querier to ignore blocks that are marked for deletion with some delay. This ensures store can still serve blocks that are meant to be deleted but do not have a replacement yet. Default is 24h, half of the default value for `-compactor.deletion-delay`. #2335 +* [CHANGE] Experimental TSDB: Added `-experimental.tsdb.bucket-store.index-cache.memcached.max-item-size` to control maximum size of item that is stored to memcached. Defaults to 1 MiB. #2335 * [FEATURE] Added experimental storage API to the ruler service that is enabled when the `-experimental.ruler.enable-api` is set to true #2269 * `-ruler.storage.type` flag now allows `s3`,`gcs`, and `azure` values * `-ruler.storage.(s3|gcs|azure)` flags exist to allow the configuration of object clients set for rule storage diff --git a/docs/configuration/config-file-reference.md b/docs/configuration/config-file-reference.md index f37d6d4f49..1a3ef7a9db 100644 --- a/docs/configuration/config-file-reference.md +++ b/docs/configuration/config-file-reference.md @@ -2399,6 +2399,10 @@ bucket_store: # CLI flag: -experimental.tsdb.bucket-store.binary-index-header-enabled [binary_index_header_enabled: | default = true] + # Compress postings when storing to cache. + # CLI flag: -experimental.tsdb.bucket-store.postings-cache-compression-enabled + [postings_compression_enabled: | default = false] + # Minimum age of a block before it's being read. Set it to safe value (e.g # 30m) if your object storage is eventually consistent. GCS and S3 are # (roughly) strongly consistent. @@ -2453,6 +2457,24 @@ bucket_store: # CLI flag: -experimental.tsdb.bucket-store.index-cache.memcached.max-get-multi-batch-size [max_get_multi_batch_size: | default = 0] + # The maximum size of an item stored in memcached. Bigger items are not + # stored. If set to 0, no maximum size is enforced. + # CLI flag: -experimental.tsdb.bucket-store.index-cache.memcached.max-item-size + [max_item_size: | default = 1048576] + + # Compress postings before storing them to postings cache. + # CLI flag: -postings-compression-enabled + [postings_compression_enabled: | default = false] + + # Duration after which the blocks marked for deletion will be filtered out + # while fetching blocks. The idea of ignore-deletion-marks-delay is to ignore + # blocks that are marked for deletion with some delay. This ensures store can + # still serve blocks that are meant to be deleted but do not have a + # replacement yet.Default is 24h, half of the default value for + # -compactor.deletion-delay. + # CLI flag: -experimental.tsdb.bucket-store.ignore-deletion-marks-delay + [ignore_deletion_mark_delay: | default = 24h0m0s] + # How frequently does Cortex try to compact TSDB head. Block is only created if # data covers smallest block range. Must be greater than 0 and max 5 minutes. # CLI flag: -experimental.tsdb.head-compaction-interval @@ -2571,6 +2593,15 @@ The `compactor_config` configures the compactor for the experimental blocks stor # CLI flag: -compactor.compaction-retries [compaction_retries: | default = 3] +# Time before a block marked for deletion is deleted from bucket. If not 0, +# blocks will be marked for deletion and compactor component will delete blocks +# marked for deletion from the bucket. If delete-delay is 0, blocks will be +# deleted straight away. Note that deleting blocks immediately can cause query +# failures, if store gateway still has the block loaded, or compactor is +# ignoring the deletion because it's compacting the block at the same time. +# CLI flag: -compactor.deletion-delay +[deletion_delay: | default = 48h0m0s] + # Shard tenants across multiple compactor instances. Sharding is required if you # run multiple compactor instances, in order to coordinate compactions and avoid # race conditions leading to the same tenant blocks simultaneously compacted by diff --git a/docs/operations/blocks-storage.md b/docs/operations/blocks-storage.md index 9a0a8b2976..8d425f89b2 100644 --- a/docs/operations/blocks-storage.md +++ b/docs/operations/blocks-storage.md @@ -198,6 +198,10 @@ tsdb: # CLI flag: -experimental.tsdb.bucket-store.binary-index-header-enabled [binary_index_header_enabled: | default = true] + # Compress postings when storing to cache. + # CLI flag: -experimental.tsdb.bucket-store.postings-cache-compression-enabled + [postings_compression_enabled: | default = false] + # Minimum age of a block before it's being read. Set it to safe value (e.g # 30m) if your object storage is eventually consistent. GCS and S3 are # (roughly) strongly consistent. @@ -252,6 +256,24 @@ tsdb: # CLI flag: -experimental.tsdb.bucket-store.index-cache.memcached.max-get-multi-batch-size [max_get_multi_batch_size: | default = 0] + # The maximum size of an item stored in memcached. Bigger items are not + # stored. If set to 0, no maximum size is enforced. + # CLI flag: -experimental.tsdb.bucket-store.index-cache.memcached.max-item-size + [max_item_size: | default = 1048576] + + # Compress postings before storing them to postings cache. + # CLI flag: -postings-compression-enabled + [postings_compression_enabled: | default = false] + + # Duration after which the blocks marked for deletion will be filtered out + # while fetching blocks. The idea of ignore-deletion-marks-delay is to + # ignore blocks that are marked for deletion with some delay. This ensures + # store can still serve blocks that are meant to be deleted but do not have + # a replacement yet.Default is 24h, half of the default value for + # -compactor.deletion-delay. + # CLI flag: -experimental.tsdb.bucket-store.ignore-deletion-marks-delay + [ignore_deletion_mark_delay: | default = 24h0m0s] + # How frequently does Cortex try to compact TSDB head. Block is only created # if data covers smallest block range. Must be greater than 0 and max 5 # minutes. @@ -372,6 +394,16 @@ compactor: # CLI flag: -compactor.compaction-retries [compaction_retries: | default = 3] + # Time before a block marked for deletion is deleted from bucket. If not 0, + # blocks will be marked for deletion and compactor component will delete + # blocks marked for deletion from the bucket. If delete-delay is 0, blocks + # will be deleted straight away. Note that deleting blocks immediately can + # cause query failures, if store gateway still has the block loaded, or + # compactor is ignoring the deletion because it's compacting the block at the + # same time. + # CLI flag: -compactor.deletion-delay + [deletion_delay: | default = 48h0m0s] + # Shard tenants across multiple compactor instances. Sharding is required if # you run multiple compactor instances, in order to coordinate compactions and # avoid race conditions leading to the same tenant blocks simultaneously diff --git a/pkg/storage/tsdb/config.go b/pkg/storage/tsdb/config.go index b5410ed65c..05bd4711b4 100644 --- a/pkg/storage/tsdb/config.go +++ b/pkg/storage/tsdb/config.go @@ -184,6 +184,7 @@ func (cfg *BucketStoreConfig) RegisterFlags(f *flag.FlagSet) { f.IntVar(&cfg.BlockSyncConcurrency, "experimental.tsdb.bucket-store.block-sync-concurrency", 20, "Maximum number of concurrent blocks synching per tenant.") f.IntVar(&cfg.MetaSyncConcurrency, "experimental.tsdb.bucket-store.meta-sync-concurrency", 20, "Number of Go routines to use when syncing block meta files from object storage per tenant.") f.BoolVar(&cfg.BinaryIndexHeader, "experimental.tsdb.bucket-store.binary-index-header-enabled", true, "Whether the bucket store should use the binary index header. If false, it uses the JSON index header.") + f.BoolVar(&cfg.PostingsCompressions, "experimental.tsdb.bucket-store.postings-cache-compression-enabled", false, "Compress postings when storing to cache.") f.DurationVar(&cfg.ConsistencyDelay, "experimental.tsdb.bucket-store.consistency-delay", 0, "Minimum age of a block before it's being read. Set it to safe value (e.g 30m) if your object storage is eventually consistent. GCS and S3 are (roughly) strongly consistent.") f.DurationVar(&cfg.IgnoreDeletionMarksDelay, "experimental.tsdb.bucket-store.ignore-deletion-marks-delay", time.Hour*24, "Duration after which the blocks marked for deletion will be filtered out while fetching blocks. "+ "The idea of ignore-deletion-marks-delay is to ignore blocks that are marked for deletion with some delay. This ensures store can still serve blocks that are meant to be deleted but do not have a replacement yet."+ diff --git a/pkg/storage/tsdb/index_cache.go b/pkg/storage/tsdb/index_cache.go index 5559c663fb..f9d5ea23bd 100644 --- a/pkg/storage/tsdb/index_cache.go +++ b/pkg/storage/tsdb/index_cache.go @@ -98,7 +98,7 @@ func (cfg *MemcachedIndexCacheConfig) RegisterFlagsWithPrefix(f *flag.FlagSet, p f.IntVar(&cfg.MaxAsyncBufferSize, prefix+"max-async-buffer-size", 10000, "The maximum number of enqueued asynchronous operations allowed.") f.IntVar(&cfg.MaxGetMultiConcurrency, prefix+"max-get-multi-concurrency", 100, "The maximum number of concurrent connections running get operations. If set to 0, concurrency is unlimited.") f.IntVar(&cfg.MaxGetMultiBatchSize, prefix+"max-get-multi-batch-size", 0, "The maximum number of keys a single underlying get operation should run. If more keys are specified, internally keys are splitted into multiple batches and fetched concurrently, honoring the max concurrency. If set to 0, the max batch size is unlimited.") - f.IntVar(&cfg.MaxItemSize, prefix+"max-item-size", 1000000, "The maximum size of an item stored in memcached. Bigger items are not stored. If set to 0, no maximum size is enforced.") + f.IntVar(&cfg.MaxItemSize, prefix+"max-item-size", 1024*1024, "The maximum size of an item stored in memcached. Bigger items are not stored. If set to 0, no maximum size is enforced.") } func (cfg *MemcachedIndexCacheConfig) GetAddresses() []string { From 5f53f24c77a38ba67c4db6371fc18ae2c036bc3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20S=CC=8Ctibrany=CC=81?= Date: Mon, 30 Mar 2020 14:59:25 +0200 Subject: [PATCH 08/12] Added prefix. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Peter Štibraný --- pkg/storage/tsdb/index_cache.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/storage/tsdb/index_cache.go b/pkg/storage/tsdb/index_cache.go index f9d5ea23bd..20fbd6d13f 100644 --- a/pkg/storage/tsdb/index_cache.go +++ b/pkg/storage/tsdb/index_cache.go @@ -50,7 +50,7 @@ func (cfg *IndexCacheConfig) RegisterFlags(f *flag.FlagSet) { func (cfg *IndexCacheConfig) RegisterFlagsWithPrefix(f *flag.FlagSet, prefix string) { f.StringVar(&cfg.Backend, prefix+"backend", IndexCacheBackendDefault, fmt.Sprintf("The index cache backend type. Supported values: %s.", strings.Join(supportedIndexCacheBackends, ", "))) - f.BoolVar(&cfg.PostingsCompression, "postings-compression-enabled", false, "Compress postings before storing them to postings cache.") + f.BoolVar(&cfg.PostingsCompression, prefix+"postings-compression-enabled", false, "Compress postings before storing them to postings cache.") cfg.InMemory.RegisterFlagsWithPrefix(f, prefix+"inmemory.") cfg.Memcached.RegisterFlagsWithPrefix(f, prefix+"memcached.") From f781eea74d6d9ac66323a19e7561664058de2d00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20S=CC=8Ctibrany=CC=81?= Date: Mon, 30 Mar 2020 15:34:50 +0200 Subject: [PATCH 09/12] Removed unused option. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Peter Štibraný --- CHANGELOG.md | 2 +- docs/configuration/config-file-reference.md | 6 +----- docs/operations/blocks-storage.md | 6 +----- pkg/storage/tsdb/config.go | 2 -- 4 files changed, 3 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0ad5cb76b2..c3f374a523 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -66,7 +66,7 @@ - `-querier.ingester-streaming`: Old default: false, new default: true. * [CHANGE] Experimental TSDB: Added `-experimental.tsdb.bucket-store.postings-cache-compression-enabled` to enable postings compression when storing to cache. #2335 * [CHANGE] Experimental TSDB: Added `-compactor.deletion-delay`, which is time before a block marked for deletion is deleted from bucket. If not 0, blocks will be marked for deletion and compactor component will delete blocks marked for deletion from the bucket. If delete-delay is 0, blocks will be deleted straight away. Note that deleting blocks immediately can cause query failures, if store gateway / querier still has the block loaded, or compactor is ignoring the deletion because it's compacting the block at the same time. Default value is 48h. #2335 -* [CHANGE] Experimental TSDB: Added `-experimental.tsdb.bucket-store.ignore-deletion-marks-delay`, to set duration after which the blocks marked for deletion will be filtered out while fetching blocks used for querying. This option allows querier to ignore blocks that are marked for deletion with some delay. This ensures store can still serve blocks that are meant to be deleted but do not have a replacement yet. Default is 24h, half of the default value for `-compactor.deletion-delay`. #2335 +* [CHANGE] Experimental TSDB: Added `-experimental.tsdb.bucket-store.index-cache.postings-compression-enabled`, to set duration after which the blocks marked for deletion will be filtered out while fetching blocks used for querying. This option allows querier to ignore blocks that are marked for deletion with some delay. This ensures store can still serve blocks that are meant to be deleted but do not have a replacement yet. Default is 24h, half of the default value for `-compactor.deletion-delay`. #2335 * [CHANGE] Experimental TSDB: Added `-experimental.tsdb.bucket-store.index-cache.memcached.max-item-size` to control maximum size of item that is stored to memcached. Defaults to 1 MiB. #2335 * [FEATURE] Added experimental storage API to the ruler service that is enabled when the `-experimental.ruler.enable-api` is set to true #2269 * `-ruler.storage.type` flag now allows `s3`,`gcs`, and `azure` values diff --git a/docs/configuration/config-file-reference.md b/docs/configuration/config-file-reference.md index 1a3ef7a9db..75133689cf 100644 --- a/docs/configuration/config-file-reference.md +++ b/docs/configuration/config-file-reference.md @@ -2399,10 +2399,6 @@ bucket_store: # CLI flag: -experimental.tsdb.bucket-store.binary-index-header-enabled [binary_index_header_enabled: | default = true] - # Compress postings when storing to cache. - # CLI flag: -experimental.tsdb.bucket-store.postings-cache-compression-enabled - [postings_compression_enabled: | default = false] - # Minimum age of a block before it's being read. Set it to safe value (e.g # 30m) if your object storage is eventually consistent. GCS and S3 are # (roughly) strongly consistent. @@ -2463,7 +2459,7 @@ bucket_store: [max_item_size: | default = 1048576] # Compress postings before storing them to postings cache. - # CLI flag: -postings-compression-enabled + # CLI flag: -experimental.tsdb.bucket-store.index-cache.postings-compression-enabled [postings_compression_enabled: | default = false] # Duration after which the blocks marked for deletion will be filtered out diff --git a/docs/operations/blocks-storage.md b/docs/operations/blocks-storage.md index 8d425f89b2..aefb346a9d 100644 --- a/docs/operations/blocks-storage.md +++ b/docs/operations/blocks-storage.md @@ -198,10 +198,6 @@ tsdb: # CLI flag: -experimental.tsdb.bucket-store.binary-index-header-enabled [binary_index_header_enabled: | default = true] - # Compress postings when storing to cache. - # CLI flag: -experimental.tsdb.bucket-store.postings-cache-compression-enabled - [postings_compression_enabled: | default = false] - # Minimum age of a block before it's being read. Set it to safe value (e.g # 30m) if your object storage is eventually consistent. GCS and S3 are # (roughly) strongly consistent. @@ -262,7 +258,7 @@ tsdb: [max_item_size: | default = 1048576] # Compress postings before storing them to postings cache. - # CLI flag: -postings-compression-enabled + # CLI flag: -experimental.tsdb.bucket-store.index-cache.postings-compression-enabled [postings_compression_enabled: | default = false] # Duration after which the blocks marked for deletion will be filtered out diff --git a/pkg/storage/tsdb/config.go b/pkg/storage/tsdb/config.go index 05bd4711b4..8b90bf393a 100644 --- a/pkg/storage/tsdb/config.go +++ b/pkg/storage/tsdb/config.go @@ -165,7 +165,6 @@ type BucketStoreConfig struct { BlockSyncConcurrency int `yaml:"block_sync_concurrency"` MetaSyncConcurrency int `yaml:"meta_sync_concurrency"` BinaryIndexHeader bool `yaml:"binary_index_header_enabled"` - PostingsCompressions bool `yaml:"postings_compression_enabled"` ConsistencyDelay time.Duration `yaml:"consistency_delay"` IndexCache IndexCacheConfig `yaml:"index_cache"` IgnoreDeletionMarksDelay time.Duration `yaml:"ignore_deletion_mark_delay"` @@ -184,7 +183,6 @@ func (cfg *BucketStoreConfig) RegisterFlags(f *flag.FlagSet) { f.IntVar(&cfg.BlockSyncConcurrency, "experimental.tsdb.bucket-store.block-sync-concurrency", 20, "Maximum number of concurrent blocks synching per tenant.") f.IntVar(&cfg.MetaSyncConcurrency, "experimental.tsdb.bucket-store.meta-sync-concurrency", 20, "Number of Go routines to use when syncing block meta files from object storage per tenant.") f.BoolVar(&cfg.BinaryIndexHeader, "experimental.tsdb.bucket-store.binary-index-header-enabled", true, "Whether the bucket store should use the binary index header. If false, it uses the JSON index header.") - f.BoolVar(&cfg.PostingsCompressions, "experimental.tsdb.bucket-store.postings-cache-compression-enabled", false, "Compress postings when storing to cache.") f.DurationVar(&cfg.ConsistencyDelay, "experimental.tsdb.bucket-store.consistency-delay", 0, "Minimum age of a block before it's being read. Set it to safe value (e.g 30m) if your object storage is eventually consistent. GCS and S3 are (roughly) strongly consistent.") f.DurationVar(&cfg.IgnoreDeletionMarksDelay, "experimental.tsdb.bucket-store.ignore-deletion-marks-delay", time.Hour*24, "Duration after which the blocks marked for deletion will be filtered out while fetching blocks. "+ "The idea of ignore-deletion-marks-delay is to ignore blocks that are marked for deletion with some delay. This ensures store can still serve blocks that are meant to be deleted but do not have a replacement yet."+ From a13293551091793a9615de41fe7572fe82750a86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20S=CC=8Ctibrany=CC=81?= Date: Mon, 30 Mar 2020 17:18:42 +0200 Subject: [PATCH 10/12] Remap thanos_memcached_operation_skipped_total metric. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Peter Štibraný --- pkg/storage/tsdb/index_cache_metrics.go | 7 +++++++ pkg/storage/tsdb/index_cache_metrics_test.go | 15 ++++++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/pkg/storage/tsdb/index_cache_metrics.go b/pkg/storage/tsdb/index_cache_metrics.go index a8120db656..8f5334a552 100644 --- a/pkg/storage/tsdb/index_cache_metrics.go +++ b/pkg/storage/tsdb/index_cache_metrics.go @@ -116,6 +116,7 @@ type MemcachedIndexCacheMetrics struct { memcachedOperations *prometheus.Desc memcachedFailures *prometheus.Desc memcachedDuration *prometheus.Desc + memcachedSkipped *prometheus.Desc } // NewMemcachedIndexCacheMetrics makes MemcachedIndexCacheMetrics. @@ -143,6 +144,10 @@ func NewMemcachedIndexCacheMetrics(reg *prometheus.Registry) *MemcachedIndexCach "cortex_querier_blocks_index_cache_memcached_operation_duration_seconds", "Duration of operations against memcached.", []string{"operation"}, nil), + memcachedSkipped: prometheus.NewDesc( + "cortex_querier_blocks_index_cache_memcached_operation_skipped_total", + "Total number of operations against memcached that have been skipped.", + []string{"operation", "reason"}, nil), } } @@ -152,6 +157,7 @@ func (m *MemcachedIndexCacheMetrics) Describe(out chan<- *prometheus.Desc) { out <- m.memcachedOperations out <- m.memcachedFailures out <- m.memcachedDuration + out <- m.memcachedSkipped } func (m *MemcachedIndexCacheMetrics) Collect(out chan<- prometheus.Metric) { @@ -165,4 +171,5 @@ func (m *MemcachedIndexCacheMetrics) Collect(out chan<- prometheus.Metric) { data.SendSumOfCountersWithLabels(out, m.memcachedOperations, "thanos_memcached_operations_total", "operation") data.SendSumOfCountersWithLabels(out, m.memcachedFailures, "thanos_memcached_operation_failures_total", "operation") data.SendSumOfHistogramsWithLabels(out, m.memcachedDuration, "thanos_memcached_operation_duration_seconds", "operation") + data.SendSumOfCountersWithLabels(out, m.memcachedSkipped, "thanos_memcached_operation_skipped_total", "operation", "reason") } diff --git a/pkg/storage/tsdb/index_cache_metrics_test.go b/pkg/storage/tsdb/index_cache_metrics_test.go index fdde974a08..6ba2b9e823 100644 --- a/pkg/storage/tsdb/index_cache_metrics_test.go +++ b/pkg/storage/tsdb/index_cache_metrics_test.go @@ -221,6 +221,11 @@ func TestMemcachedIndexCacheMetrics(t *testing.T) { cortex_querier_blocks_index_cache_memcached_operation_duration_seconds_bucket{operation="getmulti",le="+Inf"} 1 cortex_querier_blocks_index_cache_memcached_operation_duration_seconds_sum{operation="getmulti"} 0.025 cortex_querier_blocks_index_cache_memcached_operation_duration_seconds_count{operation="getmulti"} 1 + + # HELP cortex_querier_blocks_index_cache_memcached_operation_skipped_total Total number of operations against memcached that have been skipped. + # TYPE cortex_querier_blocks_index_cache_memcached_operation_skipped_total counter + cortex_querier_blocks_index_cache_memcached_operation_skipped_total{operation="getmulti",reason="spoiled"} 10 + cortex_querier_blocks_index_cache_memcached_operation_skipped_total{operation="set",reason="too_big"} 9 `)) require.NoError(t, err) } @@ -230,6 +235,7 @@ type memcachedIndexStoreCacheMetrics struct { hits *prometheus.CounterVec operations *prometheus.CounterVec failures *prometheus.CounterVec + skipped *prometheus.CounterVec duration *prometheus.HistogramVec } @@ -260,6 +266,11 @@ func newMemcachedIndexStoreCacheMetrics(reg prometheus.Registerer) *memcachedInd Help: "Total number of operations against memcached that failed.", }, []string{"operation"}) + c.skipped = prometheus.NewCounterVec(prometheus.CounterOpts{ + Name: "thanos_memcached_operation_skipped_total", + Help: "Total number of operations against memcached that have been skipped.", + }, []string{"operation", "reason"}) + c.duration = prometheus.NewHistogramVec(prometheus.HistogramOpts{ Name: "thanos_memcached_operation_duration_seconds", Help: "Duration of operations against memcached.", @@ -267,7 +278,7 @@ func newMemcachedIndexStoreCacheMetrics(reg prometheus.Registerer) *memcachedInd }, []string{"operation"}) if reg != nil { - reg.MustRegister(c.requests, c.hits, c.operations, c.failures, c.duration) + reg.MustRegister(c.requests, c.hits, c.operations, c.failures, c.skipped, c.duration) } return &c @@ -288,6 +299,8 @@ func populateMemcachedIndexCacheMetrics(base float64) *prometheus.Registry { c.failures.WithLabelValues(cacheOpGetMulti).Add(base * 8) c.duration.WithLabelValues(cacheOpSet).Observe(0.1) c.duration.WithLabelValues(cacheOpGetMulti).Observe(0.025) + c.skipped.WithLabelValues(cacheOpSet, "too_big").Add(base * 9) + c.skipped.WithLabelValues(cacheOpGetMulti, "spoiled").Add(base * 10) return reg } From 780195dcc7f68469af23192d75dcb8818a7109ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20S=CC=8Ctibrany=CC=81?= Date: Mon, 30 Mar 2020 17:25:44 +0200 Subject: [PATCH 11/12] Comment that blocks_meta_modified is ignored. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Peter Štibraný --- pkg/querier/block_store_metrics.go | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/querier/block_store_metrics.go b/pkg/querier/block_store_metrics.go index d942a8fc30..fce2d5969e 100644 --- a/pkg/querier/block_store_metrics.go +++ b/pkg/querier/block_store_metrics.go @@ -43,6 +43,7 @@ type tsdbBucketStoreMetrics struct { // Ignored: // blocks_meta_synced + // blocks_meta_modified } func newTSDBBucketStoreMetrics() *tsdbBucketStoreMetrics { From 7cd48dd44c42497a80804e2088c632947de762fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20S=CC=8Ctibrany=CC=81?= Date: Mon, 30 Mar 2020 22:16:52 +0200 Subject: [PATCH 12/12] Use promauto.With(registerer) to create metrics. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Peter Štibraný --- pkg/compactor/compactor.go | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/pkg/compactor/compactor.go b/pkg/compactor/compactor.go index 48f0bed66d..a2cb7e065a 100644 --- a/pkg/compactor/compactor.go +++ b/pkg/compactor/compactor.go @@ -13,6 +13,7 @@ import ( "github.com/go-kit/kit/log/level" "github.com/pkg/errors" "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promauto" "github.com/prometheus/prometheus/tsdb" "github.com/thanos-io/thanos/pkg/block" "github.com/thanos-io/thanos/pkg/compact" @@ -146,38 +147,33 @@ func newCompactor( syncerMetrics: newSyncerMetrics(registerer), createBucketClientAndTsdbCompactor: createBucketClientAndTsdbCompactor, - compactionRunsStarted: prometheus.NewCounter(prometheus.CounterOpts{ + compactionRunsStarted: promauto.With(registerer).NewCounter(prometheus.CounterOpts{ Name: "cortex_compactor_runs_started_total", Help: "Total number of compaction runs started.", }), - compactionRunsCompleted: prometheus.NewCounter(prometheus.CounterOpts{ + compactionRunsCompleted: promauto.With(registerer).NewCounter(prometheus.CounterOpts{ Name: "cortex_compactor_runs_completed_total", Help: "Total number of compaction runs successfully completed.", }), - compactionRunsFailed: prometheus.NewCounter(prometheus.CounterOpts{ + compactionRunsFailed: promauto.With(registerer).NewCounter(prometheus.CounterOpts{ Name: "cortex_compactor_runs_failed_total", Help: "Total number of compaction runs failed.", }), - blocksCleaned: prometheus.NewCounter(prometheus.CounterOpts{ + blocksCleaned: promauto.With(registerer).NewCounter(prometheus.CounterOpts{ Name: "cortex_compactor_blocks_cleaned_total", Help: "Total number of blocks deleted in compactor.", }), - blockCleanupFailures: prometheus.NewCounter(prometheus.CounterOpts{ + blockCleanupFailures: promauto.With(registerer).NewCounter(prometheus.CounterOpts{ Name: "cortex_compactor_block_cleanup_failures_total", Help: "Failures encountered while deleting blocks in compactor.", }), - blocksMarkedForDeletion: prometheus.NewCounter(prometheus.CounterOpts{ + blocksMarkedForDeletion: promauto.With(registerer).NewCounter(prometheus.CounterOpts{ Name: "cortex_compactor_blocks_marked_for_deletion_total", Help: "Total number of blocks marked for deletion in compactor.", }), } - // Register metrics. - if registerer != nil { - registerer.MustRegister(c.compactionRunsStarted, c.compactionRunsCompleted, c.compactionRunsFailed, c.blocksCleaned, c.blockCleanupFailures, c.blocksMarkedForDeletion) - } - c.Service = services.NewBasicService(c.starting, c.running, c.stopping) return c, nil @@ -334,7 +330,7 @@ func (c *Compactor) compactUser(ctx context.Context, userID string) error { deduplicateBlocksFilter := block.NewDeduplicateFilter() // While fetching blocks, we filter out blocks that were marked for deletion by using IgnoreDeletionMarkFilter. - // The delay of deleteDelay/2 is added to ensure we fetch blocks that are meant to be deleted but do not have a replacement yet. + // The delay of deleteDelay/2 is added to ensure we fetch blocks that are meant to be deleted but do not have a replacement yet. ignoreDeletionMarkFilter := block.NewIgnoreDeletionMarkFilter(ulogger, bucket, time.Duration(c.compactorCfg.DeletionDelay.Seconds()/2)*time.Second) fetcher, err := block.NewMetaFetcher(